第2章:URDF与机器人建模

URDF,全称是Unified Robot Description Format。说白了,它就是机器人的「身份证」加「体检报告」。

我刚开始接触机器人时,觉得建模这事挺玄乎。后来才发现,URDF不过是一个XML文件,告诉计算机:你的机器人长什么样,关节能怎么动。

URDF文件结构

一个标准的URDF文件,核心就两样东西:连杆(link)和关节(joint)。

你可以把连杆想象成骨头,关节就是连接骨头的韧带。骨头本身不会动,是韧带让骨头动起来的。

核心原则:每个关节连接两个连杆,一个父连杆,一个子连杆。子连杆绕着父连杆的关节运动。

来看一个最简单的URDF结构:

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.2 0.2 0.1"/>
      </geometry>
    </visual>
  </link>

  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="arm_link"/>
    <origin xyz="0 0 0.05" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
  </joint>

  <link name="arm_link">
    <visual>
      <geometry>
        <cylinder length="0.3" radius="0.02"/>
      </geometry>
    </visual>
  </link>
</robot>

嗯,这里要注意:origin定义的是子连杆相对于父连杆的位置偏移。axis定义的是旋转轴方向。这两个参数搞错了,你的机器人就会「脱臼」。

连杆与关节的详细定义

连杆(link)

每个连杆可以包含三部分信息:

  • visual:视觉显示用的几何体。说白了就是「看起来什么样」。
  • collision:碰撞检测用的几何体。可以比visual简单一些,节省计算资源。
  • inertial:惯性参数,包括质量、惯性矩阵。这个在动力学仿真中至关重要。

我的经验:很多初学者只写visual,不写collision和inertial。这在纯可视化没问题,但一旦要做运动规划或动力学仿真,就会报错。我建议从一开始就把三个部分都写上,哪怕collision直接用visual的几何体也行。

关节(joint)

关节类型决定了运动方式。常用的有:

类型 说明 典型应用
revolute 旋转关节,有角度限制 肩关节、肘关节
continuous 连续旋转关节,无限制 车轮、末端执行器
prismatic 平移关节 升降台、滑轨
fixed 固定关节,不能运动 传感器支架

我曾经犯过一个低级错误:把旋转关节写成了fixed类型。结果在MoveIt里怎么规划都动不了,查了半天才发现是关节类型写错了。你想想看,一个固定住的关节,怎么可能动呢?

使用SolidWorks导出URDF

手工写URDF对于简单模型还行。但真实机器人有几十个零件,手写会疯掉的。这时候就需要工具了。

SolidWorks有一个官方插件叫sw2urdf,可以一键导出。流程大致如下:

  1. 在SolidWorks中装配好机器人模型
  2. 定义每个零件的坐标系和关节轴
  3. 运行sw2urdf插件,选择基准连杆
  4. 插件自动生成URDF文件和mesh文件

避坑指南:我曾经导出一个六轴机械臂,结果在Rviz里看到手臂是歪的。排查后发现是SolidWorks里的坐标系和ROS的坐标系不一致。ROS遵循右手定则,Z轴向上。而SolidWorks默认Z轴是朝前的。所以导出前一定要检查坐标系对齐。

导出后你会得到一堆文件:一个.urdf文件,以及一个meshes文件夹,里面是.stl或.dae格式的网格文件。这些网格文件就是机器人的「皮肤」。

在Rviz中可视化机器人模型

URDF写好了,怎么验证对不对?用Rviz。

启动命令很简单:

ros2 launch urdf_tutorial display.launch.py model:=/path/to/your_robot.urdf

或者用更直接的方式:

ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:=$(cat /path/to/your_robot.urdf)

然后在Rviz中添加RobotModel显示组件,选择/robot_description话题。如果一切正常,你会看到你的机器人出现在3D场景中。

我习惯在Rviz里做三件事来验证模型:

  • 拖动关节:在Joint State Publisher里拖动滑块,看关节运动是否正常
  • 检查碰撞:看连杆之间有没有互相穿透
  • 检查原点:看每个连杆的坐标系是否在正确位置

一个实用技巧:在Rviz中显示连杆的坐标系(勾选Show Axes),可以直观地看到每个关节的旋转轴方向。如果轴方向错了,机器人运动起来会像「抽筋」一样。

URDF 机器人建模知识体系 URDF 机器人描述 文件结构:XML 格式 link(连杆) joint(关节) robot(根标签) 建模方式 手工编写 URDF SolidWorks sw2urdf 导出 其他 CAD 工具导出 Rviz 可视化验证

这张图把本章的知识点串起来了。从URDF文件结构出发,到两种建模方式,最后用Rviz验证。每一步都有坑,但每一步也都有方法。

我个人觉得,URDF建模是机器人开发中最「实在」的一步。模型建好了,后面的运动规划、抓取控制才有根基。模型建歪了,后面全是白费功夫。

最后一个小建议:刚开始做URDF时,不要追求完美。先搭一个能动的骨架,再慢慢加细节。我见过太多人花一周时间调模型外观,结果运动学一塌糊涂。记住,功能优先,外观其次。