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 不就行了?”
行是行,但你会遇到三个大坑:
- 关节信息全丢了——SolidWorks 里的配合关系、运动范围、旋转轴,STL 一概不认。你得手动在 URDF 里重新定义每个关节,几十个关节搞下来,不出错才怪。
- 惯性参数全靠猜——ROS 做仿真时,惯性张量是刚需。没有它,重力仿真、碰撞响应全是错的。手动算?我试过一次,算到怀疑人生。
- 坐标系乱成一锅粥——SolidWorks 的默认坐标系和 ROS 的坐标系(右手系,Z 轴向上)经常对不上。你导进去的模型,可能在天上飞,或者在地上钻。
我曾经踩过的坑:有一次做移动机械臂,SolidWorks 里看着好好的,导出 URDF 后机械臂的基座坐标系和底盘坐标系差了 90 度。结果一运动,机械臂直接往底盘里插。查了两天才发现是导出时坐标系没对齐。从那以后,我每次导出前都会在 SolidWorks 里先建一个基准坐标系,对齐 ROS 的规范。
所以,从 SolidWorks 导出 URDF 的核心价值,就是把这三大块信息——几何、关节、惯性——一次性、自动化地提取出来,减少手动出错的概率。
SW2URDF 插件简介
那怎么导?靠手写 XML 吗?当然不是。ROS 社区提供了一个神器——SW2URDF 插件。
这个插件直接跑在 SolidWorks 里,安装后会在菜单栏多出一个 ROS 选项卡。它的工作流程,我画了张图,你看一眼就明白了:
这个插件最厉害的地方在于:它能自动计算惯性张量。你只要在 SolidWorks 里给每个零件指定好材料,插件就能根据密度和几何形状,算出质心位置和 3x3 的惯性矩阵。这个手动算的话,没个半天搞不定。
个人建议:第一次用 SW2URDF 时,先拿一个简单的模型练手——比如两连杆的机械臂。别一上来就搞整机。我见过太多人,直接拿 50 个零件的装配体去导,结果报错一堆,根本不知道从哪查起。
插件导出的产物通常包括:
| 文件/文件夹 | 说明 |
|---|---|
| robot.urdf | 主 URDF 文件,包含所有 link 和 joint 定义 |
| meshes/ | 存放所有连杆的 STL 网格文件 |
| config/ | 关节配置、传动比等附加信息(可选) |
| launch/ | 示例 launch 文件,方便在 Rviz 中预览 |
嗯,这里要提醒一句:插件不是万能的。它导出的 URDF 基本能用,但往往需要手动微调。比如关节限位的单位、坐标轴的朝向、碰撞模型的简化等等。这些细节,正是咱们这门课要重点解决的问题。