第2章 机器人连杆(link)定义

link标签详解 · 惯性参数 · 碰撞属性 · 可视化属性

各位好,我是老高。今天咱们来啃URDF里最核心的一块——连杆(link)。你想想看,机器人不管多复杂,本质上就是一堆刚体杆件用关节串起来。而link标签,就是描述每一个刚体长什么样、有多重、撞到东西会怎样。

我个人习惯把link比作机器人的「骨头」。光有骨头不行,还得告诉仿真引擎这骨头的质量分布、外观、以及碰撞箱。这一章我会把link的四个核心部分掰开揉碎讲清楚。

🔧 连杆(link) 核心结构 link 标签 可视化 (visual) 碰撞 (collision) 惯性 (inertial) 属性 (属性扩展) 几何 + 材质 质量 + 惯性张量 接触/摩擦/阻尼

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里观察变化。