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 的作用分成三个层次:

  1. 可视化层:在 Rviz、Gazebo 里看到机器人长什么样,关节怎么动。
  2. 物理层:提供惯性、碰撞、摩擦等参数,让仿真引擎知道这个机器人「有多重」「撞到东西会怎样」。
  3. 算法层: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 系统中的位置,我画了一张结构图:

URDF 在 ROS 系统中的位置与作用 URDF 文件 robot_state_publisher 解析 Rviz 可视化 Gazebo 仿真 MoveIt 运动规划 TF 变换树 物理引擎参数 运动学模型 一句话总结 URDF 是 ROS 机器人系统的「数据底座」,所有上层功能都依赖它提供的基础信息

1.5 本章小结——你该带走什么?

  • URDF 是 XML 文件,用来描述机器人的结构和属性。
  • 核心标签只有两个:<link> 和 <joint>,一个管「零件」,一个管「连接」。
  • URDF 不是摆设,它直接影响 Rviz 显示、Gazebo 仿真、MoveIt 运动规划等所有上层功能。
  • 写 URDF 前先画结构图,这是我个人的铁律。别急着敲代码,想清楚再动手。

嗯,第一章就到这里。内容不多,但都是基础中的基础。后面的章节我们会逐行拆解 <link> 和 <joint> 的每一个属性,到时候你会发现——原来 URDF 里藏着这么多细节。