机器人系统仿真(七)——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>

 
原文地址:https://www.cnblogs.com/caiyishuai/p/15044043.html