news 2026/9/11 8:38:26

第266篇 ROS2 Navigation2框架概览——模块化导航的标配方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第266篇 ROS2 Navigation2框架概览——模块化导航的标配方案

SLAM面试高频题聊完了,定位和建图的问题算是有了一个基本的认识。但机器人光知道自己在哪还不够,它还得能从A点走到B点。这就轮到导航框架登场了。

ROS生态里做导航,十年前只有一个move_base。现在到了ROS2时代,Navigation2(简称Nav2)成了绝对的主流方案。面试问到导航框架,你说只知道move_base,面试官会觉得你还在用上古时代的工具。

这篇文章把Nav2的整体架构拆开来讲,搞清楚它到底有哪些模块、每个模块干什么、为什么要这么设计。

一、从move_base到Nav2:为什么要重写

move_base的问题其实挺多的。

最明显的是架构太死。全局规划器、局部规划器、代价地图,这几个模块之间的耦合度很高,想换一个插件得改一堆代码。而且move_base是单线程的,一个环节卡住整个导航就停了。

ROS2带来了生命周期节点的概念,Nav2就是基于这个重新设计的。每个模块都是一个带生命周期的节点,有自己的状态机——unconfigured、inactive、active、finalized。节点之间通过ROS2的通信机制交互,松耦合、可替换。

// Nav2节点生命周期示例 #include "nav2_util/lifecycle_node.hpp" class MyPlanner : public nav2_util::LifecycleNode { on_configure() -> 加载参数、初始化资源 on_activate() -> 开始工作、发布路径 on_deactivate()-> 停止工作、释放资源 on_cleanup() -> 彻底清理 };

这个设计的好处很直接:你可以单独重启某个模块,不影响其他模块运行。局部规划器挂了,重启局部规划器就行,全局路径不用重新算。

二、Nav2的核心模块

Nav2的架构可以拆成这么几块:

bt_navigator(行为树导航器)——整个导航流程的指挥官。它用行为树来编排导航逻辑,决定什么时候做全局规划、什么时候做局部规划、什么时候恢复。

global_planner(全局规划器)——根据地图算出一条从起点到终点的全局路径。默认用的是NavFn,也可以换成Smac Planner或者Theta*。

controller(局部规划器/控制器)——跟踪全局路径,同时躲避动态障碍物。默认用的是DWB(DWA的改进版),也可以换TEB或者MPC。

costmap_2d(代价地图)——把传感器数据融合成一张"地面俯视图",标记哪里能走、哪里有障碍、哪里要小心。

recovery(恢复行为)——导航失败的时候做补救,比如原地旋转清障、后退几步、重新规划。

waypoint_follower(路点跟随)——支持多点导航,机器人可以按顺序走过一系列路点。

# Nav2参数文件片段 bt_navigator: ros__parameters: default_bt_xml_filename: "navigate_w_replanning.xml" controller_server: ros__parameters: controller_plugins: ["FollowPath"] FollowPath: plugin: "dwb_core::DWBLocalPlanner" max_vel_x: 0.5 min_vel_x: -0.1

参数文件是Nav2配置的核心。所有的插件选择、参数调节都通过YAML文件来管理,不用改代码。

三、数据流:一次完整的导航过程

用户发了一个导航目标(nav2_msgs/action/NavigateToPose),接下来会发生什么?

  1. bt_navigator加载行为树XML,开始执行
  2. 行为树先调用ComputePath动作,让全局规划器算路径
  3. 全局规划器从代价地图读数据,输出Path消息
  4. 行为树调用FollowPath动作,把路径传给控制器
  5. 控制器读取代价地图和里程计,输出cmd_vel速度指令
  6. 如果路径被阻塞,行为树触发恢复节点
  7. 到达目标后,行为树返回成功

整个过程是行为树在驱动。行为树的每个节点都是一个BT动作,对应Nav2里的某个服务端。这种设计让导航逻辑变得非常灵活——改行为树XML就能改导航策略,不用动C++代码。

这里有个细节值得注意:行为树支持"带重规划"的导航模式。默认的行为树模板navigate_w_replanning.xml里,每隔一段时间就会重新调用全局规划器,用最新的传感器数据刷新路径。如果机器人走到一半发现原来的路被堵了,重规划机制会自动生成新的全局路径。

恢复行为也是行为树来管的。常见的恢复策略包括:ClearCostmap(清除代价地图上的残留障碍标记)、Spin(原地旋转一圈,用传感器重新扫描环境)、BackUp(后退一小段距离,脱离困境)。这些恢复动作按优先级排列,行为树会逐个尝试,直到导航能继续。

四、插件机制:Nav2的灵魂

Nav2最强大的设计是插件机制。每个服务器都支持插件加载,你可以按需替换任何模块。

// 注册自定义全局规划器插件 #include "nav2_core/global_planner.hpp" class MyGlobalPlanner : public nav2_core::GlobalPlanner { public: void configure() override { /* 初始化 */ } void cleanup() override { /* 清理 */ } void activate() override { /* 激活 */ } void deactivate() override { /* 停用 */ } nav_msgs::msg::Path createPlan( const geometry_msgs::msg::PoseStamped & start, const geometry_msgs::msg::PoseStamped & goal) override { // 你的规划算法 } };

写完插件后,在参数文件里注册一下就能用:

planner_server: ros__parameters: planner_plugins: ["GridBased"] GridBased: plugin: "my_package/MyGlobalPlanner"

这种设计在工程上非常实用。不同项目对导航的需求差异很大——仓储AGV要高效的路径规划,服务机器人要平滑的运动轨迹,巡检机器人要可靠的避障。通过插件机制,同一套框架可以适配不同场景。

五、面试怎么聊Nav2

Q:Nav2和move_base的核心区别是什么?A:架构设计完全不同。Nav2基于ROS2生命周期节点,模块化程度更高;用行为树替代了有限状态机,导航逻辑更灵活;支持多线程并行执行,不会因为一个模块阻塞整个系统。

Q:Nav2的行为树起什么作用?A:行为树是Nav2的"大脑",负责编排整个导航流程。什么时候规划路径、什么时候跟踪、什么时候做恢复,都由行为树决定。好处是修改导航策略只需要改XML文件,不需要改代码和重新编译。

Q:如何给Nav2添加自定义插件?A:继承对应的基类(比如nav2_core::GlobalPlanner),实现虚函数,用pluginlib注册,在参数文件里指定插件路径。Nav2启动时会自动加载。

Q:Nav2的代价地图和move_base的有什么区别?A:核心算法差不多,但Nav2的代价地图支持多图层动态加载,可以用pluginlib动态添加新的图层。而且每个代价地图可以单独设分辨率和滚动范围,灵活性更好。

面试的时候,能把Nav2的模块划分和数据流说清楚,就能证明你确实看过源码或者做过项目。如果还能聊插件开发和行为树设计,那就是加分项了。

小结

Nav2的核心设计理念就三个:模块化(生命周期节点+插件机制)、灵活性(行为树编排导航逻辑)、可扩展(所有模块都能替换)。

从move_base到Nav2的升级不只是换了个ROS版本,而是整个架构思路的进化。理解了Nav2的设计,后面我们聊代价地图、全局规划器、局部规划器的时候,你就知道它们在框架里的位置了。


SLAM系列我们花了大量篇幅讲定位和建图,接下来30篇我们进入导航领域,从代价地图到路径规划,从行为树到多机器人协调,把Nav2相关的面试知识全部覆盖。

上一篇:第265篇 SLAM面试高频题

下一篇我们来聊代价地图的原理——机器人"眼中"的世界到底长什么样。

如果这篇文章对你有帮助,欢迎点赞支持一下,你的鼓励是我持续更新的动力!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 15:21:02

加密原理详解:对称式加密VS非对称式加密

一、前言 在了解加密原理前,我们来看看这样一个故事。 小红和小明是情侣,一天,小红给小明发短信说:“亲爱的,我银行卡上没有钱了,你给我转1万块吧。”有过上当受骗经历的人都知道这有可能是小偷偷了小红手…

作者头像 李华
网站建设 2026/8/28 20:02:17

Addressing Logical Fallacies In Scientific Reasoning From Large Language Models: Towards a Dual-I...

文章核心总结与创新点 主要内容 该文章聚焦大型语言模型(LLMs)在科学推理中的逻辑谬误问题,深入分析了现有模型依赖单一肯定式推理(类似肯定前件式逻辑)的局限性,并提出双推理训练框架以解决这一问题。 问题揭示:现有LLMs(如GPT-2、LLaMA 3等)在科学领域(医学、环境…

作者头像 李华
网站建设 2026/9/11 8:37:38

2027届论文降AI率怎么选?六款工具实测对比

又到了毕业季,2027届的同学们开始直面一个现实:论文查重已经不是唯一关卡,AI率检测正在成为盲审和答辩前的隐形门槛。知网、维普陆续上线AI检测功能后,不少人的论文因为"疑似AI生成"被打回修改,这比查重超标…

作者头像 李华
网站建设 2026/8/30 17:47:28

EV 驱动电机零转速满转矩起步(Align→OpenLoop→FOC)Simulink 建模

目录 一、为什么“零转速满转矩起步”要单独做 二、起步控制原理简述 2.1 预定位(Align / Pre‑Excite) 2.2 开环旋转(Open‑Loop Voltage‑Oriented) 2.3 切闭环 FOC 三、关键参数 四、Simulink 建模(手把手) 4.1 Step 1️⃣ —— PMSM + Inverter + 坐标变换(同…

作者头像 李华
网站建设 2026/9/1 21:17:44

通过循环结构深入理解最大值与最小值的查找

目录 1.引言 2.寻找最大值 3.寻找最小值 4.空类型值(None Type) 1.引言 在之前,我们已经学习了如何使用 max()和 min() 函数来比较大小,这些函数对于处理简单的数据集非常方便。然而,当我们面对大量数据时,仅仅依…

作者头像 李华
网站建设 2026/9/10 1:19:23

让RAG更进一步的利器:教你使用两种出色的Rerank排序模型

前言 在高级RAG的应用中,常常会有一些“检索后处理(Post-Retrieval)”的环节。顾名思义,这是在检索出输入问题相关的多个Chunk后,在交给LLM合成答案之前的一个处理环节。在这个环节中,可以做一些诸如相似度…

作者头像 李华