1. 导航系统架构:ROS Navigation Stack 整体架构

各位同学,咱们今天正式开讲导航调参。说实话,我做了这么多年机器人系统,最头疼的就是导航这一块。你想想看,一个机器人能不能在复杂环境里跑起来,全靠导航系统撑腰。ROS 官方给了一套 Navigation Stack,说白了就是一套现成的导航框架。但框架归框架,真要调好,还得下功夫。

我个人习惯,先看整体架构,再拆细节。这样心里有张图,后面调参才不会迷路。

核心观点:ROS Navigation Stack 是一个基于代价地图的导航框架,核心是 move_base 节点。它把传感器数据、里程计、地图信息整合起来,输出速度指令给底盘。

1.1 整体架构概览

ROS Navigation Stack 的架构,我画了一张图,你一看就明白。

ROS Navigation Stack 整体架构图 ROS Navigation Stack 整体架构 传感器输入 里程计输入 地图服务 move_base 核心节点 全局规划器 global_planner 局部规划器 local_planner 恢复行为 recovery_behaviors 全局代价地图 global_costmap 局部代价地图 local_costmap 速度指令输出 (cmd_vel) 💡 说明:传感器数据经过代价地图融合,规划器在代价地图上搜索路径,最终输出速度指令。 恢复行为在机器人卡住时触发,尝试脱困。

这张图里,最核心的就是中间那个大框——move_base。它就像一个交通指挥中心,所有数据都汇聚到这里,然后输出速度指令。

我记得刚入行那会儿,总觉得导航就是给个目标点,机器人自己就能走。后来踩了坑才发现,每个模块之间耦合很深。你调一个参数,可能影响全局。

1.2 move_base 核心组件

move_base 里面到底装了啥?我拆开给你看。

组件 功能 我踩过的坑
全局规划器 在全局代价地图上规划从起点到终点的路径 地图分辨率设太大,路径直接穿墙
局部规划器 根据全局路径和实时传感器数据,生成速度指令 加速度设太小,机器人原地打转
恢复行为 机器人卡住时尝试旋转、后退等动作脱困 恢复次数设太多,机器人反复转圈
全局代价地图 静态地图 + 膨胀层,用于全局规划 膨胀半径设太大,窄通道全堵死
局部代价地图 动态障碍物实时更新,用于局部规划 更新频率太低,撞上突然出现的障碍物

这里我要特别说一下全局规划器和局部规划器的关系。全局规划器负责大方向,局部规划器负责避障。说白了,全局规划器是战略层,局部规划器是战术层。

我的经验:全局规划器用 Dijkstra 还是 A*?我个人习惯用 A*,效率高。但如果地图特别大,Dijkstra 更稳定。你可以在参数文件里切换,试试看哪种适合你的场景。

1.3 代价地图与规划器

代价地图,说白了就是一张带权重的栅格地图。每个格子都有一个代价值,数值越高,机器人越不想走。

代价地图分两层:

  • 静态层:从预先建好的地图加载,比如激光SLAM扫出来的地图。
  • 障碍物层:实时传感器数据,比如激光雷达检测到的动态障碍物。
  • 膨胀层:把障碍物往外扩一圈,防止机器人蹭到墙。

嗯,这里要注意膨胀半径。我曾经在一个项目里,把膨胀半径设成了0.5米,结果机器人死活过不去一个1米宽的走廊。后来一查,膨胀后有效通道只剩0米了。你说尴尬不尴尬?

避坑指南:膨胀半径不要超过机器人宽度的一半。比如机器人宽0.6米,膨胀半径设0.3米就差不多了。设太大,窄通道全废;设太小,机器人容易刮蹭。

1.4 规划器的工作流程

规划器到底怎么工作的?我画个流程图,你一看就懂。

规划器工作流程 规划器工作流程 接收目标点 全局路径规划 局部路径跟踪 输出速度指令

流程其实不复杂。先接收目标点,全局规划器算出一条路径,然后局部规划器沿着路径走,同时实时避障。每一步都输出速度指令给底盘。

但这里有个关键点——路径更新频率。全局路径不用频繁更新,但局部路径必须高频更新。我一般设局部规划器更新频率在10Hz以上,这样机器人反应才够快。

1.5 参数调优思路

调参这事儿,说白了就是找平衡。我总结了一套思路:

  1. 先调全局规划器:确保路径合理,不穿墙、不绕远路。
  2. 再调局部规划器:让机器人能平稳跟踪路径,不抖动、不原地打转。
  3. 最后调代价地图:膨胀半径、障碍物更新频率,这些直接影响避障效果。

我曾经在一个仓库项目里,机器人总是卡在货架之间。后来发现是局部规划器的最大速度设得太高,机器人一加速就撞到障碍物。把速度降下来,问题就解决了。

核心参数速查表:

参数 推荐范围 影响
global_planner/use_dijkstra false (A*) / true (Dijkstra) 路径搜索效率
local_planner/max_vel_x 0.3 - 0.8 m/s 机器人移动速度
local_planner/min_vel_x 0.05 - 0.1 m/s 低速稳定性
costmap/inflation_radius 0.2 - 0.5 m 障碍物膨胀范围
costmap/obstacle_range 2.0 - 5.0 m 传感器检测距离

嗯,这些参数只是起点。实际项目中,你得根据机器人底盘、传感器、环境来微调。我建议你从推荐范围的中值开始,然后一点点试。

好了,这一章就讲到这里。导航架构是基础,后面每一章都会用到这些概念。你先把这张图刻在脑子里,后面调参的时候,就知道每个参数影响的是哪个模块了。