第二章:机器人建模基础——URDF文件结构、link与joint详解

各位同学,欢迎来到建模这一章。说实话,URDF 是 Gazebo 仿真的地基。地基没打好,后面抓取任务跑起来全是坑。我自己刚入行那会儿,就因为一个 joint 的轴方向写反了,折腾了整整两天。

今天咱们就把 URDF 彻底讲透。你想想看,一个机器人模型,说白了就是一堆刚体零件(link)加上连接它们的关节(joint)。就这么简单。

核心要点:URDF 不是编程语言,它是 XML 格式的描述文件。它只描述「长什么样」「怎么动」,不描述「怎么控制」。

2.1 URDF 文件结构

一个标准的 URDF 文件,根标签是 <robot>。里面就两样东西:<link> 和 <joint>。我习惯把 link 比作骨头,joint 比作关节。

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.2 0.2 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.05"/>
  </joint>
</robot>

嗯,这里要注意:<origin> 定义的是子 link 相对于父 link 的位置偏移。我见过有人把 xyz 写成世界坐标,结果模型飞到了天上去。

2.2 link 详解

每个 link 有三个核心部分:视觉(visual)、碰撞(collision)、惯性(inertial)。

标签 作用 我踩过的坑
visual 显示用的几何体,不影响物理 mesh 路径别用中文,Gazebo 不认
collision 碰撞检测用的几何体 尽量用简单几何体代替 mesh,性能差很多
inertial 质量、惯性矩阵 我曾经忘了写 inertia,模型直接原地爆炸

我的习惯:visual 用精细的 STL 文件,collision 用 box 或 cylinder 代替。这样显示好看,碰撞计算又快。

2.3 joint 详解

joint 的类型决定了自由度。常用的就这几种:

  • fixed:焊死的,不能动。比如底座和机身之间。
  • revolute:旋转关节,有角度限制。机械臂的肩关节、肘关节都是这个。
  • continuous:无限旋转,比如轮子。
  • prismatic:直线滑动,比如升降台。

为什么会搞混 revolute 和 continuous?说白了,revolute 有 <limit> 标签,continuous 没有。我刚开始做六轴机械臂时,把腕关节设成了 continuous,结果仿真时它转个不停……

<joint name="shoulder_joint" type="revolute">
  <parent link="base_link"/>
  <child link="shoulder_link"/>
  <origin xyz="0 0 0.1" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-3.14" upper="3.14" effort="100" velocity="1.0"/>
</joint>

注意 <axis> 这个标签。它定义的是旋转轴的方向。我见过有人把 z 轴写成 x 轴,结果机械臂往旁边甩。你想想看,这要是真机,直接撞墙。

2.4 使用 SolidWorks 导出 URDF

手动写 URDF 太累了,尤其是复杂模型。我推荐用 SolidWorks 的 sw2urdf 插件。流程很简单:

  1. 在 SolidWorks 里装配好你的机器人
  2. 定义每个零件的坐标系和关节轴
  3. 一键导出 URDF + mesh 文件

避坑指南:我曾经导出一个 200 多个零件的装配体,结果 URDF 文件有 10MB。Gazebo 加载直接卡死。后来我把所有非运动零件合并成一个 link,文件缩小了 90%。

导出后你会得到这样的目录结构:

my_robot/
├── urdf/
│   └── my_robot.urdf
├── meshes/
│   ├── base_link.STL
│   ├── shoulder_link.STL
│   └── ...
├── config/
│   └── joint_limits.yaml
└── launch/
    └── display.launch

2.5 在 Rviz 中可视化模型

模型导出了,怎么检查对不对?用 Rviz。我每次改完 URDF,第一件事就是打开 Rviz 看一眼。

启动命令很简单:

roslaunch my_robot display.launch

在 Rviz 里,添加 RobotModel 显示插件,选择你的 URDF 文件。如果模型显示正常,恭喜你。如果零件飞了或者错位,八成是 joint 的 origin 写错了。

调试技巧:在 Rviz 里勾选「Show Axes」,每个 link 的坐标系都会显示出来。一眼就能看出哪个关节的轴方向不对。这招我用了好几年,屡试不爽。

2.6 本章知识体系

下面这张图是我自己画的,把 URDF 的核心逻辑串起来了:

URDF 机器人模型 link(刚体零件) visual(视觉) collision(碰撞) inertial(惯性) joint(关节) parent / child link origin(位置偏移) axis(旋转轴) 工具:SolidWorks sw2urdf → Rviz 可视化验证

这张图你看懂了吗?左边是 link 的三个属性,右边是 joint 的三个关键参数。上下是工具链。整个 URDF 建模,就是把这些东西填对。

最后说一句:URDF 不难,但细节多。我建议你每写一个 joint,就在 Rviz 里看一眼。别等全部写完再调试,那会疯掉的。

可可精品资料库