第2章 机器人连杆(link)定义
link标签详解 · 惯性参数 · 碰撞属性 · 可视化属性
各位好,我是老高。今天咱们来啃URDF里最核心的一块——连杆(link)。你想想看,机器人不管多复杂,本质上就是一堆刚体杆件用关节串起来。而link标签,就是描述每一个刚体长什么样、有多重、撞到东西会怎样。
我个人习惯把link比作机器人的「骨头」。光有骨头不行,还得告诉仿真引擎这骨头的质量分布、外观、以及碰撞箱。这一章我会把link的四个核心部分掰开揉碎讲清楚。
2.1 link标签的基本骨架
一个最简的link长这样:
<link name="base_link">
<visual> ... </visual>
<collision> ... </collision>
<inertial> ... </inertial>
</link>
注意,name属性是唯一的。我见过有人把两个link取同名,结果Gazebo直接崩了……嗯,命名这事千万别偷懒。
2.2 可视化属性 (visual) —— 让机器人「看得见」
visual定义的是我们肉眼看到的样子。说白了就是几何体加颜色或纹理。
- geometry:支持
box、cylinder、sphere、mesh。我个人最常用mesh,直接导入STL或DAE文件,省事。 - origin:相对于link坐标系的偏移。xyz和rpy。
- material:颜色或纹理。可以定义
color rgba,也可以引用全局material。
💡 我的经验: 调试阶段用简单的box/cylinder就好,mesh文件加载慢。等模型稳定了再换成精美外观。我曾经在项目里直接用STL做碰撞检测,结果仿真卡成PPT……后面会讲碰撞几何的坑。
<visual>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="blue">
<color rgba="0.2 0.4 0.9 1.0"/>
</material>
</visual>
2.3 碰撞属性 (collision) —— 物理引擎的「硬边界」
collision和visual结构几乎一样,但意义完全不同。碰撞几何体是物理引擎用来算接触、摩擦、碰撞的。你想想看,如果碰撞网格太精细,仿真效率会直线下降。
⚠️ 避坑指南: 我曾经把视觉mesh直接复制到collision里,结果一个2000面的轮子让仿真频率从1000Hz掉到30Hz。后来我改用圆柱体近似轮子,速度直接起飞。记住:碰撞几何越简单越好,用box、cylinder、sphere组合代替复杂mesh。
<collision>
<geometry>
<cylinder radius="0.15" length="0.08"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
</collision>
2.4 惯性参数 (inertial) —— 让机器人「有分量」
没有惯性参数,机器人就像纸片一样,一推就飞。inertial包含三个东西:
| 子标签 | 说明 | 单位 |
|---|---|---|
mass | 连杆质量 | kg |
origin | 质心相对于link坐标系的偏移 | m / rad |
inertia | 惯性张量 (ixx, ixy, ixz, iyy, iyz, izz) | kg·m² |
惯性张量怎么算?对于规则几何体有公式,比如实心圆柱绕中心轴:izz = 0.5 * m * r²。不规则形状就用建模软件算,或者用urdf_sim_tutorial里的脚本估算。
🔧 我建议: 初期可以给一个粗略的惯性矩阵,但别用全零!ROS 2和Gazebo对零惯性张量会报错。至少给个小的对角矩阵,比如
ixx=0.01, iyy=0.01, izz=0.01。
<inertial>
<mass value="2.5"/>
<origin xyz="0 0 0.02" rpy="0 0 0"/>
<inertia ixx="0.012" ixy="0" ixz="0"
iyy="0.012" iyz="0"
izz="0.008"/>
</inertial>
2.5 扩展属性与常用技巧
除了上面三个,link里还可以放<gazebo>引用,用来设置摩擦系数、阻尼、弹簧等。这部分在仿真中特别重要,尤其是轮子与地面的抓地力。
- 摩擦系数:在gazebo reference里设置
mu和mu2。 - 阻尼:关节阻尼通常在joint里,但link也可以附加阻尼器。
- 自旋:对于全向轮,记得设置
friction1和friction2。
📌 小技巧: 如果你用xacro,可以把惯性矩阵写成宏,一键生成。我团队里就有一个通用的
inertial_macro.xacro,传入质量和尺寸自动算张量,省去手动计算的麻烦。
好了,这一章的核心就是:visual给人看,collision给物理引擎算,inertial给动力学用。三者可以不一样,但一定要合理。下一章我们讲关节,但今天先把link练熟。写一个自己的底盘link,试试不同几何和惯性参数,在RViz里观察变化。