4、机器人模型(Robot Model)配置:URDF与Nav2的关系、配置机器人 footprint、配置机器人 base_frame、odom_frame、map_frame
好,咱们今天聊点实在的。机器人模型配置,说白了就是告诉Nav2你的机器人长什么样、怎么动、在哪儿。我刚开始接触Nav2的时候,觉得这步就是填几个参数,结果一跑起来,机器人要么原地打转,要么撞墙。后来才明白——模型配不好,导航全白搞。
4.1 URDF与Nav2的关系
URDF,全称是Unified Robot Description Format。它用XML描述机器人的物理结构:轮子、底盘、传感器、关节……Nav2本身不直接解析URDF,但它依赖URDF提供的信息来做两件事:
- 碰撞检测:导航时,机器人不能跟障碍物重叠。URDF里定义了每个部件的碰撞形状,Nav2就用这个来判断“能不能过”。
- 坐标系变换:URDF里定义了各个link之间的tf关系。比如激光雷达装在底盘上多高、多偏。Nav2需要知道传感器相对于机器人的位置,才能正确感知环境。
我个人习惯,URDF文件里至少要有三个部分:
- base_link:机器人的本体,所有其他部件都挂在这个下面。
- 激光雷达或深度相机:感知传感器,必须定义清楚安装位置。
- 轮子或驱动机构:虽然Nav2不直接控制轮子,但里程计需要知道轮子的位置。
核心要点:URDF不是给Nav2看的,是给整个ROS2生态看的。Nav2通过tf和costmap来间接使用URDF的信息。所以URDF配错了,导航一定出问题。
4.2 配置机器人 footprint
Footprint,就是机器人的“脚印”。它定义了机器人在二维平面上的投影形状。Nav2用这个来判断机器人能不能通过某个狭窄区域。
Footprint有两种配置方式:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 多边形 | 用一系列二维点定义轮廓 | 矩形、圆形、不规则形状 |
| 圆形 | 指定半径 | 圆形机器人,或近似圆形 |
举个例子,一个矩形机器人,长0.5米,宽0.3米,footprint可以这样配:
footprint: [[0.25, 0.15], [0.25, -0.15], [-0.25, -0.15], [-0.25, 0.15]]
注意顺序:逆时针或顺时针都行,但必须闭合。我遇到过一个问题——点顺序写反了,结果机器人把自己当成了障碍物,死活不走。排查了半天才发现是footprint定义反了。
小技巧:如果你的机器人形状复杂,可以用footprint_padding参数加一圈安全距离。比如设成0.05米,相当于给机器人穿了一层“防护服”。
4.3 配置机器人 base_frame
Base frame,就是机器人的“原点”。Nav2里默认叫base_link。所有传感器、执行器的坐标都相对于这个原点。
配置base_frame其实很简单,在Nav2的参数文件里指定:
local_costmap:
robot_base_frame: base_link
global_costmap:
robot_base_frame: base_link
但这里有个坑——你的URDF里必须有一个叫base_link的link。如果名字对不上,Nav2启动时会报tf错误。我记得有一次,团队里有人把base_link改成了chassis,结果导航完全跑不起来。查了半天才发现是名字不匹配。
注意:base_frame不一定是物理中心。比如差速机器人,base_link通常设在两个驱动轮的中点。全向轮机器人,base_link可以设在底盘几何中心。关键是——所有传感器和轮子的tf关系都要相对于这个点定义清楚。
4.4 配置 odom_frame
Odom frame,里程计坐标系。它负责记录机器人从起点开始走了多远、转了多少角度。Nav2用odom frame来做局部路径规划和速度控制。
配置方式:
local_costmap:
global_frame: odom
Odom frame的数据来源通常是轮式里程计、IMU或者视觉里程计。我个人建议,如果条件允许,用轮式里程计+IMU融合,效果比单用轮式好很多。纯轮式里程计在打滑的地面上会漂移,IMU能帮忙修正。
这里有个关键点:odom frame和map frame之间的tf关系,是由定位模块(比如AMCL)发布的。Nav2不负责这个。所以如果你的定位不准,odom frame就会漂,导航自然就歪了。
经验之谈:我曾经在一个瓷砖地面上跑机器人,轮子打滑严重,odom frame漂得离谱。后来加了IMU做融合,效果立竿见影。所以——别指望纯轮式里程计能搞定所有地面。
4.5 配置 map_frame
Map frame,地图坐标系。它是全局的、固定的。Nav2用map frame来做全局路径规划和障碍物地图维护。
配置方式:
global_costmap:
global_frame: map
Map frame的坐标原点,通常由建图算法决定。比如你用SLAM Toolbox建图,地图的原点就是建图开始时机器人的位置。之后每次导航,map frame都保持不变。
三个坐标系的关系,我用一张图来说明:
这张图展示了三个坐标系的关系。map是固定的,odom会随着机器人移动而漂移,base_link跟着机器人走。Nav2通过tf树来维护它们之间的变换关系。
配置总结:
- URDF定义机器人的物理结构和传感器位置
- Footprint告诉Nav2机器人占多大地方
- Base frame是机器人的原点,所有坐标都相对于它
- Odom frame记录里程信息,用于局部规划
- Map frame是全局参考系,用于全局规划
这五个要素配齐了,导航的基础就搭好了。剩下的就是调参数、跑测试。
嗯,模型配置这块,说白了就是让Nav2认识你的机器人。别小看这一步,我见过太多人在这上面栽跟头。配好了,后面一路顺畅;配不好,后面全是坑。