1、URDF入门:什么是URDF、URDF在ROS中的作用、URDF文件的基本结构概览
1.1 什么是URDF?说白了就是机器人的「骨架说明书」
URDF,全称是 Unified Robot Description Format,统一机器人描述格式。嗯,名字挺长,但本质很简单——它是一个 XML 文件,用来描述机器人长什么样、关节怎么动。
我刚开始接触机器人时,觉得 URDF 就是个「高级配置文件」。后来做项目多了才发现,它其实是整个 ROS 生态里最基础、也最容易被忽视的一环。你想想看,没有 URDF,你的机器人在仿真环境里就是一团空气,导航、避障、运动规划全都无从谈起。
核心定义:URDF 用 XML 标签描述机器人的连杆(link)和关节(joint),包括几何形状、位置、质量、惯性、碰撞模型等。它是 ROS 中机器人模型的「官方语言」。
1.2 URDF在ROS中的作用——不只是「画个模型」那么简单
很多人以为 URDF 就是用来在 Rviz 里显示个机器人样子,其实远不止这些。我个人习惯把 URDF 的作用分成三个层次:
- 可视化层:在 Rviz、Gazebo 里看到机器人长什么样,关节怎么动。
- 物理层:提供惯性、碰撞、摩擦等参数,让仿真引擎知道这个机器人「有多重」「撞到东西会怎样」。
- 算法层:MoveIt、导航栈、运动学求解器都依赖 URDF 来获取机器人的运动学树结构。
我曾经在一个 AGV 项目里踩过坑——URDF 里忘了定义 base_link 到激光雷达的变换,结果导航包死活不认数据。排查了两天才发现,原来是少写了一个 joint 标签。从那以后,我每次写 URDF 都会先画一遍结构图,再动手写代码。
避坑指南:URDF 不是「画图工具」,它是机器人软件栈的「数据契约」。写错了,整个系统都会跟着错。
1.3 URDF文件的基本结构概览
一个标准的 URDF 文件,结构其实很清晰。我把它拆成四个核心部分:
| 组成部分 | 标签 | 作用 | 必填? |
|---|---|---|---|
| 根节点 | <robot> |
整个文件的容器,包含 name 属性 | 是 |
| 连杆 | <link> |
描述机器人的刚体部件(形状、尺寸、颜色、惯性) | 至少1个 |
| 关节 | <joint> |
描述两个连杆之间的连接关系(类型、位置、运动范围) | 至少1个 |
| 可选扩展 | <gazebo> 等 |
为 Gazebo 仿真提供额外参数(摩擦、阻尼等) | 否 |
来看一个最简单的 URDF 示例——一个单连杆机器人:
<?xml version="1.0"?>
<robot name="my_first_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
</visual>
</link>
</robot>
这个文件定义了一个叫 my_first_robot 的机器人,它只有一个连杆 base_link,形状是长方体,长宽高分别是 0.2m、0.2m、0.1m。没有关节,所以它不会动——但至少能在 Rviz 里显示出来了。
注意:URDF 文件是严格的 XML 格式。标签必须闭合,属性值必须加引号。我曾经见过有人把 <box size="0.2 0.2 0.1"/> 写成 <box size=0.2 0.2 0.1>,结果解析器直接报错。XML 的严谨性,在这里不是摆设。
1.4 URDF的核心知识体系
为了让你更直观地理解 URDF 在整个 ROS 系统中的位置,我画了一张结构图:
1.5 本章小结——你该带走什么?
- URDF 是 XML 文件,用来描述机器人的结构和属性。
- 核心标签只有两个:
<link>和<joint>,一个管「零件」,一个管「连接」。 - URDF 不是摆设,它直接影响 Rviz 显示、Gazebo 仿真、MoveIt 运动规划等所有上层功能。
- 写 URDF 前先画结构图,这是我个人的铁律。别急着敲代码,想清楚再动手。
嗯,第一章就到这里。内容不多,但都是基础中的基础。后面的章节我们会逐行拆解 <link> 和 <joint> 的每一个属性,到时候你会发现——原来 URDF 里藏着这么多细节。