第2章:URDF与机器人建模
URDF,全称是Unified Robot Description Format。说白了,它就是机器人的「身份证」加「体检报告」。
我刚开始接触机器人时,觉得建模这事挺玄乎。后来才发现,URDF不过是一个XML文件,告诉计算机:你的机器人长什么样,关节能怎么动。
URDF文件结构
一个标准的URDF文件,核心就两样东西:连杆(link)和关节(joint)。
你可以把连杆想象成骨头,关节就是连接骨头的韧带。骨头本身不会动,是韧带让骨头动起来的。
核心原则:每个关节连接两个连杆,一个父连杆,一个子连杆。子连杆绕着父连杆的关节运动。
来看一个最简单的URDF结构:
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
</joint>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.02"/>
</geometry>
</visual>
</link>
</robot>
嗯,这里要注意:origin定义的是子连杆相对于父连杆的位置偏移。axis定义的是旋转轴方向。这两个参数搞错了,你的机器人就会「脱臼」。
连杆与关节的详细定义
连杆(link)
每个连杆可以包含三部分信息:
- visual:视觉显示用的几何体。说白了就是「看起来什么样」。
- collision:碰撞检测用的几何体。可以比visual简单一些,节省计算资源。
- inertial:惯性参数,包括质量、惯性矩阵。这个在动力学仿真中至关重要。
我的经验:很多初学者只写visual,不写collision和inertial。这在纯可视化没问题,但一旦要做运动规划或动力学仿真,就会报错。我建议从一开始就把三个部分都写上,哪怕collision直接用visual的几何体也行。
关节(joint)
关节类型决定了运动方式。常用的有:
| 类型 | 说明 | 典型应用 |
|---|---|---|
| revolute | 旋转关节,有角度限制 | 肩关节、肘关节 |
| continuous | 连续旋转关节,无限制 | 车轮、末端执行器 |
| prismatic | 平移关节 | 升降台、滑轨 |
| fixed | 固定关节,不能运动 | 传感器支架 |
我曾经犯过一个低级错误:把旋转关节写成了fixed类型。结果在MoveIt里怎么规划都动不了,查了半天才发现是关节类型写错了。你想想看,一个固定住的关节,怎么可能动呢?
使用SolidWorks导出URDF
手工写URDF对于简单模型还行。但真实机器人有几十个零件,手写会疯掉的。这时候就需要工具了。
SolidWorks有一个官方插件叫sw2urdf,可以一键导出。流程大致如下:
- 在SolidWorks中装配好机器人模型
- 定义每个零件的坐标系和关节轴
- 运行sw2urdf插件,选择基准连杆
- 插件自动生成URDF文件和mesh文件
避坑指南:我曾经导出一个六轴机械臂,结果在Rviz里看到手臂是歪的。排查后发现是SolidWorks里的坐标系和ROS的坐标系不一致。ROS遵循右手定则,Z轴向上。而SolidWorks默认Z轴是朝前的。所以导出前一定要检查坐标系对齐。
导出后你会得到一堆文件:一个.urdf文件,以及一个meshes文件夹,里面是.stl或.dae格式的网格文件。这些网格文件就是机器人的「皮肤」。
在Rviz中可视化机器人模型
URDF写好了,怎么验证对不对?用Rviz。
启动命令很简单:
ros2 launch urdf_tutorial display.launch.py model:=/path/to/your_robot.urdf
或者用更直接的方式:
ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:=$(cat /path/to/your_robot.urdf)
然后在Rviz中添加RobotModel显示组件,选择/robot_description话题。如果一切正常,你会看到你的机器人出现在3D场景中。
我习惯在Rviz里做三件事来验证模型:
- 拖动关节:在Joint State Publisher里拖动滑块,看关节运动是否正常
- 检查碰撞:看连杆之间有没有互相穿透
- 检查原点:看每个连杆的坐标系是否在正确位置
一个实用技巧:在Rviz中显示连杆的坐标系(勾选Show Axes),可以直观地看到每个关节的旋转轴方向。如果轴方向错了,机器人运动起来会像「抽筋」一样。
这张图把本章的知识点串起来了。从URDF文件结构出发,到两种建模方式,最后用Rviz验证。每一步都有坑,但每一步也都有方法。
我个人觉得,URDF建模是机器人开发中最「实在」的一步。模型建好了,后面的运动规划、抓取控制才有根基。模型建歪了,后面全是白费功夫。
最后一个小建议:刚开始做URDF时,不要追求完美。先搭一个能动的骨架,再慢慢加细节。我见过太多人花一周时间调模型外观,结果运动学一塌糊涂。记住,功能优先,外观其次。