2、机器人建模基础:URDF文件结构、link与joint定义、坐标系与物理参数
各位同学,欢迎来到第二章。上一章我们聊了MoveIt的整体框架,算是打了个底。这一章,咱们得亲手搭积木了——用URDF把机器人描述出来。
URDF,全称是Unified Robot Description Format。说白了,就是一套用XML写的机器人说明书。你告诉计算机:这里有个连杆,那里有个关节,它们怎么连,能怎么动。我刚开始学的时候,觉得这东西不就是个配置文件嘛,有啥难的?后来在项目里被坑过几次,才发现细节里全是魔鬼。
2.1 URDF文件结构:从根到叶
一个URDF文件,最外层是<robot>标签。里面就两样东西:<link>和<joint>。你想想看,机器人再复杂,拆到底也就是连杆和关节的树状结构。
<?xml version="1.0"?>
<robot name="my_robot">
<link name="base_link">
...
</link>
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link_1"/>
...
</joint>
<link name="link_1">
...
</link>
</robot>
注意,<robot>的name属性是必须的。我个人习惯用项目代号,比如arm_v2,方便后面调试时一眼认出来。
2.2 link与joint:机器人的骨骼和关节
link(连杆)
link就是机器人的一个刚体部件。它有三个子部分:
- <visual>:长什么样。指定几何体(box、cylinder、sphere、mesh)和材质颜色。
- <collision>:碰撞检测用。通常和visual一样,但可以简化成凸包或基本几何体来省计算。
- <inertial>:惯性参数。质量、质心、惯性张量。这个最容易被忽略,但动力学仿真全靠它。
joint(关节)
joint连接两个link,定义了它们的相对运动关系。常见类型有:
| 类型 | 说明 | 自由度 |
|---|---|---|
| revolute | 旋转关节,有角度限位 | 1 |
| continuous | 连续旋转关节,无限位(如轮子) | 1 |
| prismatic | 平移关节,有位移限位 | 1 |
| fixed | 固定连接,两个link刚性地绑在一起 | 0 |
| floating | 6自由度浮动关节(很少用) | 6 |
每个joint必须有<parent>和<child>。这构成了机器人的运动学树。根节点通常是base_link,叶子节点是末端执行器。
2.3 <origin>与<axis>:坐标系是灵魂
这是URDF里最容易出错的地方。我见过太多人在这里栽跟头。
<origin>:定义子link相对于父link的变换。包含xyz(平移)和rpy(旋转,单位弧度)。
<origin xyz="0 0 0.5" rpy="0 0 0"/>
上面这行表示:子link的原点,在父link坐标系下,沿Z轴向上0.5米,没有旋转。
<axis>:定义关节的运动轴。只对revolute、prismatic、continuous有效。
<axis xyz="0 0 1"/>
这表示关节绕Z轴旋转。注意,这个轴是在父link坐标系下定义的。嗯,这里要特别小心——我当年做六轴机械臂时,把axis写成了相对于子link,结果仿真时手臂扭成了麻花。
<origin>的rpy写错了符号。记住:rpy的顺序是绕固定轴X→Y→Z,不是绕自身轴。
2.4 <limit>与<dynamics>:物理参数决定真实感
光有几何和运动学还不够。要让机器人动得真实,必须加上物理参数。
<limit>:关节的硬限位。
<limit effort="100" velocity="3.14" lower="-3.14" upper="3.14"/>
lower/upper:关节运动范围(弧度或米)。effort:最大驱动力/力矩。velocity:最大速度。
<dynamics>:关节的阻尼和摩擦。
<dynamics damping="0.1" friction="0.0"/>
这两个参数在纯运动学规划中影响不大,但如果你要做力控或仿真,它们就很重要了。我建议一开始都设成小值,等模型跑通了再慢慢调。
2.5 使用SolidWorks导出URDF
手写URDF?对于简单模型还行。但真实机器人动辄几十个零件,手写会疯掉的。这时候就需要工具了。
SolidWorks有个官方插件叫sw2urdf。流程大致如下:
- 在SolidWorks里建好装配体,确保每个零件是一个独立的part。
- 安装sw2urdf插件(从ROS官网下载)。
- 在SolidWorks里打开装配体,启动插件。
- 为每个关节指定类型、轴线、限位。
- 插件自动生成URDF文件和对应的mesh文件(STL或DAE)。
导出后,用check_urdf命令验证一下:
check_urdf my_robot.urdf
它会打印出机器人的运动学树,如果有错误会直接报出来。再用urdf_to_graphiz生成可视化树状图,一目了然。
<origin>和<axis>。插件有时候会搞错坐标系方向,尤其是当你的装配体里有子装配体时。花10分钟检查,能省下后面几小时的调试时间。
好了,这一章的内容就到这里。URDF是机器人建模的基石,看似简单,但每个字段都有它的意义。下一章我们会用这些知识,搭建一个完整的机械臂模型,然后让它在MoveIt里动起来。