URDF(Unified Robot Description Format)是 ROS 生态中用于描述机器人结构的 XML 格式,定义 link、joint、坐标变换、几何、惯量和关节限位等模型信息。
它是很多机器人软件的共同输入:Pinocchio 可以从 URDF 构建运动学/动力学 model,MoveIt 可以用 URDF 构建 robot model 和碰撞几何,仿真器也常用它渲染机器人和初始化关节树。
核心问题
机器人软件需要一个机器可读的结构模型,回答:
- 机器人有哪些 link 和 joint?
- 相邻 link 之间的固定原点、旋转轴和运动类型是什么?
- 每个关节的上下限、速度或 effort 限制是多少?
- 用于可视化、碰撞和动力学计算的几何与惯量是什么?
没有一致的 URDF,FK、IK、碰撞检查和可视化就可能在不同软件里使用不同的“机器人”。
核心结构
URDF 主要由 link 和 joint 组成:
link描述机器人刚体段,可包含 visual、collision 和 inertial。joint连接父 link 与子 link,定义 origin、axis、type 和 limit。origin定义坐标系偏置;axis定义关节运动方向。limit定义位置、速度、effort 等约束。
工程中常用 Xacro 生成 URDF。Xacro 是模板/宏机制,最终仍要展开为具体 URDF 后交给下游库使用。
工程用途
URDF 在运动学与控制链路中通常承担“结构真相源”的角色:
- Pinocchio 或 KDL 根据 URDF 生成运动学链,计算 FK 和 Jacobian。
- MoveIt PlanningScene 使用 URDF/SRDF 的 collision geometry 做碰撞检查。
- MoveIt RobotState 使用 robot model 中的 joint/link 信息更新当前位姿。
- IK 和 servo 配置依赖 group、tip frame、base frame 与 joint limit 的一致性。
边界与常见坑
URDF 只描述机器人模型,不描述“控制策略”。它不会自动提供 IK、servo、安全状态机或硬件驱动。
常见错误包括:
- frame 名称、joint 顺序、axis 方向或零位与实机不一致。
- collision mesh 太粗或太细,导致碰撞检查误报、漏报或耗时过高。
- visual mesh 单位或原点正确,但 collision/inertial 原点错误。
- URDF 中 hard limit 与控制器、MoveIt
joint_limits.yaml或硬件实际限位不一致。 - 末端工具、相机、夹爪等 TCP 偏置没有建模,导致 IK 看似收敛但实机末端偏移。