第1章:URDF机器人模型构建
大家好,我是你们的老朋友。今天咱们来聊聊URDF——这个在机器人世界里绕不开的话题。
URDF全称是Unified Robot Description Format,说白了就是一套描述机器人长什么样的XML语言。我刚开始接触ROS那会儿,觉得这玩意儿不就是个配置文件嘛,有啥好学的?结果第一次搭建机械臂模型时,关节方向搞反了,模型直接拧成了麻花……嗯,从那以后我再也不敢小看URDF了。
1.1 URDF语法基础
URDF文件本质上就是一个XML文档。它的根标签是<robot>,里面包含两大类元素:<link>和<joint>。
先看一个最简单的例子:
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
</robot>
这个模型只有一个底座,是个长方体。你想想看,如果只有link没有joint,那机器人就是一块铁疙瘩,动不了。所以我们需要joint把它们连起来。
核心要点:URDF中,link是刚体部件,joint是连接两个link的运动副。一个完整的机器人模型,至少需要1个link和0个以上的joint。
1.2 link的定义
每个link可以包含三个主要部分:
- visual:可视化外观,用于显示
- collision:碰撞模型,用于物理仿真
- inertial:惯性参数,用于动力学计算
我个人习惯把visual和collision分开定义。visual可以做得精细些,好看嘛;collision则尽量简化,用长方体或圆柱体代替,这样碰撞检测快得多。
举个例子:
<link name="arm_link1">
<visual>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.02"/>
</geometry>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.02"/>
</geometry>
</collision>
</link>
小技巧:material标签可以复用。在robot标签内定义好颜色材质,多个link引用同一个material名称即可,省得每个link都写一遍颜色。
1.3 joint的定义
joint是URDF的灵魂。它决定了机器人怎么动。常见的joint类型有:
| 类型 | 说明 | 自由度 |
|---|---|---|
| revolute | 旋转关节,有限位 | 1 |
| continuous | 连续旋转关节,无限位 | 1 |
| prismatic | 平移关节 | 1 |
| fixed | 固定关节,不能动 | 0 |
| floating | 浮动关节,6自由度 | 6 |
我在项目中遇到过最坑的事:把revolute关节的limit设错了,导致机械臂仿真时关节转过了头,直接穿模。所以limit参数一定要算准。
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="arm_link1"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
</joint>
这里origin表示子link相对于父link的位置偏移,axis是关节旋转轴。注意:rpy是绕固定轴的旋转顺序,别搞混了。
避坑指南:我曾经把parent和child写反了,结果模型树全乱了。记住:parent是靠近基座的,child是远离基座的。从基座开始,一层层往外定义。
1.4 惯性参数配置
惯性参数是动力学仿真的基础。每个link都需要配置质量和惯性张量。很多新手会忽略这一步,结果仿真时机器人飘在空中——因为没有质量嘛。
惯性张量是一个3x3的矩阵,描述物体绕各轴旋转的惯性。对于简单几何体,可以用公式计算:
- 长方体:Ixx = (1/12)*m*(h²+w²),依此类推
- 圆柱体:Ixx = Izz = (1/12)*m*(3r²+h²),Iyy = (1/2)*m*r²
- 球体:Ixx = Iyy = Izz = (2/5)*m*r²
举个例子:
<inertial>
<mass value="0.5"/>
<inertia ixx="0.001" ixy="0" ixz="0"
iyy="0.001" iyz="0"
izz="0.001"/>
</inertial>
经验之谈:如果你只是做运动学仿真,惯性参数可以随便填个大概值。但要做动力学控制或力控,惯性参数必须精确。我一般用SolidWorks导出URDF,惯性参数自动算好,省心。
1.5 可视化检查模型
模型写好了,怎么检查对不对?ROS提供了两个好工具:
- check_urdf:命令行工具,检查语法错误
- urdf_to_graphiz:生成模型树图
用法很简单:
# 检查URDF文件
check_urdf my_robot.urdf
# 生成模型树
urdf_to_graphiz my_robot.urdf
我个人习惯先用check_urdf扫一遍,再用urdf_to_graphiz看树结构。如果树结构不对,比如某个关节连错了,一眼就能看出来。
下面是我用SVG画的一张URDF模型构建流程图,帮你理清思路:
用Rviz可视化也很方便。启动Rviz后,添加RobotModel显示插件,选择你的URDF文件路径,就能看到3D模型了。如果模型显示不对,比如关节方向错了,在Rviz里旋转一下就能发现问题。
总结一下:URDF模型构建的核心就是link和joint的合理搭配。link定义部件的外观和物理属性,joint定义部件之间的运动关系。从基座开始,一层层往外搭,最终形成一棵完整的模型树。检查工具能帮你快速定位问题,别偷懒,每一步都检查一遍。
好了,这一章的内容就到这里。记住:模型是机器人的骨架,骨架搭好了,后面的控制、规划才能跑得稳。下一章我们聊聊如何用xacro来简化URDF的编写,让模型更易于维护。