4、link标签详解:link的定义与作用、惯性参数、碰撞属性、可视化属性
各位同学,今天我们来啃URDF里最核心的一块——link标签。
说白了,link就是机器人的每一个刚体部件。机械臂的大臂、小臂、基座,移动机器人的底盘、轮子、激光雷达支架,全都是link。我刚开始学URDF时,总以为link就是画个好看的3D模型,后来才发现——真正决定机器人能不能动、动得稳不稳的,是link背后的物理参数。
核心一句话:link定义的是刚体的物理属性,可视化只是它的“皮囊”。
4.1 link的结构骨架
一个完整的link标签,长这样:
<link name="base_link">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="10.0"/>
<inertia ixx="0.1" ixy="0" ixz="0"
iyy="0.1" iyz="0"
izz="0.1"/>
</inertial>
<collision>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://my_robot/meshes/base.dae"/>
</geometry>
<material name="blue"/>
</visual>
</link>
嗯,这里要注意:三个子标签的顺序——inertial、collision、visual。虽然XML解析不强制顺序,但我个人习惯按这个顺序写,逻辑上更顺:先定义物理本质,再定义碰撞边界,最后才是外观。
4.2 惯性参数——机器人的“灵魂”
惯性参数决定了这个link在受力时怎么动。你想想看,一个10kg的钢块和一个10kg的空心塑料壳,质量一样,但转起来的感觉完全不同——这就是转动惯量在起作用。
| 参数 | 含义 | 单位 | 常见坑点 |
|---|---|---|---|
mass |
质量 | kg | 别写0,仿真会崩 |
ixx, iyy, izz |
绕X/Y/Z轴的转动惯量 | kg·m² | 必须为正数 |
ixy, ixz, iyz |
惯性积(耦合项) | kg·m² | 对称物体可设为0 |
origin |
惯性坐标系相对于link坐标系的位置 | m / rad | 默认在link原点,但重心偏移时要改 |
我曾经踩过的坑:给一个机械臂的末端执行器写惯性参数时,随手把ixx、iyy、izz都填了0.001。结果仿真时末端疯狂抖动,查了两天才发现——转动惯量太小,控制器根本稳不住。后来老老实实用SolidWorks算了一遍。
计算惯性参数,我推荐两种方式:
- CAD软件导出:SolidWorks、Fusion 360都能直接输出URDF,惯性参数自动算好。这是最靠谱的方法。
- 近似估算:对于简单几何体,用公式手算。比如长方体绕中心轴的转动惯量公式:
I = (1/12) * m * (w² + h²)。我早期做AGV底盘时就这么干,精度够用。
4.3 碰撞属性——物理引擎的“触觉”
碰撞属性告诉物理引擎:这个link的边界在哪。它不参与渲染,但决定了机器人能不能穿过障碍物、会不会和地面产生摩擦。
<collision>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<geometry>
<cylinder radius="0.15" length="0.3"/>
</geometry>
</collision>
这里有个关键点:碰撞几何体越简单越好。为什么?
- 物理引擎每帧都要做碰撞检测,复杂mesh会拖慢仿真速度。
- 我做过一个项目,给六轴机械臂的每个link都用了精细的STL模型做碰撞,结果Gazebo跑起来只有5帧。后来全部换成圆柱体和长方体组合,帧率直接回到60帧。
我的经验法则:碰撞几何体用基本形状(box、cylinder、sphere)组合,实在不行再用凸包mesh。凹面mesh?尽量别用,物理引擎处理起来很头疼。
4.4 可视化属性——机器人的“颜值”
可视化属性就是我们在Rviz里看到的样子。它不影响物理仿真,只影响视觉呈现。
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://my_robot/meshes/arm.stl"/>
</geometry>
<material name="aluminum">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
</visual>
可视化支持三种几何体:
- 基本形状:box、cylinder、sphere。调试阶段用它们,加载快,一眼能看出位置对不对。
- mesh文件:支持STL、DAE格式。DAE还能带颜色和纹理,我一般用DAE做最终展示。
- material标签:可以定义颜色和纹理。注意,
rgba的值范围是0到1,不是0到255。
一个实用技巧:开发阶段,我会把visual和collision设成一样的简单几何体。等运动学验证通过后,再把visual换成精细mesh。这样既保证了调试效率,又保证了最终效果。
4.4 知识体系总览
下面这张图,把link标签的三大块和它们之间的关系梳理清楚了:
4.5 三个属性的优先级与避坑
在实际项目中,这三个属性的重要性排序是这样的:
- inertial > collision > visual——物理仿真时,惯性参数错了,整个运动学都乱套。
- collision > visual——碰撞检测错了,机器人会穿模或者卡住。
- visual最不重要——但客户看的是它,所以最终交付前一定要把mesh和材质调好。
又一个我踩过的坑:有一次给移动机器人写URDF,visual用了精细的轮胎花纹mesh,collision却偷懒用了圆柱体。结果仿真时轮胎和地面摩擦系数怎么调都不对——因为碰撞几何体的接触面积和视觉模型不一样。后来我把collision的圆柱体半径调大了一圈,才匹配上。
最后,送你一个检查清单:
- 每个link都有inertial吗?mass不为0?
- ixx/iyy/izz都大于0吗?
- collision几何体比visual略大一点点(留安全余量)?
- mesh文件的路径用
package://了吗? - origin的偏移量对吗?特别是重心不在几何中心时。
嗯,link标签就这些。记住:物理参数是里子,可视化是面子。里子错了,面子再好看也没用。