ROS2与URDF入门教程-使用Xacro简化URDF文件
说明:
- 介绍如何使用Xacro简化URDF文件
步骤:
- 使用Xacro,xacro是一种用于 XML 的宏语言。xacro 程序运行所有宏并输出结果。典型用法如下所示:
xacro model.xacro > model.urdf
- 启动文件中自动生成 urdf
path_to_urdf = get_package_share_path('pr2_description') / 'robots' / 'pr2.urdf.xacro'
robot_state_publisher_node = launch_ros.actions.Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{
'robot_description': ParameterValue(
Command(['xacro ', str(path_to_urdf)]), value_type=str
)
}]
)
- 在 URDF 文件的顶部,您必须指定一个命名空间,以便正确解析文件。例如,这些是有效 xacro 文件的前两行:
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="firefighter">
- R2D2 中的 base_link
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</collision>
</link>
- xacro指定充当常量的属性
<xacro:property name="width" value="0.2" />
<xacro:property name="bodylen" value="0.6" />
<link name="base_link">
<visual>
<geometry>
<cylinder radius="${width}" length="${bodylen}"/>
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<cylinder radius="${width}" length="${bodylen}"/>
</geometry>
</collision>
</link>
这两个值在前两行中指定。它们几乎可以在任何地方(假设有效的 XML)、在任何级别、在使用之前或之后定义。通常他们走在顶端。
我们没有在几何元素中指定实际半径,而是使用美元符号和大括号来表示值。
此代码将生成与上面显示的相同的代码。
然后使用 ${} 构造的内容值替换 ${}。这意味着您可以将其与属性中的其他文本组合
<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />
- 这将产生
<link name=”marvins_leg” />
- 使用四个基本运算(+、-、*、/)、一元减号和括号在 ${} 构造中构建任意复杂的表达式。例子:
<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />
- 一个简单的无用宏
<xacro:macro name="default_origin">
<origin xyz="0 0 0" rpy="0 0 0"/>
</xacro:macro>
<xacro:default_origin />
- 此代码将生成以下内容
<origin rpy="0 0 0" xyz="0 0 0"/>
- 参数化宏。在 R2D2 中使用的简单宏的例子
<xacro:macro name="default_inertial" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0"
iyy="1.0" iyz="0.0"
izz="1.0" />
</inertial>
</xacro:macro>
- 这可以与代码一起使用
<xacro:default_inertial mass="10"/>
- 使用整个块作为参数
<xacro:macro name="blue_shape" params="name *shape">
<link name="${name}">
<visual>
<geometry>
<xacro:insert_block name="shape" />
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<xacro:insert_block name="shape" />
</geometry>
</collision>
</link>
</xacro:macro>
<xacro:blue_shape name="base_link">
<cylinder radius=".42" length=".01" />
</xacro:blue_shape>
- 查看由 xacro 文件生成的模型,请运行与之前教程相同的命令
ros2 launch urdf_tutorial display.launch.py model:=urdf/08-macroed.urdf.xacro
- Leg macro。在不同位置创建多个外观相似的对象。使用宏和一些简单的数学运算来减少必须编写的代码量
<xacro:macro name="leg" params="prefix reflect">
<link name="${prefix}_leg">
<visual>
<geometry>
<box size="${leglen} 0.1 0.2"/>
</geometry>
<origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
<material name="white"/>
</visual>
<collision>
<geometry>
<box size="${leglen} 0.1 0.2"/>
</geometry>
<origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
</collision>
<xacro:default_inertial mass="10"/>
</link>
<joint name="base_to_${prefix}_leg" type="fixed">
<parent link="base_link"/>
<child link="${prefix}_leg"/>
<origin xyz="0 ${reflect*(width+.02)} 0.25" />
</joint>
<!-- A bunch of stuff cut -->
</xacro:macro>
<xacro:leg prefix="right" reflect="1" />
<xacro:leg prefix="left" reflect="-1" />
常见技巧 1:使用名称前缀获得两个名称相似的对象。
常见技巧 2:使用数学计算关节原点。在你改变机器人尺寸的情况下,用一些数学方法改变一个属性来计算关节偏移量会省去很多麻烦。
常见技巧 3:使用反射参数,并将其设置为 1 或 -1。看看我们如何使用反射参数将腿放在身体两侧的 base_to_${prefix}_leg 原点。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号