今天的主题是:给机器人赋予“物理肉体”。
在 Rviz 里,你的机器人只是个“全息投影”,好看但不能打。
为了让它能进 Gazebo(那个有重力、有碰撞的真实世界),我们必须给它加上两样东西:
碰撞体积 (Collision):穿上“防弹衣”,让它能撞到东西,而不是穿墙而过。
惯性矩阵 (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>
🧪 阶段性检查
改了这么多地方,一定要检查一下语法有没有写错(比如标签没闭合)。
翻译一下:
Bash
xacro src/my_robot_description/urdf/my_robot.urdf.xacro > check.urdf
(如果没有报错,说明 Xacro 语法通过!)
如果报错例如报错在58行: 怎么快速定位第 58 行?
在 Nano 编辑器里: 1. 按 **`Ctrl + _`** (有的键盘是 `Ctrl + Shift + -`,就是下划线那个键)。 2. 屏幕下方会提示 `Enter line number, column number:`。 3. 输入 **`58`** 然后回车。 4. 光标会直接跳到报错的地方。**看看光标上面是不是少了一个结束标签 `</…>`?**
看一眼 Rviz(确保外观没变):
Bash
ros2 launch urdf_tutorial display.launch.py model:=$(pwd)/check.urdf
(这一步 Rviz 里看起来应该完全没有变化。如果你能在 Rviz 里看到 "Collision Enabled" 的选项勾选上后出现了半透明的外壳,那就更好了,不过通常只要车还在就行)
打开Collision Enabled 在 Rviz 左侧的显示面板(Displays)里:
找到 RobotModel 这一项。
点击它前面的小三角 ▶ 把它展开。
在展开的列表里,找一个叫 Collision Enabled 的复选框。
打勾 。

网硕互联帮助中心





评论前必须登录!
注册