第2章 机器人建模基础

URDF 文件结构解析 · link 与 joint 定义 · xacro 优化技巧 · SolidWorks 导出 URDF · 模型可视化与检查

机器人建模基础 URDF 结构解析 link / joint 定义 xacro 优化 几何/惯性 碰撞/视觉 固定/旋转 连续/浮动 宏/数学 文件包含

说实话,URDF 是 ROS 机器人建模的基石。你想想看,没有模型,MoveIt 怎么知道你的机械臂长什么样?SLAM 又怎么把激光数据和机器人本体对应起来?URDF 就是机器人的「骨架说明书」。这一章我会带着你把 URDF 的里里外外拆开揉碎,再聊点我这些年踩过的坑。

2.1 URDF 文件结构解析

URDF 全称 Unified Robot Description Format,基于 XML。说白了就是一个树形结构,根节点是 <robot>,里面包含一堆 <link> 和 <joint>。我习惯把 link 想象成骨骼,joint 就是关节。

核心骨架:

<robot name="my_robot">
  <link name="base_link"> ... </link>
  <link name="arm_link1"> ... </link>
  <joint name="joint1" type="revolute"> ... </joint>
</robot>

每个 link 必须定义视觉、碰撞和惯性参数。我记得刚入行时偷懒没写惯性数据,结果仿真时机器人直接飞上天——嗯,物理引擎可不会跟你客气。

2.2 link 与 joint 定义

link 包含三块:<visual>(长什么样)、<collision>(碰撞检测用)、<inertial>(质量/惯量)。joint 则决定两个 link 怎么连,类型有 revolute、prismatic、fixed、floating、continuous 和 planar。

joint 类型自由度典型用途
revolute1 (旋转,有限位)关节臂肘部
prismatic1 (平移,有限位)伸缩滑台
fixed0固定连接(如相机支架)
continuous1 (旋转,无限位)轮子、转台
floating6自由漂浮(无人机、移动基座)

💡 我的习惯: 定义 joint 时一定把 <origin> 和 <axis> 写清楚。曾经因为 axis 写反了,机械臂朝反方向转,排查了整整一下午。

2.3 xacro 优化技巧

手写 URDF 太痛苦了,尤其是六轴机械臂,重复代码能写到崩溃。xacro 就是救星。它支持宏定义、数学运算、条件语句和文件包含。

<xacro:macro name="box_link" params="name length width height mass">
  <link name="${name}">
    <visual>
      <geometry><box size="${length} ${width} ${height}"/></geometry>
    </visual>
    <inertial>
      <mass value="${mass}"/>
      <inertia ixx="..." iyy="..." izz="..."/>
    </inertial>
  </link>
</xacro:macro>

我个人特别喜欢用 ${} 做数学计算,比如 ${length/2} 自动算偏移。你想想看,改一个参数,整个模型跟着变,多爽。

⚠️ 避坑: xacro 文件里不要用 tab 缩进,有些解析器会报错。统一用空格。我曾经因为这个在 CI 上卡了半小时。

2.4 使用 SolidWorks 导出 URDF

从 CAD 到 URDF,最成熟的方式是用 SolidWorks 的 sw2urdf 插件。流程很简单:

  1. 在 SolidWorks 里建好装配体,给每个零件定义好坐标系和旋转轴。
  2. 安装 sw2urdf 插件(免费,支持 SW2016 以上)。
  3. 依次选择 base link、joint 类型、子 link,插件自动生成 URDF 和 mesh 文件。

但要注意,导出的惯性数据有时不准。我一般会再用 check_urdf 工具验证一遍。另外,mesh 文件建议转成 STL 或 Collada(.dae),别用原生的 SLDPRT。

导出后必做三件事:

  • 运行 check_urdf my_robot.urdf 检查语法
  • 用 urdf_to_graphiz 生成结构图
  • 在 Rviz 里加载,看模型是否飘在空中

2.5 模型可视化与检查

可视化是建模的「照妖镜」。我常用的工具链:

  • Rviz:加载 URDF,看 link 位置、关节树、碰撞网格。
  • joint_state_publisher:手动拖动关节,检查运动学正解。
  • urdf_sim_tutorial:轻量仿真,快速验证。

记得有一次,我导出的模型在 Rviz 里手臂反折——原来是 joint 的 <origin rpy="..."/> 写反了。用 tf_echo 一查,坐标系全乱套。所以我的建议是:每加一个 joint 就用 Rviz 看一眼,别等全写完再查。

🔧 小技巧: 在 Rviz 中把 RobotModel 的 Alpha 调成 0.5,能看到内部坐标系,排查碰撞特别方便。

好了,这一章的内容就是这些。URDF 是后面所有章节的基石——MoveIt 配置、SLAM 坐标同步、运动学求解,全都依赖一个准确的模型。