第3章:机器人建模与URDF
各位同学,今天我们来聊聊机器人建模。说白了,就是给你的机器人画个「骨架」,让计算机知道它长什么样、关节怎么动。
URDF(Unified Robot Description Format)是ROS里最基础的机器人描述格式。我刚开始接触ROS时,觉得这东西不就是个XML吗?后来才发现,这里面的门道还真不少。
3.1 URDF语法基础
URDF本质上是一个XML文件。它的核心就两个东西:连杆(link)和关节(joint)。
你可以这么理解:连杆是机器人的「骨头」,关节是连接骨头的「筋」。骨头本身不会动,筋才会让机器人动起来。
核心原则:每个URDF文件必须包含至少一个link和一个joint。link是刚体,joint定义link之间的运动关系。
来看一个最简单的例子:
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
</robot>
嗯,这里要注意:robot标签是根节点,name属性随便起,但最好有意义。我习惯用项目名或机器人型号。
3.2 连杆定义详解
一个完整的link定义包含三部分:
| 子标签 | 作用 | 是否必须 |
|---|---|---|
<visual> |
可视化外观,用于Rviz显示 | 推荐 |
<collision> |
碰撞检测模型 | 推荐 |
<inertial> |
惯性参数,用于物理仿真 | 仿真时必选 |
我在项目中遇到过一个问题:visual和collision用同一个模型,结果碰撞检测特别慢。后来我把collision简化成几个基本几何体,速度提升了好几倍。
我的经验:collision模型尽量用box、cylinder、sphere这些基本形状。复杂的mesh模型会拖慢碰撞检测,尤其是做导航时,影响很明显。
3.3 关节定义详解
关节定义了连杆之间的运动关系。URDF支持6种关节类型:
- fixed:固定连接,不能动
- revolute:旋转关节,有角度限制
- continuous:连续旋转关节,没限制
- prismatic:平移关节
- floating:6自由度浮动
- planar:平面运动
最常用的是revolute和continuous。差速轮式机器人一般用continuous,机械臂用revolute。
<joint name="joint1" 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="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>
这里有个坑:origin的xyz是相对于父连杆的坐标,rpy是旋转角度。我曾经把rpy写反了,结果机械臂在Rviz里扭成了麻花。
避坑指南:rpy的顺序是绕X轴、Y轴、Z轴旋转。单位是弧度,不是度。我刚开始总写成角度,结果模型飞到了天上去。
3.4 使用SolidWorks导出URDF
手动写URDF太累了,尤其是复杂机器人。我推荐用SolidWorks的URDF导出插件。
步骤很简单:
- 在SolidWorks里建好装配体
- 给每个零件设置好坐标系
- 定义关节类型和运动轴
- 运行导出插件,生成URDF和mesh文件
导出时要注意几点:
- 每个零件单独成一个link
- 关节的坐标系要对齐
- mesh文件格式用STL或DAE
我个人习惯用DAE格式,因为它支持颜色信息。STL只有几何形状,在Rviz里灰蒙蒙的,不好看。
小技巧:导出前把SolidWorks的单位设为米。不然导出的URDF里坐标全是毫米,你得手动除以1000,很麻烦。
3.5 在Rviz中可视化模型
模型建好了,总得看看长啥样吧?Rviz就是干这个的。
启动命令很简单:
ros2 launch urdf_tutorial display.launch.py model:=my_robot.urdf
或者手动操作:
- 启动Rviz:
rviz2 - 添加RobotModel显示组件
- 在Description Topic里选择
/robot_description - 或者直接加载URDF文件
我第一次在Rviz里看到自己建的机器人时,说实话挺激动的。虽然只是个简单的两轮底盘,但看到它动起来的那一刻,感觉之前熬的夜都值了。
如果模型显示不出来,多半是这几个原因:
- URDF文件路径不对
- mesh文件路径是相对路径,但Rviz找不到
- 关节的parent和child写反了
注意:URDF里的mesh路径最好用package://格式。比如package://my_robot/meshes/base.stl。这样不管你在哪个目录启动,都能找到文件。
3.6 本章知识体系
下面这张图总结了URDF建模的核心逻辑:
从这张图可以看出,URDF建模其实就三步:定义连杆、定义关节、可视化验证。每一步都有对应的工具和方法。
好了,这一章的内容就到这里。URDF是机器人建模的基础,后面做导航、做SLAM,都离不开它。建议大家多动手,从简单的两轮底盘开始,慢慢加传感器、加机械臂,一步步来。
公众号:蓝海资料掘金营,微信deep3321