连接到 ROS 2


预计完成时间:10 分钟

3.11   Xacro = XML + 宏

Xacro 可以帮助你编写更有组织、更精简的 XML 文件。由于你是使用 XML 在 URDF 中描述机器人,因此 Xacro 能让这些文件更容易维护和复用。

包含文件

例如,描述机器人与 Gazebo 集成的那一大段内容,就可以单独拆到一个文件里。下面来看具体做法。

  • urdf 文件夹中创建一个新的 robot.gazebo 文件。
  • 把原来的 robot.urdf 重命名为 robot.xacro

robot.xacro 中所有的 <gazebo> 标签剪切出来,并粘贴到新的 robot.gazebo 文件中,结构如下:

  复制并粘贴

In [ ]:
<?xml version="1.0"?>
<robot>
    <!-- Paste here -->
</robot>

最后,在机器人描述文件中把这个新文件包含进来。你还需要在 robot 标签中加入新的 Xacro 定义:

  复制并粘贴

In [ ]:
<?xml version="1.0" ?>

<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find robot_description)/urdf/robot.gazebo" />
    
    <!-- Link - chassis -->
    ...
    
</robot>

接下来,在 spawn.launch.py 文件中,把原来的 URDF 文件替换为新的 XACRO 文件。

将下面这几行:

# Load URDF File #
urdf_file = 'robot.urdf'
robot_desc_path = os.path.join(package_directory, "urdf", urdf_file)

替换为以下新内容:

# Load URDF File #
urdf_file = 'robot.xacro'
robot_desc_path = os.path.join(package_directory, "urdf", urdf_file)

这里唯一的变化,就是文件名从 robot.urdf 改成了 robot.xacro

然后还需要在 setup.py 文件中再做一个修改:

把这一行:

(os.path.join('share', package_name, 'urdf'), glob('urdf/*.urdf')),

替换为这一行:

(os.path.join('share', package_name, 'urdf'), glob('urdf/*.*')),

这样一来,urdf 文件夹中的所有文件都会在编译时被复制到 install 目录中。

数学表达式

另一个很有用的功能是使用变量和数学表达式。例如,如果你把底盘质量定义为 10 kg,就可以把它写成一个属性:

  复制并粘贴

In [ ]:
<!-- Link - chassis -->
<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find robot_description)/urdf/robot.gazebo" />

    <!-- Parameters -->
    <xacro:property name="chassis_mass" value="10" />

    <!-- Link - chassis -->
    <link name="link_chassis">
        <inertial>
            <mass value="${chassis_mass}" />

如果你还想复用某个公共值,例如 half_chassis,就可以像下面这样写一个数学表达式:

<mass value="${1/2 * chassis_mass}" />

XACRO 还能做的事情远不止这些。你可以查看官方参考文档:https://wiki.ros.org/xacro

- 练习 3.8.1 -

现在你已经知道如何使用 XACRO 了,请把所有使用 PI 近似值的地方都改成数学表达式。

Xacro 已经把 pi 预先定义为一个全局变量。请把所有的 1.57(或 1.5707)都替换为基于 pi 的表达式。

Xacro 允许你在小数变量中保留任意精度的小数位数。

- 练习 3.8.1 结束 -
- 练习 3.8.1 参考答案 -

在你自己尝试完成练习之前,不要先看答案。完成后再回头查看参考答案,会更方便你对比自己的实现。

如果你在完成练习时遇到问题,可以到论坛寻求支持。

robot.gazebo

robot.xacro

- 练习 3.8.1 参考答案结束 -