1. SolidWorks与URDF概述

各位工程师朋友,欢迎来到这门课。我是老周,搞了十来年机器人结构设计和仿真。今天咱们聊聊最基础、也最绕不开的一个话题——URDF 到底是什么?为什么非得从 SolidWorks 倒腾出来?

说实话,我最早接触 URDF 的时候也一头雾水。那时候刚做完一个六轴机械臂的结构设计,SolidWorks 里跑得挺好,一拿到 ROS 里就傻眼了——模型不动、关节对不上、碰撞检测全是错的。后来才明白,中间缺了一个关键的桥梁,就是 URDF。

什么是 URDF?

URDF,全称 Unified Robot Description Format,统一机器人描述格式。说白了,它就是一套 XML 格式的“机器人说明书”。

你想想看,ROS 本身不认识 SolidWorks 的 .SLDPRT 文件,也不认识 STEP 或 IGES。它只认一种结构化的文本描述——你的机器人有几个连杆、几个关节、每个关节的运动范围是多少、连杆的几何形状长什么样、质量惯性是多少。这些信息,全写在 URDF 文件里。

核心要点:URDF 不是 3D 模型文件,而是一个“元数据 + 几何引用”的描述文件。它告诉 ROS:“我的机器人长这样,动起来是这样。”

一个典型的 URDF 文件结构大致如下:

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <mesh filename="package://my_robot/meshes/base_link.STL"/>
      </geometry>
    </visual>
    <collision>
      <!-- 碰撞模型,通常简化 -->
    </collision>
    <inertial>
      <!-- 质量、惯性张量 -->
    </inertial>
  </link>
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="arm_link"/>
    <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>
</robot>

嗯,这里要注意:URDF 只支持树状结构,不能有闭环。如果你做的是并联机构或者四足机器人,URDF 就不够用了,得用 SRDF 或者 xacro 来扩展。这个后面章节会细讲。

为什么需要从 SolidWorks 导出 URDF?

这个问题我经常被问到。有人觉得:“我在 SolidWorks 里把模型画好,转成 STL 丢给 ROS 不就行了?”

行是行,但你会遇到三个大坑:

  1. 关节信息全丢了——SolidWorks 里的配合关系、运动范围、旋转轴,STL 一概不认。你得手动在 URDF 里重新定义每个关节,几十个关节搞下来,不出错才怪。
  2. 惯性参数全靠猜——ROS 做仿真时,惯性张量是刚需。没有它,重力仿真、碰撞响应全是错的。手动算?我试过一次,算到怀疑人生。
  3. 坐标系乱成一锅粥——SolidWorks 的默认坐标系和 ROS 的坐标系(右手系,Z 轴向上)经常对不上。你导进去的模型,可能在天上飞,或者在地上钻。

我曾经踩过的坑:有一次做移动机械臂,SolidWorks 里看着好好的,导出 URDF 后机械臂的基座坐标系和底盘坐标系差了 90 度。结果一运动,机械臂直接往底盘里插。查了两天才发现是导出时坐标系没对齐。从那以后,我每次导出前都会在 SolidWorks 里先建一个基准坐标系,对齐 ROS 的规范。

所以,从 SolidWorks 导出 URDF 的核心价值,就是把这三大块信息——几何、关节、惯性——一次性、自动化地提取出来,减少手动出错的概率。

SW2URDF 插件简介

那怎么导?靠手写 XML 吗?当然不是。ROS 社区提供了一个神器——SW2URDF 插件。

这个插件直接跑在 SolidWorks 里,安装后会在菜单栏多出一个 ROS 选项卡。它的工作流程,我画了张图,你看一眼就明白了:

SW2URDF 插件工作流程 SolidWorks 模型 .SLDPRT / .SLDASM 定义基准坐标系 对齐 ROS 规范 配置关节参数 类型 / 轴 / 限位 导出 URDF 生成 .urdf + 网格文件 ROS 验证 check_urdf / Rviz 💡 插件自动完成的工作: • 提取每个零件的 STL 网格 • 计算质量、质心、惯性张量 • 生成关节的 parent/child 关系树

这个插件最厉害的地方在于:它能自动计算惯性张量。你只要在 SolidWorks 里给每个零件指定好材料,插件就能根据密度和几何形状,算出质心位置和 3x3 的惯性矩阵。这个手动算的话,没个半天搞不定。

个人建议:第一次用 SW2URDF 时,先拿一个简单的模型练手——比如两连杆的机械臂。别一上来就搞整机。我见过太多人,直接拿 50 个零件的装配体去导,结果报错一堆,根本不知道从哪查起。

插件导出的产物通常包括:

文件/文件夹 说明
robot.urdf 主 URDF 文件,包含所有 link 和 joint 定义
meshes/ 存放所有连杆的 STL 网格文件
config/ 关节配置、传动比等附加信息(可选)
launch/ 示例 launch 文件,方便在 Rviz 中预览

嗯,这里要提醒一句:插件不是万能的。它导出的 URDF 基本能用,但往往需要手动微调。比如关节限位的单位、坐标轴的朝向、碰撞模型的简化等等。这些细节,正是咱们这门课要重点解决的问题。