3. 机器人建模与URDF:从零搭建你的机器人“骨架”
做机器人开发,第一步是什么?不是写代码,不是调参数,而是给你的机器人“画个像”。
URDF(Unified Robot Description Format)就是这个画像的标准语言。说白了,它就是一套XML格式的“机器人身份证”,告诉计算机你的机器人长什么样、胳膊往哪伸、轮子怎么转。
我刚开始接触URDF时也觉得挺枯燥,不就是一堆标签嘛。直到有一次在项目里,因为一个关节的坐标系方向搞反了,整个机械臂在仿真里“反关节”运动,差点把虚拟工件打飞……嗯,从那以后我再也不敢小看这个“身份证”了。
本章核心:掌握URDF语法,学会定义连杆与关节,能用SolidWorks导出URDF,并在Rviz中让机器人“活”起来。
3.1 URDF语法详解:标签就是积木块
URDF的语法其实很简单。它只有两个核心标签:<link> 和 <joint>。你想想看,机器人不就是一堆刚体(link)通过关节(joint)连起来嘛。
先看一个最简的URDF文件长什么样:
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.3 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.2" rpy="0 0 0"/>
</joint>
</robot>
这里有几个关键点:
- robot:根标签,name属性随便起,但别用中文
- link:定义连杆的视觉、碰撞和惯性属性
- joint:定义两个link之间的连接关系
我的小技巧:写URDF时,我习惯先画个树状图。根节点通常是 base_link,然后一层层往下挂。这样写出来的URDF结构清晰,不容易出错。
3.2 连杆与关节的“五脏六腑”
一个完整的link定义,其实包含三部分:
| 属性 | 作用 | 我的经验 |
|---|---|---|
| visual | 视觉显示,决定你看到的样子 | 用STL文件更真实,用几何体更轻量 |
| collision | 碰撞检测,决定物理交互 | 尽量简化,用长方体代替复杂曲面 |
| inertial | 惯性参数,决定动力学 | SolidWorks导出时自动计算,别手写 |
关节类型有六种,但常用的就三种:
- fixed:固定连接,比如底座和机身
- revolute:旋转关节,比如机械臂的肘关节
- prismatic:滑动关节,比如升降台
我曾经踩过的坑:定义revolute关节时,忘了设置 <limit> 标签。结果在MoveIt里规划运动时,关节直接转到了极限位置,把虚拟工件撞飞了。记住:旋转关节一定要设 lower、upper 和 effort。
3.3 从SolidWorks导出URDF:省时省力的“捷径”
手写URDF?对于简单机器人还行。但如果你用的是复杂的工业机械臂,手写会疯掉的。我建议直接用SolidWorks导出。
步骤很简单:
- 安装 sw2urdf 插件(网上有教程)
- 在SolidWorks里定义好每个零件的坐标系和关节轴
- 一键导出,自动生成URDF和STL文件
导出时要注意:
- 每个零件单独成一个文件,别把所有东西画在一个零件里
- 关节的旋转轴要对齐SolidWorks里的坐标轴
- 导出的URDF里,
<origin>的数值是自动计算的,别乱改
我的建议:第一次导出后,先在Rviz里看一眼。如果机器人姿势不对,90%是SolidWorks里的坐标系没对齐。别问我怎么知道的……
3.4 在Rviz中可视化:让机器人“活”起来
URDF写好了,怎么验证?用Rviz。这是ROS里最常用的可视化工具。
启动命令很简单:
# 先启动一个robot_state_publisher
ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:=$(cat my_robot.urdf)
# 再启动Rviz
ros2 run rviz2 rviz2
在Rviz里,添加一个 RobotModel 显示组件,就能看到你的机器人了。
如果机器人显示不出来,检查这几件事:
- URDF文件路径对不对?用路径最保险
- STL文件路径对不对?URDF里用的是相对路径,要确保文件在正确位置
- 有没有启动
robot_state_publisher?它负责发布TF变换
调试小技巧:用 check_urdf 命令检查URDF语法。它会告诉你哪里少了标签,哪里坐标不对。我每次导出后都会跑一遍这个命令,省了不少排查时间。
嗯,到这里,你的机器人已经有了“骨架”。下一章,我们会在这个骨架上添加传感器和控制器,让它真正“活”起来。