今天的主题是:给机器人赋予“物理肉体”

在 Rviz 里,你的机器人只是个“全息投影”,好看但不能打。

为了让它能进 Gazebo(那个有重力、有碰撞的真实世界),我们必须给它加上两样东西:

  1. 碰撞体积 (Collision):穿上“防弹衣”,让它能撞到东西,而不是穿墙而过。

  2. 惯性矩阵 (Inertial):告诉电脑它有多重 (Mass) 以及重心在哪。


第一步:准备“数学公式” (Inertial Macros)

(日常提醒要在存放Linux的地盘(cd ~/ros2_ws))

给机器人算惯性矩阵是很痛苦的

作为懒人工程师,我们当然要用 Xacro 宏 来自动算!

请打开你的 Xacro 文件:

Bash

nano src/my_robot_description/urdf/my_robot.urdf.xacro

操作任务:

请把下面这段“万能公式”复制粘贴到 变量定义 (property) 的下面,但在 base_link 的上面。

(这段代码定义了球体、方块、圆柱体的惯性计算公式,以后直接调用就行)

XML

    <xacro:macro name="inertial_sphere" params="mass radius">
        <inertial>
            <mass value="${mass}"/>
            <inertia ixx="${(2/5) * mass * (radius*radius)}" ixy="0.0" ixz="0.0"
                     iyy="${(2/5) * mass * (radius*radius)}" iyz="0.0"
                     izz="${(2/5) * mass * (radius*radius)}"/>
        </inertial>
    </xacro:macro>

    <xacro:macro name="inertial_box" params="mass x y z">
        <inertial>
            <mass value="${mass}"/>
            <inertia ixx="${(1/12) * mass * (y*y+z*z)}" ixy="0.0" ixz="0.0"
                     iyy="${(1/12) * mass * (x*x+z*z)}" iyz="0.0"
                     izz="${(1/12) * mass * (x*x+y*y)}"/>
        </inertial>
    </xacro:macro>

    <xacro:macro name="inertial_cylinder" params="mass length radius">
        <inertial>
            <mass value="${mass}"/>
            <inertia ixx="${(1/12) * mass * (3*radius*radius + length*length)}" ixy="0.0" ixz="0.0"
                     iyy="${(1/12) * mass * (3*radius*radius + length*length)}" iyz="0.0"
                     izz="${(1/2) * mass * (radius*radius)}"/>
        </inertial>
    </xacro:macro>
    ```

粘贴好后,保存退出,确保没有报错。

---

### 第二步:改造身体 (`base_link`)

现在我们要给蓝色的车身加上“防弹衣”和“体重”。

再次打开文件,找到 `<link name="base_link">` 部分。

你需要做两件事:
1.  **加 Collision (防弹衣)**:通常形状和 Visual (外观) 一样。
2.  **加 Inertial (体重)**:调用刚才写的宏。

**请把你的 `base_link` 修改成下面这样(注意看新增的部分):**

```xml
    <link name="base_link">
        <visual>
            <geometry>
                <box size="${base_length} ${base_width} ${base_height}"/>
            </geometry>
            <material name="blue">
                <color rgba="0 0 1 1"/>
            </material>
        </visual>
        
        <collision>
            <geometry>
                <box size="${base_length} ${base_width} ${base_height}"/>
            </geometry>
        </collision>

        <xacro:inertial_box mass="1.0" x="${base_length}" y="${base_width}" z="${base_height}"/>
    </link>

第三步:改造轮子 (setup_wheel 宏)

轮子也要有物理属性,不然它支撑不住车身。

找到你的 setup_wheel 宏定义,在 <link name="${prefix}_wheel_link"> 里面修改。

修改后的宏应该是这样的:

XML

    <xacro:macro name="setup_wheel" params="prefix y_reflect">
        <xacro:property name="z_offset" value="-0.05"/>
        <link name="${prefix}_wheel_link">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
                </geometry>
                <material name="grey">
                    <color rgba="0.5 0.5 0.5 1"/>
                </material>
            </visual>

            <collision>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
                </geometry>
            </collision>

            <xacro:inertial_cylinder mass="0.1" length="${wheel_length}" radius="${wheel_radius}"/>
        </link>

        <joint name="base_to_${prefix}_wheel" type="continuous">
           ... (保持原样) ...
        </joint>
    </xacro:macro>

第四步:改造万向轮 (caster_wheel_link)

最后是那个小白球。

找到 caster_wheel_link,修改如下:

XML

    <link name="caster_wheel_link">
        <visual>
            <geometry>
                <sphere radius="0.05"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>

        <collision>
            <geometry>
                <sphere radius="0.05"/>
            </geometry>
        </collision>

        <xacro:inertial_sphere mass="0.1" radius="0.05"/>
    </link>

🧪 阶段性检查

改了这么多地方,一定要检查一下语法有没有写错(比如标签没闭合)。

  1. 翻译一下

    Bash
    xacro src/my_robot_description/urdf/my_robot.urdf.xacro > check.urdf
    

    (如果没有报错,说明 Xacro 语法通过!)

  2. 如果报错例如报错在58行:    怎么快速定位第 58 行?

  3. 在 Nano 编辑器里: 1. 按 **`Ctrl + _`** (有的键盘是 `Ctrl + Shift + -`,就是下划线那个键)。 2. 屏幕下方会提示 `Enter line number, column number:`。 3. 输入 **`58`** 然后回车。 4. 光标会直接跳到报错的地方。**看看光标上面是不是少了一个结束标签 `</...>`?**

  4. 看一眼 Rviz(确保外观没变):

    Bash
    ros2 launch urdf_tutorial display.launch.py model:=$(pwd)/check.urdf
    

    (这一步 Rviz 里看起来应该完全没有变化。如果你能在 Rviz 里看到 "Collision Enabled" 的选项勾选上后出现了半透明的外壳,那就更好了,不过通常只要车还在就行)

打开Collision Enabled 在 Rviz 左侧的显示面板(Displays)里:

  1. 找到 RobotModel 这一项。

  2. 点击它前面的小三角 把它展开。

  3. 在展开的列表里,找一个叫 Collision Enabled 的复选框。

  4. 打勾

 

 

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐