• 机器人系统仿真(七)——xacro语法详解


    参考视频:【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili

    参考文档:http://www.autolabor.com.cn/book/ROSTutorials/

    xacro 提供了可编程接口,类似于计算机语言,包括变量声明调用、函数声明与调用等语法实现。在使用 xacro 生成 urdf 时,根标签robot中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro"

    1.属性与算数运算

    用于封装 URDF 中的一些字段,比如: PAI 值,小车的尺寸,轮子半径 ....

    属性定义

    <xacro:property name="xxxx" value="yyyy" />

    属性调用

    ${属性名称}

    算数运算

    ${数学表达式}

    例如:新建一个 demo02_field.urdf.xacro ,编写如下代码:

    <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro" >
        <!--1.属性定义-->
        <xacro:property name="PI" value="3.1415927" />
        <xacro:property name="radius" value="0.03" />
    
        <!--2.属性调用-->
        <myUsePropertyXxx name="${PI}" />
        <myUsePropertyXxx name="${radius}" />
        <!--3.算术运算-->
        <myUsePropertyYyy result="${PI / 2}" />
        <myUsePropertyYyy result="${radius * 2}" />
    
        
    
    </robot>

    运行:

    rosrun xacro xacro demo02_field.urdf.xacro 

    输出:

    cys@ubuntu:~/demo05_ws/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo02_field.urdf.xacro 
    <?xml version="1.0" ?>
    <!-- =================================================================================== -->
    <!-- |    This document was autogenerated by xacro from demo02_field.urdf.xacro        | -->
    <!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
    <!-- =================================================================================== -->
    <robot name="mycar">
      <!--2.属性调用-->
      <myUsePropertyXxx name="3.1415927"/>
      <myUsePropertyXxx name="0.03"/>
      <!--3.算术运算-->
      <myUsePropertyYyy result="1.57079635"/>
      <myUsePropertyYyy result="0.06"/>
    </robot>

    2.宏

    类似于函数实现,提高代码复用率,优化代码结构,提高安全性

    宏定义

    <xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">
    
        .....
    
        参数调用格式: ${参数名}
    
    </xacro:macro>

    宏调用

    <xacro:宏名称 参数1=xxx 参数2=xxx/>

    例子:创建求和的宏并调用

    <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro" >
        <!--1.宏的定义-->
        <xacro:macro name="getSum" params="num1 num2">
            <result value="${num1 + num2}" />
        </xacro:macro>
        <!--2.宏调用-->
        <xacro:getSum num1="1" num2="2" />
    </robot>

    输出:

    cys@ubuntu:~/demo05_ws/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo03_macro.urdf.xacro 
    <?xml version="1.0" ?>
    <!-- =================================================================================== -->
    <!-- |    This document was autogenerated by xacro from demo03_macro.urdf.xacro        | -->
    <!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
    <!-- =================================================================================== -->
    <robot name="mycar">
      <result value="3"/>
    </robot>

     

    3.文件包含

    机器人由多部件组成,不同部件可能封装为单独的 xacro 文件,最后再将不同的文件集成,组合为完整机器人,可以使用文件包含实现

    文件包含

    <robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
          <xacro:include filename="my_base.xacro" />
          <xacro:include filename="my_camera.xacro" />
          <xacro:include filename="my_laser.xacro" />
          ....
    </robot>

    例子:包含上述两个例子的xacro

    <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro" >
        <!--1.演示文档包含-->
        <xacro:include filename="demo02_field.urdf.xacro" />
        <xacro:include filename="demo03_macro.urdf.xacro" />
    </robot>
        

    运行输出:

    cys@ubuntu:~/demo05_ws/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo04_sum.urdf.xacro 
    <?xml version="1.0" ?>
    <!-- =================================================================================== -->
    <!-- |    This document was autogenerated by xacro from demo04_sum.urdf.xacro          | -->
    <!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
    <!-- =================================================================================== -->
    <robot name="mycar">
      <!--2.属性调用-->
      <myUsePropertyXxx name="3.1415927"/>
      <myUsePropertyXxx name="0.03"/>
      <!--3.算术运算-->
      <myUsePropertyYyy result="1.57079635"/>
      <myUsePropertyYyy result="0.06"/>
      <result value="3"/>
    </robot>

     
  • 相关阅读:
    [Web] 被遗忘的知识点 XHTML
    [项目实践进阶篇] Android 项目中使用Ant + Groovy能干什么?
    使用Ant,第1部分:将Ant脚本引入Java项目
    [Web] 被遗忘的知识点 JavaScript加载管理最佳实践
    [Web] 被遗忘的知识点 iFrames(HTML)过时了没有?
    Android ProGuard
    stream.js
    GUID(全球唯一标识符)
    解析算术表达式
    LCG(linear congruential generator)伪随机数生成器
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/15044043.html
Copyright © 2020-2023  润新知