< >
Home » ROS2与URDF入门教程 » ROS2与URDF入门教程-使用Xacro简化URDF文件

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 原点。

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与urdf入门教程