第二章:机器人建模基础——URDF文件结构、link与joint详解
各位同学,欢迎来到建模这一章。说实话,URDF 是 Gazebo 仿真的地基。地基没打好,后面抓取任务跑起来全是坑。我自己刚入行那会儿,就因为一个 joint 的轴方向写反了,折腾了整整两天。
今天咱们就把 URDF 彻底讲透。你想想看,一个机器人模型,说白了就是一堆刚体零件(link)加上连接它们的关节(joint)。就这么简单。
核心要点:URDF 不是编程语言,它是 XML 格式的描述文件。它只描述「长什么样」「怎么动」,不描述「怎么控制」。
2.1 URDF 文件结构
一个标准的 URDF 文件,根标签是 <robot>。里面就两样东西:<link> 和 <joint>。我习惯把 link 比作骨头,joint 比作关节。
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
<joint name="base_to_arm" type="fixed">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.05"/>
</joint>
</robot>
嗯,这里要注意:<origin> 定义的是子 link 相对于父 link 的位置偏移。我见过有人把 xyz 写成世界坐标,结果模型飞到了天上去。
2.2 link 详解
每个 link 有三个核心部分:视觉(visual)、碰撞(collision)、惯性(inertial)。
| 标签 | 作用 | 我踩过的坑 |
|---|---|---|
| visual | 显示用的几何体,不影响物理 | mesh 路径别用中文,Gazebo 不认 |
| collision | 碰撞检测用的几何体 | 尽量用简单几何体代替 mesh,性能差很多 |
| inertial | 质量、惯性矩阵 | 我曾经忘了写 inertia,模型直接原地爆炸 |
我的习惯:visual 用精细的 STL 文件,collision 用 box 或 cylinder 代替。这样显示好看,碰撞计算又快。
2.3 joint 详解
joint 的类型决定了自由度。常用的就这几种:
- fixed:焊死的,不能动。比如底座和机身之间。
- revolute:旋转关节,有角度限制。机械臂的肩关节、肘关节都是这个。
- continuous:无限旋转,比如轮子。
- prismatic:直线滑动,比如升降台。
为什么会搞混 revolute 和 continuous?说白了,revolute 有 <limit> 标签,continuous 没有。我刚开始做六轴机械臂时,把腕关节设成了 continuous,结果仿真时它转个不停……
<joint name="shoulder_joint" type="revolute">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="100" velocity="1.0"/>
</joint>
注意 <axis> 这个标签。它定义的是旋转轴的方向。我见过有人把 z 轴写成 x 轴,结果机械臂往旁边甩。你想想看,这要是真机,直接撞墙。
2.4 使用 SolidWorks 导出 URDF
手动写 URDF 太累了,尤其是复杂模型。我推荐用 SolidWorks 的 sw2urdf 插件。流程很简单:
- 在 SolidWorks 里装配好你的机器人
- 定义每个零件的坐标系和关节轴
- 一键导出 URDF + mesh 文件
避坑指南:我曾经导出一个 200 多个零件的装配体,结果 URDF 文件有 10MB。Gazebo 加载直接卡死。后来我把所有非运动零件合并成一个 link,文件缩小了 90%。
导出后你会得到这样的目录结构:
my_robot/
├── urdf/
│ └── my_robot.urdf
├── meshes/
│ ├── base_link.STL
│ ├── shoulder_link.STL
│ └── ...
├── config/
│ └── joint_limits.yaml
└── launch/
└── display.launch
2.5 在 Rviz 中可视化模型
模型导出了,怎么检查对不对?用 Rviz。我每次改完 URDF,第一件事就是打开 Rviz 看一眼。
启动命令很简单:
roslaunch my_robot display.launch
在 Rviz 里,添加 RobotModel 显示插件,选择你的 URDF 文件。如果模型显示正常,恭喜你。如果零件飞了或者错位,八成是 joint 的 origin 写错了。
调试技巧:在 Rviz 里勾选「Show Axes」,每个 link 的坐标系都会显示出来。一眼就能看出哪个关节的轴方向不对。这招我用了好几年,屡试不爽。
2.6 本章知识体系
下面这张图是我自己画的,把 URDF 的核心逻辑串起来了:
这张图你看懂了吗?左边是 link 的三个属性,右边是 joint 的三个关键参数。上下是工具链。整个 URDF 建模,就是把这些东西填对。
最后说一句:URDF 不难,但细节多。我建议你每写一个 joint,就在 Rviz 里看一眼。别等全部写完再调试,那会疯掉的。