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文件里至少要有三个部分:

  1. base_link:机器人的本体,所有其他部件都挂在这个下面。
  2. 激光雷达或深度相机:感知传感器,必须定义清楚安装位置。
  3. 轮子或驱动机构:虽然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 机器人本体 AMCL发布 里程计发布 坐标系变换链:map → odom → base_link 每个箭头代表一个tf变换,由不同模块发布

这张图展示了三个坐标系的关系。map是固定的,odom会随着机器人移动而漂移,base_link跟着机器人走。Nav2通过tf树来维护它们之间的变换关系。

配置总结:

  • URDF定义机器人的物理结构和传感器位置
  • Footprint告诉Nav2机器人占多大地方
  • Base frame是机器人的原点,所有坐标都相对于它
  • Odom frame记录里程信息,用于局部规划
  • Map frame是全局参考系,用于全局规划

这五个要素配齐了,导航的基础就搭好了。剩下的就是调参数、跑测试。

嗯,模型配置这块,说白了就是让Nav2认识你的机器人。别小看这一步,我见过太多人在这上面栽跟头。配好了,后面一路顺畅;配不好,后面全是坑。

可可精品资料库