参考视频:【奥特学园】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>