第2章:机械臂URDF建模基础

URDF,全称是Unified Robot Description Format。说白了,它就是ROS世界里描述机器人长什么样的标准语言。你想想看,要让Gazebo里跑起一个机械臂,总得告诉它:你的胳膊多长、关节在哪、长啥样、多重吧?URDF就是干这个的。

我个人习惯,把URDF理解成机器人的「身份证+体检报告」。它不光描述外观,还描述物理属性。嗯,这里要注意,URDF只适用于树状结构的机器人——也就是每个部件只有一个父级。像人形机器人那种有闭环结构的,就得用别的格式了。

核心要点:URDF是ROS2和Gazebo的通用语言。你建模的好坏,直接决定了后面仿真的成败。我在项目中见过太多人,URDF写得马马虎虎,结果仿真时机械臂直接「飞」出去了——其实就是惯性参数没写对。

2.1 URDF语法详解

URDF用XML格式写。别怕,标签就那么几个。我带你过一遍最核心的:link、joint、visual、collision、inertial。

2.1.1 link——机器人的「骨头」

每个link代表一个刚体部件。比如机械臂的基座、大臂、小臂、末端执行器,都是link。一个link里可以嵌套三个子标签:

  • visual:视觉外观。Gazebo里你「看到」的样子。
  • collision:碰撞模型。用于物理引擎计算碰撞。
  • inertial:惯性参数。质量、重心、转动惯量。

我刚开始学的时候,经常只写visual,忘了collision和inertial。结果呢?Gazebo里机械臂看起来好好的,一运动就穿模,或者直接翻车。避坑指南:三个子标签一个都不能少。

2.1.2 joint——连接link的「关节」

joint描述两个link之间的运动关系。常用的joint类型有:

类型 说明 典型应用
revolute 旋转关节,有角度限制 机械臂肩关节、肘关节
continuous 旋转关节,无角度限制 车轮、转台
prismatic 平移关节 伸缩臂、滑台
fixed 固定连接 基座与地面、传感器安装

每个joint必须指定parent和child。parent是靠近基座的link,child是远离基座的。这个父子关系决定了运动学树的结构。

我的经验:joint的origin标签特别容易搞错。它定义的是child link相对于parent link的位置和姿态。我曾经因为写反了xyz的正负号,导致机械臂在Rviz里拧成了麻花。建议你每次写完,先用check_urdf工具验证一下。

2.1.3 visual、collision、inertial——三兄弟

这三个标签都放在link里面。它们的关系是这样的:

  • visual:用geometry定义形状(box、cylinder、sphere、mesh),用material定义颜色。
  • collision:形状通常和visual一样,但可以简化。比如一个复杂的机械爪,visual用精细的STL,collision用几个box拼起来。这样仿真更快。
  • inertial:包含mass(质量)、origin(重心位置)、inertia(转动惯量矩阵)。

嗯,这里要特别强调inertial。很多初学者直接抄网上的模板,惯性参数随便填。结果仿真时机械臂像在太空中一样飘。我建议你:用SolidWorks导出时,惯性参数一定要勾选导出。后面我会细说。

2.2 使用SolidWorks导出URDF

手动写URDF?对于简单模型还行。但一个六轴机械臂,几十个零件,手写会疯掉的。所以,我们用SolidWorks插件来自动导出。

流程其实很简单:

  1. 在SolidWorks里装配好机械臂模型。
  2. 安装SW2URDF插件(免费,官网可下)。
  3. 为每个关节定义参考坐标系和旋转轴。
  4. 设置每个link的视觉和碰撞网格。
  5. 导出URDF和所有mesh文件。

我在项目中用过很多次这个流程。有个坑必须提醒你:SolidWorks里的单位是毫米,但URDF默认单位是米。导出时插件会自动转换,但如果你自己手动修改了mesh文件,记得检查一下缩放比例。

注意:导出的URDF里,inertial参数是基于SolidWorks的材质密度自动计算的。如果你改了零件的材质,一定要重新导出。我曾经因为忘记更新,结果仿真时机械臂的动力学完全不对。

2.3 在Rviz2中可视化URDF模型

URDF写好了,怎么验证对不对?Rviz2就是最好的调试工具。

你只需要一个launch文件,加载URDF并发布到/robot_description话题。然后打开Rviz2,添加RobotModel显示插件,就能看到你的机械臂了。

我常用的命令是:

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

如果一切正常,你会看到机械臂在Rviz2里静静躺着。你可以拖动关节滑块,看看运动学对不对。

有一次,我导出一个六轴机械臂,在Rviz2里一看,大臂和小臂的方向完全反了。检查了半天,发现是joint的axis定义错了。所以,Rviz2是你最好的朋友——它让你在写代码之前,先发现几何上的错误。

2.4 本章知识体系

下面这张图,是我为你梳理的本章核心逻辑。URDF建模不是孤立的知识点,它连接了CAD设计、ROS2通信和Gazebo仿真。你把这个图看懂了,后面几章就会很顺。

URDF建模核心流程 SolidWorks建模 装配体 + 定义关节 SW2URDF导出 生成URDF + mesh文件 Rviz2可视化 检查几何与运动学 URDF核心要素(每个link必须包含) visual(外观) collision(碰撞) inertial(惯性) joint(关节定义) 输出:完整可用的URDF模型 后续用于Gazebo仿真、MoveIt运动规划

这张图展示了从建模到验证的完整链路。你跟着这个流程走,基本不会出大问题。

我的建议:第一次做URDF,别追求完美。先导出一个能动的版本,在Rviz2里跑起来。然后再慢慢优化collision和inertial。迭代开发,比一次到位要靠谱得多。

好了,这一章的内容就到这里。URDF是后面所有仿真的基础,你花时间把它搞扎实了,后面会省很多事。下一章,我们会把URDF加载到Gazebo里,让机械臂真正动起来。

可可精品资料库