提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
`前文提到的URDF的语法在编写xml文件时存在着代码复用的问题,高度重复的工作给人一种重复造轮子的感觉,为了提高开发的效率,ROS给出了类似与编程的优化方案称之为–Xacro
一、Xacro是什么?
Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。Xacro可以声明变量,可以通过数学运算求解,使用流程控制 控制执行的顺序,还可以通过类似函数的实现,封装固定的逻辑将逻辑中的可变数据以参数的方式传入,提高代码的复用性和安全性。
二、语法详解
1.属性与算数运算
使用xacro生成urdf时,根标签robot
中必须包含命名空间声明xmlns:xacro = "http://wiki.ros.org/xacro"
<robot name = "xxx" xmlns:xacro="http://wiki.ros.org/xacro">
</robot>
<robot name = "xxx" xmlns:xacro="http://wiki.ros.org/xacro">
<!--封装URDF中的一些常量,例如机器人底盘的长宽高,PI值等等,可以理解成键值对-->
<xacro:property name = "名称" value = "值">
<!--属性和运算调用-->
<link name = "my_link">
<visual>
<gemometry>
<!--属性调用-->
<cylinder radius = "${名称}">
<!--或者数学表达式-->
<cylinder radius = "${名称 / 2}">
</geometry>
</visual>
</link>
<!--
1属性调用:${名称}
2算数运算:${数学表达式}
-->
</robot>
2.宏定义
<!--
1:定义格式
<xacro:macro name = "宏名称" params = "参数(多参数之间用空格隔开)">
...
参数调用格式:${}
</xacro:macro>
2:调用格式:
<xacro:宏名称 参数1 = 参数2 = ... />
-->
<robot name = "xxx" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:property name = "wheel_radius" value = "0.02">
<xacro:property name = "wheel_width" value = "0.1">
<xacro:macro name = "plus_wheel" params = "name dir">
<link name = "${name}_wheel">
<visual>
<geometry>
<cylinder radius = "${wheel_radius}" length = "${wheel_width}" />
</geometry>
</visual>
</link>
<!--假设有个底盘“base”-->
<joint name = "${name}_wheel2_base" type = "continous">
<parent link = "base" />
<child link = "${name}_wheel" />
<origin xyz = "0 ${flag} * 1 0" />
<axis xyz = "0 1 0" />
</joint>
</xacro:macro>
<xacro:plus_wheel name = "left" flag = "1" />
<xacro:plus_wheel name = "right" flag = "-1" />
</robot>
3.文件包含
多部件可以封装成不同的xacro文件,最后可以将不同的文件集成,组合成完整的模型。
<robot name = "xxx" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename = "chassis.xacro" />
<xacro:include filename = "camera.xacro" />
<xacro:include filename = "gimbal.xacro" />
<!--上面文件的模型各自已经在对应的.xacro文件里完成-->
</robot>
三、启动
主要有两种启动方式
- 将xacro文件转换成urdf文件
rosrun xacro xacro xxx.xacro
,然后再再整合到laucnh
文件里
<launch>
<param name = "robot_description" textfile = "$(find 功能包名称)/xxx/xxx/xxx.urdf">
</launch>
- 在
launch
文件里直接加载xacro——推荐
<launch>
<param name = "robot_description" command = "${find 功能包名称}/xx/xx/xx.xacro">
</launch>
总结
这是本人学习ROS 过程关于Xacro语法的一点点小总结,有错误欢迎指正。同时详细的可以参考官网ROS中xacro