ROS | xacro模型—阿克曼(Ackermann)四轮小车模型
- 1. 模型描述
- 2. xacro模型与URDF模型的区别
-
- 2.1 URDF模型存在的问题
- 2.2 xacro模型的特点
- 3. xacro优化方法
-
- 3.1 常量定义
- 3.2 常量使用
- 3.3 宏定义
- 3.4 宏调用
- 3.5 文件包含
- 4. 创建xacro文件
- 5. xacro模型显示
-
- 5.1 将xacro文件转化成URDF文件
- 5.2 直接调用xacro文件解析器
- 5.3 启动Rviz
Github链接: https://github.com/chanchanchan97/ROS
1. 模型描述
本项目的目的是创建一个基于阿克曼转向机构(Ackermann steering)的自动驾驶小车模型,该模型在之前URDF模型的基础上修改了前轮转向轴的形状与位置,修改了前端摄像头的位置和尺寸,并且添加了激光雷达和树莓派的简易模型。
2. xacro模型与URDF模型的区别
2.1 URDF模型存在的问题
(1) 模型冗长,重复内容过多;
(2) 参数修改麻烦,不便于二次开发;
(3) 没有参数计算功能。
2.2 xacro模型的特点
(1) 精简模型代码
- 创建宏定义
- 文件包含
(2) 提供可编程接口
- 常量
- 变量
- 数学计算
- 条件语句
3. xacro优化方法
3.1 常量定义
<xacro:property name="M_PI" value="3.14159"/>
定义标签:xacro:property后面跟两个参数属性:
- name所定义的常量名;
- value常量名对应的常量值。
3.2 常量使用
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>
定义标签:
${ }在括号里使用常量,也可以进行数学运算(所有数学运算都会转换成浮点数进行,以保证运算精度)。
3.3 宏定义
<xacro:macro name="cylinder_inertial_matrix" params="m r h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
izz="${m*r*r/2}" />
</inertial>
</xacro:macro>
定义标签:xacro:macro 后面跟两个参数属性:
- name宏定义的名字类似函数名;
- params类似函数参数,也可以是字符串。
3.4 宏调用
<cylinder_inertial_matrix m="1" r="0.025" h="0.02"/>
定义标签:
首先调用宏定义的名字,然后为参数赋值。
3.5 文件包含
<xacro:include filename="$(find smartcar_description)/urdf/xacro/smartcar_sim.xacro"/>
定义标签:
xacro:include $(find+功能包)=包的具体路径
4. 创建xacro文件
在urdf文件夹下创建一个新的文件夹xacro,并且在xacro文件夹中创建一个.xacro文件。
5. xacro模型显示
5.1 将xacro文件转化成URDF文件
在xacro文件夹中打开一个新的终端,输入以下指令:
$ rosrun xacro xacro.py smartcar.xacro > smartcar.urdf
此时xacro文件夹下会生成一个.urdf文件。

5.2 直接调用xacro文件解析器
这种方法更为常见,在launch文件中加入如下代码,从而实现.xacro文件的转换。
<arg name="urdf_file" default="$(find xacro)/xacro --inorder '$(find smartcar_description)/urdf/xacro/smartcar.xacro'" />
<param name="robot_description" command="$(arg urdf_file)" />
5.3 启动Rviz
打开一个新的终端,输入以下指令,启动Rviz,查看所创建的模型。
$ roslaunch smartcar_description smartcar_rviz.launch