本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。
🚀详情:《ROS从入门到精通》
XML 宏语言(XML Macros, Xacro)是可编程的XML文件。在xacro中可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。简言之,xacro为urdf文件提供了封装性,使机器人描述更安全、更精简、更高效。
在使用xacro生成urdf时,根标签robot中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro",例如:
<robot name="left_drive_wheel" xmlns:xacro="http://www.ros.org/wiki/xacro">
xacro主要为xml提供了封装,相较于一般的编程语言更容易上手,具体如下:
xacro属性采用键值对的方式,封装urdf中的一些常量字段,比如: 小车尺寸、轮子半径等,使数据语义更清晰易懂,语法格式如下
<xacro:property name="xxxx" value="yyyy" />
属性调用格式为
${property_name}
数值属性也可参与数学运算
${f(property_name)}
xacro宏类似于函数封装,可以提高代码复用率,优化代码结构,语法格式如下
<xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">
.....
参数调用格式: ${参数名}
xacro:macro>
宏调用格式为
<xacro:宏名称 参数1=xxx 参数2=xxx/>
xacro模块化类似于C++中头文件的含义,提供模块级别的封装。一般机器人由多个组件构成,不同组件就可以封装为单独的xacro文件,最后再将不同的文件集成为完整机器人,语法格式如下
<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename="y1.xacro" />
<xacro:include filename="y2.xacro" />
<xacro:include filename="y3.xacro" />
....
robot>
实现如下图所示的差速轮式移动机器人,它有两个驱动轮和两个主动轮。接下来用xacro文件进行封装。

最终的目录结构如图所示

props文件夹中存放属性配置模块,如颜色、数学常数、几何参数等。
<robot name="config" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="PI" value="3.141"/>
<xacro:property name="base_footprint_radius" value="0.001" />
<xacro:property name="base_link_radius" value="0.1" />
<xacro:property name="base_link_length" value="0.08" />
<xacro:property name="earth_space" value="0.015" />
<xacro:macro name="black">
<material name="black">
<color rgba="0 0 0 1"/>
material>
xacro:macro>
<xacro:macro name="yellow">
<material name="yellow">
<color rgba="1.0 1.0 0.0 1.0" />
material>
xacro:macro>
robot>
<robot name="base" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find xacro_lab)/urdf/props/config.urdf.xacro" />
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="${base_footprint_radius}" />
geometry>
visual>
link>
<link name="base_link">
<visual>
<geometry>
<cylinder radius="${base_link_radius}" length="${base_link_length}" />
geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<xacro:yellow />
visual>
link>
<joint name="base_link2base_footprint" type="fixed">
<parent link="base_footprint" />
<child link="base_link" />
<origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
joint>
robot>
限于篇幅只展示驱动轮
<robot name="add_drive_wheels" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find xacro_lab)/urdf/props/config.urdf.xacro" />
<xacro:property name="wheel_radius" value="0.0325" />
<xacro:property name="wheel_length" value="0.015" />
<xacro:macro name="add_drive_wheels" params="name flag">
<link name="${name}_wheel">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}" />
geometry>
<origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
<xacro:black />
visual>
link>
<joint name="${name}_wheel2base_link" type="continuous">
<parent link="base_link" />
<child link="${name}_wheel" />
<origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
<axis xyz="0 1 0" />
joint>
xacro:macro>
robot>
将所有模块集成起来,非常简洁
<robot name="main" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find xacro_lab)/urdf/base/base.urdf.xacro" />
<xacro:include filename="$(find xacro_lab)/urdf/wheels/add_drive_wheels.urdf.xacro" />
<xacro:include filename="$(find xacro_lab)/urdf/wheels/add_support_wheels.urdf.xacro" />
<xacro:add_drive_wheels name="left" flag="1" />
<xacro:add_drive_wheels name="right" flag="-1" />
<xacro:add_support_wheel name="front" flag="1" />
<xacro:add_support_wheel name="back" flag="-1" />
robot>
🔥 更多精彩专栏: