4. 机器人URDF模型构建:从零搭建你的“数字孪生”
URDF,全称是Unified Robot Description Format。说白了,它就是机器人的“身份证”和“骨架说明书”。没有它,MoveIt和Gazebo根本不知道你的机器人长什么样、胳膊往哪转、轮子怎么动。
我个人习惯把URDF比作乐高积木的搭建图纸。每个零件(Link)怎么连接(Joint),尺寸多大,材质如何,全写在一个XML文件里。今天我们就来亲手画这张图。
4.1 URDF语法基础:别被XML吓到
URDF本质上是XML。如果你写过HTML,那上手会很快。它的根标签是<robot>,里面就两样东西:<link>和<joint>。
一个最简单的URDF骨架长这样:
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
</robot>
嗯,这里要注意:name属性必须唯一。我在项目中遇到过有人把两个link都叫“arm”,结果ROS直接报错,找了半天才发现是命名冲突。
left_wheel_link,别用驼峰或空格。ROS社区约定俗成的规矩,能省很多麻烦。
4.2 连杆(Link)定义:视觉、碰撞与惯性
一个完整的link定义,通常包含三部分:visual(视觉)、collision(碰撞)和inertial(惯性)。
visual:就是你在Rviz里看到的样子。可以是box、cylinder、sphere,或者用mesh导入STL文件。
collision:用于物理引擎计算碰撞。我建议你尽量用简单几何体代替复杂mesh。为什么?因为碰撞检测计算量很大,一个复杂的机械手用圆柱体代替手指,仿真速度能快3倍。
inertial:这玩意儿最容易被忽略。它定义了质量、质心和惯性张量。如果你不做动力学仿真,可以随便填。但要做真实物理模拟,必须算准。
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.4" radius="0.05"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.2"/>
</visual>
<collision>
<geometry>
<cylinder length="0.4" radius="0.06"/>
</geometry>
</collision>
<inertial>
<mass value="1.0"/>
<inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
</inertial>
</link>
origin的rpy写错,导致机械臂在Rviz里扭成了麻花。记住:rpy的单位是弧度,不是角度!90度要写成1.57。
4.3 关节(Joint)定义:让机器人动起来
关节连接两个link,定义了它们之间的相对运动。常见的关节类型有:
| 类型 | 说明 | 自由度 |
|---|---|---|
| revolute | 旋转关节,像门轴 | 1 (绕轴旋转) |
| prismatic | 滑动关节,像抽屉 | 1 (沿轴平移) |
| fixed | 固定连接,焊死的 | 0 |
| continuous | 无限旋转,像车轮 | 1 (无角度限制) |
| floating | 6自由度漂浮 | 6 |
你想想看,一个机械臂的肩关节用revolute,肘关节也用revolute,但腕关节可能用continuous。选对类型,MoveIt才能正确规划路径。
<joint name="arm_joint" type="revolute">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
</joint>
axis定义了旋转轴。绕Z轴转就是0 0 1。绕X轴转就是1 0 0。这个搞错了,机器人动作会完全乱套。
4.4 机器人模型可视化:眼见为实
写完了URDF,怎么验证对不对?用check_urdf命令检查语法,然后用urdf_to_graphiz生成结构图。但我最常用的还是直接扔进Rviz看。
启动Rviz,加载你的URDF:
ros2 launch urdf_tutorial display.launch.py model:=/path/to/your.urdf
如果看到机器人歪七扭八,别慌。八成是origin的坐标算错了。我有个习惯:先在纸上画坐标轴,标出每个link的原点位置,再写代码。这样能避免80%的视觉错误。
4.5 模型参数调优:从“能动”到“好用”
模型能动了,不代表好用。我见过太多人卡在这一步。调优主要看三点:
- 关节限位:
lower和upper别设太宽。比如人的肘关节只能弯135度,你设成360度,MoveIt规划出的路径可能让机械臂“反关节”运动,现实中会撞坏。 - 碰撞模型简化:用圆柱体代替复杂手指,用长方体代替外壳。仿真速度提升明显,精度损失可以接受。
- 惯性参数校准:如果你做抓取仿真,
mass和inertia必须准。我有个项目,因为惯性参数随便填,导致抓取时机器人疯狂抖动,最后用SolidWorks算了一遍才解决。
joint_state_publisher_gui手动拖动每个关节,观察运动是否平滑。如果某个关节卡顿,检查axis方向是否和link的origin对齐。
URDF模型是MoveIt的基石。模型不准,后面所有导航、规划都是空中楼阁。花时间把这一步做扎实,后面你会感谢自己的。