1 · URDF基础入门
各位好,我是你们这门课的老朋友。今天咱们从最根儿上的东西聊起——URDF。你可能会想,不就是个描述机器人的XML文件吗?对,但也不全对。我做了这么多年机器人,URDF就像机器人的“身份证”,没有它,导航、规划、仿真全都玩不转。
什么是URDF?说白了就是机器人的“骨架描述”
URDF 全称 Unified Robot Description Format,统一机器人描述格式。嗯,名字挺长,但核心就一句话:用XML告诉计算机你的机器人长什么样、关节怎么动。我习惯把它想象成乐高说明书——每个零件(link)长啥样,怎么拼(joint),清清楚楚。
你可能会问:为什么不用CAD文件?CAD太“重”了,ROS要的是轻量、可计算、能实时解析的模型。URDF就是为这个而生的。我在项目里见过有人直接把SolidWorks模型转成URDF,但说实话,手写一个简单模型往往更可控。
- link —— 刚体部件(底盘、轮子、激光雷达…)
- joint —— 连接两个link,定义运动类型(旋转、滑动、固定…)
- robot —— 根标签,包含所有link和joint
URDF在ROS中的作用——不只是“看着像”
很多新手觉得URDF就是用来在Rviz里显示个机器人模型。其实它的作用远不止于此。你想想看:
- 导航 —— 代价地图需要知道机器人 footprint,URDF直接提供轮廓。
- TF坐标树 —— 每个link就是一个坐标系,joint定义了变换关系。
- 物理仿真 —— Gazebo根据URDF计算碰撞、惯性、摩擦。
- 路径规划 —— 规划器要避开自身碰撞,靠的就是URDF的碰撞模型。
我记得有一次调试导航,机器人一直原地转圈,查了半天发现是URDF里轮子joint的type写成了"continuous"而不是"revolute"。一个小错误,折腾了一下午。所以啊,URDF的准确性直接影响整个系统。
我曾经在定义轮子joint时忘了设置
<limit>标签,结果仿真时轮子疯狂空转。后来养成习惯:每个旋转关节都配上effort和velocity限制,哪怕只是仿真。
搭建第一个URDF模型——两连杆摆臂
光说不练假把式。咱们直接上手写一个最简单的URDF:一个基座 + 一个连杆,中间用旋转关节连起来。就像机器人的一条手臂。
先创建文件 my_first_robot.urdf,内容如下:
<?xml version="1.0"?>
<robot name="simple_arm">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.1 0.05"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
</link>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.02"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0.15 0"/>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
<joint name="arm_joint" type="revolute">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0.05 0"/>
<axis xyz="0 0 1"/>
<limit effort="10" velocity="1" lower="-1.57" upper="1.57"/>
</joint>
</robot>
来,咱们拆开看看:
- base_link —— 一个蓝色小方块,代表底座。
- arm_link —— 红色圆柱体,代表摆臂。
- arm_joint —— 旋转关节,绕Z轴转动,角度限制在±90°。
保存文件后,用ROS自带的工具检查一下:
# 安装urdf_tutorial (如果没装)
sudo apt install ros-${ROS_DISTRO}-urdf-tutorial
# 检查URDF语法
check_urdf my_first_robot.urdf
如果输出没有报错,恭喜你,第一个URDF模型诞生了!
URDF文件里所有的单位都是国际单位制:米、弧度、千克、秒。我见过有人把尺寸写成厘米,结果模型在Rviz里小得像蚂蚁。记得统一单位。
你可以在Rviz里直接加载这个URDF:
# 启动Rviz并加载模型
ros2 run urdf_tutorial display my_first_robot.urdf # ROS2 示例
# 或者 ROS1 下使用:
roslaunch urdf_tutorial display.launch model:=my_first_robot.urdf
看到那个红色摆臂了吗?拖动关节滑块,它就会动起来。嗯,这就是URDF的魅力——从静态描述到动态交互。
URDF是ROS生态的基石。它用link和joint定义了机器人的“骨骼”。今天咱们从零搭了一个两连杆模型,虽然简单,但麻雀虽小五脏俱全。后面的章节会逐步加入轮子、传感器、碰撞属性……一步步搭建一个完整的导航机器人。