Nav2 是 ROS 2 生态中官方维护的新一代移动机器人自主导航框架,是 ROS 1 经典 Navigation 栈的重构与升级,专为轮式移动机器人提供"从定位到路径跟踪、从全局规划到局部避障"的端到端导航解决方案。相较于 ROS 1 Navigation,Nav2 采用模块化、插件化、生命周期节点(Lifecycle Node)设计,原生支持多机器人、实时性优化、行为树(Behavior Tree, BT)决策体系,已成为工业级移动机器人导航的标准框架。
详细请参阅Nav2官方文档
一、Nav2 核心设计理念与架构升级
1. 设计原则
Nav2 的核心设计遵循四大原则,也是其相较于 ROS 1 Navigation 的核心优势:
- 模块化解耦:将导航流程拆分为独立的功能节点(如规划器、控制器、定位、代价地图),节点间通过标准化接口通信,单模块故障不影响整体;
- 插件化扩展:所有核心算法(规划、控制、恢复行为)均通过插件接口实现,用户可无需修改框架源码,仅通过配置替换自定义算法;
- 生命周期管理:所有核心节点基于 ROS 2 生命周期节点实现,支持"未配置→配置→激活→停用→清理"的标准化状态管理,适配工业级可靠性要求;
- 行为树驱动:用行为树替代 ROS 1 的有限状态机(FSM),实现更灵活、可复用的导航行为决策(如避障失败后的重试、绕障、放弃等逻辑)。
2. 整体架构(全维度分层)
Nav2 的架构可分为 6 层,从底层硬件到上层应用形成完整闭环,各层职责与交互如下:

Nav2 导航框架六层架构
一、硬件感知层
核心定位
硬件感知层是 Nav2 与物理世界交互的入口,负责采集机器人自身状态和环境信息,为上层算法提供原始数据。
核心组件与功能
| 组件类型 | 具体设备/模块 | 核心作用 | 数据输出形式 | 适配要求 |
|---|---|---|---|---|
| 移动底盘 | 差速底盘/阿克曼底盘/全向底盘 | 执行速度指令,提供里程计原始数据 | 轮速脉冲、里程计位姿(x/y/yaw) | 需支持 cmd_vel 话题(线速度 vx、角速度 wz),输出 odom 话题 |
| 环境感知传感器 | 激光雷达(2D/3D) | 检测周边障碍物,生成点云/扫描数据 | scan 话题(sensor_msgs/msg/LaserScan) |
需配置扫描频率(10-20Hz)、扫描角度(0-360°),过滤地面/远距离噪声 |
| 深度相机(RGB-D) | 补充视觉障碍物信息(适合室内) | depth/image_rect_raw 话题 |
需通过 depthimage_to_laserscan 转换为激光扫描数据(适配代价地图输入) |
|
| 位姿辅助传感器 | 轮式里程计 | 基于轮速计算机器人相对位姿 | odom 话题(nav_msgs/msg/Odometry) |
需校准里程计误差(如轮径、轴距),降低漂移 |
| IMU(惯性测量单元) | 提供角速度、加速度数据,修正里程计漂移 | imu/data 话题(sensor_msgs/msg/Imu) |
需做零偏校准,与里程计数据融合(如EKF) | |
| GPS/北斗(可选) | 室外场景提供绝对定位坐标 | fix 话题(sensor_msgs/msg/NavSatFix) |
需通过 gps_odometry 转换为地图坐标系(UTM投影) |
关键交互逻辑
硬件感知层的所有数据均通过 ROS 2 Topic 原生输出,无需依赖 Nav2 框架逻辑,仅需保证数据频率(如激光雷达≥10Hz、里程计≥20Hz)和格式标准化,即可被上层预处理模块接收。

二、数据预处理层
核心定位
对硬件感知层的原始数据进行同步、坐标转换、格式适配,为核心算法层提供"可用、统一、无噪声"的数据,是衔接硬件与算法的关键。
核心组件与功能
| 核心组件 | 功能原理 | 关键配置/参数 | 输出数据 |
|---|---|---|---|
| 传感器数据同步 | 基于 message_filters 同步多传感器数据(如激光雷达+IMU+里程计),避免时间戳不一致 |
sync_policy: approximate_time(近似时间同步)、sync_queue_size: 10 |
同步后的多传感器数据组合 |
| TF2 坐标变换 | 维护机器人各坐标系的转换关系(如 map→odom→base_footprint→laser) |
tf_buffer 缓存时间(10s)、tf_listener 实时监听变换关系 |
任意坐标系间的位姿转换结果 |
核心坐标系说明: - map:全局静态地图坐标系(绝对) - odom:里程计坐标系(相对) - base_footprint:机器人基座坐标系 - laser:激光雷达坐标系 |
需在 URDF 中定义各硬件坐标系的相对位姿(如激光雷达相对于基座的x/y/z/yaw) | ||
| 地图服务器(Map Server) | 加载/发布静态栅格地图(如SLAM生成的 .pgm/.yaml 文件),为定位和规划提供基础 |
yaml_filename: my_map.yaml(地图配置文件)、frame_id: map |
map 话题(nav_msgs/msg/OccupancyGrid) |
| 数据滤波(可选) | 对激光雷达数据做去噪(如 laser_filters)、对IMU做低通滤波 |
激光滤波参数:filter_type: shadow(阴影过滤)、max_range: 10.0 |
滤波后的 scan/imu/data 话题 |
关键交互逻辑
- 地图服务器启动后,持续发布静态地图到
map话题,供全局代价地图和AMCL定位模块订阅; - TF2 实时更新坐标系变换,核心算法层所有模块均依赖 TF2 完成"传感器数据→机器人坐标系→地图坐标系"的转换;
- 同步后的传感器数据直接输入代价地图的 Obstacle Layer,用于动态障碍物检测。
三、核心算法层
核心定位
实现导航的核心算法逻辑,包括环境感知建模(代价地图)、自身定位、全局路径规划、局部路径跟踪,是 Nav2 最核心的技术层。
核心组件与功能
1. 代价地图(Costmap 2D):环境建模核心
| 维度 | 详细说明 |
|---|---|
| 核心原理 | 将静态地图、动态障碍物、机器人轮廓融合为栅格化代价网格,每个栅格标记"可通行(0)/未知(-1)/障碍物(255)/膨胀代价(1-254)" |
| 分类与分工 | - 全局代价地图:基于静态地图,更新频率1-5Hz,服务全局规划; - 局部代价地图:滚动窗口模式,更新频率5-20Hz,服务局部控制 |
| 核心图层 | - Static Layer:加载静态地图,标记永久障碍物; - Obstacle Layer:融合激光/深度相机数据,标记动态障碍物; - Inflation Layer:按机器人半径膨胀障碍物,避免碰撞; - Costmap Filter Layer:手动标记禁行区/优先区 |
| 关键调优参数 | - resolution:栅格分辨率(建议0.05m/栅格); - robot_radius:机器人半径(略大于实际值); - inflation_radius:膨胀半径(机器人半径+0.1m); - rolling_window:局部代价地图是否启用滚动窗口(必开) |
2. 定位模块(Localization):自身位姿估算
| 维度 | 详细说明 |
|---|---|
| 核心实现 | AMCL(自适应蒙特卡洛定位):基于粒子滤波,通过"里程计预测+激光雷达匹配"估算机器人在地图中的位姿 |
| 核心参数 | - max_particles:粒子数(500-2000,平衡精度与算力); - update_min_a/update_min_d:粒子更新阈值(旋转>0.1rad/移动>0.05m时更新); - initial_pose_x/y/yaw:初始位姿(RViz可手动修正) |
| 替代方案 | - Cartographer:SLAM+定位一体化,无先验地图时使用; - GPS+IMU:室外场景,需转换为地图坐标系 |
| 输出数据 | amcl_pose 话题(机器人在map坐标系下的位姿)、tf(odom→map的变换) |
3. 规划器服务器(Planner Server):全局路径规划
| 维度 | 详细说明 |
|---|---|
| 核心原理 | 接收目标点和全局代价地图,通过插件化算法生成从当前位姿到目标点的全局路径 |
| 核心插件 | - NavfnPlanner:A*/Dijkstra算法,简单场景首选; - SmacPlanner:状态格网算法,适配复杂约束; - STARPlanner:RRT*算法,适配动态环境 |
| 关键参数 | - max_planning_time:最大规划时间(0.5-1.0s); - goal_tolerance:目标容差(0.1m); - use_final_approach_orientation:是否强制目标朝向 |
| 核心接口 | plan_path 服务(nav2_msgs/srv/PlanPath),输入目标位姿,输出全局路径 |
4. 控制器服务器(Controller Server):局部路径跟踪
| 维度 | 详细说明 |
|---|---|
| 核心原理 | 接收全局路径和局部代价地图,通过插件化算法生成底盘速度指令(vx/wz) |
| 核心插件 | - DWAController:动态窗口法,差速机器人首选,实时采样速度并评估代价; - TEBController:时间弹性带算法,适配阿克曼底盘; - MPCController:模型预测控制,高精度场景 |
| DWA关键参数 | - max_vel_x:最大线速度(0.3-0.8m/s); - max_vel_theta:最大角速度(1.0-2.0rad/s); - sim_time:仿真时间(0.5-1.0s); - xy_goal_tolerance:位置容差(0.05m) |
| 核心接口 | follow_path 动作(nav2_msgs/action/FollowPath),输入全局路径,输出cmd_vel话题 |
关键交互逻辑
- 定位模块输出的
amcl_pose作为全局规划的起点; - 全局代价地图为规划器服务器提供"环境约束",局部代价地图为控制器服务器提供"实时障碍物约束";
- 控制器服务器持续订阅全局路径,若局部代价地图检测到障碍物,自动调整局部路径并重新生成速度指令。

四、决策控制层
核心定位
基于核心算法层的输出,实现导航流程的状态管理、行为决策和故障恢复,是 Nav2 灵活性和可靠性的核心保障。
核心组件与功能
1. 生命周期节点(Lifecycle Node):状态管理核心
| 维度 | 详细说明 |
|---|---|
| 核心原理 | 所有核心节点(控制器/规划器/行为服务器)均基于ROS 2生命周期节点实现,标准化状态流转,避免异常启停 |
| 状态流转 | 未配置(Unconfigured)→配置(Inactive)→激活(Active)→停用(Inactive)→清理(Finalized) |
| 各状态职责 | - 未配置:仅加载参数,无初始化; - 配置:初始化算法、订阅/发布话题、加载插件; - 激活:处理数据、提供服务; - 停用:暂停处理,保留初始化状态; - 清理:释放资源、关闭接口 |
| 控制命令 | ros2 lifecycle set /controller_server configure(配置)、ros2 lifecycle set /controller_server activate(激活) |
2. BT Navigator(行为树导航器):导航流程决策
| 维度 | 详细说明 |
|---|---|
| 核心原理 | 用行为树(BT)替代传统有限状态机(FSM),实现灵活的导航流程编排 |
| BT节点类型 | - 控制节点:Sequence(顺序)、Fallback(容错)、Parallel(并行); - 动作节点:ComputePathToPose(规划路径)、FollowPath(跟踪路径); - 条件节点:GoalReached(到达目标)、IsPathValid(路径有效) |
| 默认BT流程 | Sequence → IsGoalValid → ComputePathToPose → FollowPath → GoalReached ↓(任意步骤失败)→ Fallback → 恢复行为 → 重试 |
| 自定义扩展 | 编写XML模板修改BT结构,或开发自定义BT节点(如"到达目标后鸣笛") |
3. Behavior Server(行为服务器):故障恢复管理
| 维度 | 详细说明 |
|---|---|
| 核心原理 | 当导航流程失败(规划失败/避障失败)时,触发预设的恢复行为,提升导航鲁棒性 |
| 核心恢复行为 | - spin:原地旋转(重新感知环境); - backup:后退(离开障碍物); - wait:等待(动态障碍物移开); - clear_costmap:清除代价地图(移除误检测障碍物) |
| 配置方式 | 在nav2_params.yaml中配置插件优先级和参数: yaml<br/>behavior_server:<br/> ros__parameters:<br/> behavior_plugins: ["spin", "backup"]<br/> spin: {plugin: "nav2_behaviors/Spin", spin_dist: 1.57}<br/> |
关键交互逻辑
- BT Navigator 作为顶层决策器,触发
plan_path服务和follow_path动作,调用核心算法层能力; - 若算法层返回失败(如路径无效),BT Navigator 调用 Behavior Server 的恢复行为;
- 生命周期节点保证所有决策模块的"安全启停",避免运行中修改参数导致的崩溃。
五、接口交互层
核心定位
定义标准化的交互接口,实现用户/外部系统与 Nav2 核心逻辑的通信,包括动作、服务、话题和可视化接口。
核心组件与功能
1. 核心接口分类(Action/Service/Topic)
| 接口类型 | 接口名称 | 核心作用 | 消息类型 | 使用场景示例 |
|---|---|---|---|---|
| Action | /navigate_to_pose | 导航到单个目标点(核心接口) | nav2_msgs/action/NavigateToPose | 用户通过RViz设置目标点,触发自主导航 |
| Action | /navigate_through_poses | 按顺序导航到多个目标点 | nav2_msgs/action/NavigateThroughPoses | 多工位巡检、多点配送 |
| Action | /follow_path | 跟踪预设的全局路径 | nav2_msgs/action/FollowPath | 复现历史路径、按预规划路径导航 |
| Service | /plan_path | 生成从当前位姿到目标点的全局路径 | nav2_msgs/srv/PlanPath | 预规划路径、验证目标点是否可达 |
| Service | /clear_costmap | 清除全局/局部代价地图的障碍物 | nav2_msgs/srv/ClearCostmap | 手动清除误检测的障碍物、恢复导航 |
| Service | /get_behavior | 获取当前可用的恢复行为 | nav2_msgs/srv/GetBehavior | 外部系统自定义恢复行为逻辑 |
| Topic | /amcl_pose | 发布机器人在地图中的位姿(带协方差) | geometry_msgs/msg/PoseWithCovarianceStamped | 可视化定位结果、外部系统获取位姿 |
| Topic | /global_costmap/costmap | 发布全局代价地图 | nav2_msgs/msg/Costmap | RViz可视化全局障碍物、调试规划逻辑 |
| Topic | /local_costmap/costmap | 发布局部代价地图 | nav2_msgs/msg/Costmap | RViz可视化局部障碍物、调试避障逻辑 |
| Topic | /cmd_vel | 发布底盘速度指令 | geometry_msgs/msg/Twist | 底盘接收速度指令、调试控制算法 |
2. 可视化/CLI交互接口
| 接口类型 | 工具/命令 | 核心作用 | 使用示例 |
|---|---|---|---|
| RViz | Nav2默认配置文件 | 可视化地图、定位、路径、代价地图,设置目标点 | ros2 launch nav2_bringup rviz_launch.py |
| CLI | ros2 action send_goal | 命令行触发导航动作 | ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{pose: {header: {frame_id: map}, pose: {position: {x: 2.0, y: 0.5}, orientation: {w: 1.0}}}}" |
| CLI | ros2 lifecycle | 命令行控制节点状态 | ros2 lifecycle set /planner_server activate |
| Python API | nav2_simple_commander | 封装Nav2接口的Python库 | from nav2_simple_commander.robot_navigator import BasicNavigator |
关键交互逻辑
- 所有接口均遵循ROS 2接口规范,支持QoS配置(如可靠传输、历史记录数),适配不同实时性要求;
- RViz通过订阅Topic接口可视化所有核心数据,通过Action接口发送目标点,是调试和使用的核心工具;
- Python API封装了底层Action/Service调用,降低上层应用开发门槛。

六、应用层
核心定位
基于Nav2的核心能力,适配不同的业务场景,实现从"技术能力"到"业务价值"的转化。
核心场景与实现方案
| 应用场景 | 核心需求 | Nav2适配要点 | 部署流程示例 |
|---|---|---|---|
| 室内单点导航 | 从A点到B点,避障,精准到达 | - 配置AMCL定位+DWA控制器; - 调优代价地图膨胀半径、DWA速度参数 | 1. 启动仿真/实机; 2. 启动Nav2核心栈; 3. RViz设置目标点触发导航 |
| 多航点连续导航 | 按顺序访问多个目标点,支持暂停/跳过航点 | - 使用navigate_through_poses接口; - 自定义BT添加"航点暂停"逻辑 |
1. 编写Python脚本定义航点列表; 2. 调用API依次触发导航 |
| 多机器人协同导航 | 多机器人避碰,路径调度,避免抢占通道 | - 每个机器人使用独立命名空间(/robot1、/robot2); - 配置Costmap Filter Layer过滤其他机器人; - 配合nav2_multi_robot实现路径调度 | 1. 启动多机器人仿真; 2. 分别启动各机器人Nav2栈; 3. 上层调度系统分配目标点 |
| 室外GPS导航 | 基于GPS定位,长距离导航,适配室外动态障碍物 | - 替换定位模块为GPS+IMU; - 全局规划器使用STARPlanner; - 调优局部代价地图更新频率 | 1. 启动GPS/IMU驱动; 2. 启动Nav2(配置GPS定位); 3. 发送GPS坐标目标点 |
| SLAM+导航一体化 | 无先验地图,先建图再导航 | - 先启动SLAM Toolbox/Cartographer建图; - 保存地图后启动Nav2加载地图; - 定位模块复用SLAM的位姿输出 | 1. 启动SLAM建图; 2. 保存地图; 3. 重启Nav2加载地图并导航 |
| 自主充电 | 导航到充电桩,精准对接 | - 调优控制器定位精度(xy_goal_tolerance=0.02m); - 自定义BT添加"充电对接"动作; - 配合充电桩视觉定位修正位姿 | 1. 导航到充电桩附近; 2. 视觉定位修正位姿; 3. 低速对接充电桩 |

关键优化要点
- 不同场景核心差异在于"定位模块"和"算法插件"的选择(如室内用AMCL,室外用GPS);
- 实机部署需重点调优:
- 定位精度:校准激光雷达/IMU,增加粒子数;
- 避障鲁棒性:调优代价地图更新频率、障碍物过滤参数;
- 运动平稳性:限制DWA加速度,调优TEB时间约束。
Nav2 是 ROS 2 中模块化、插件化的工业级导航框架,核心架构分为硬件感知层、数据预处理层、核心算法层、决策控制层、接口交互层、应用层,通过行为树实现灵活的导航决策;
核心模块包括代价地图(环境感知)、定位(AMCL)、规划器服务器(全局路径)、控制器服务器(局部跟踪),各模块均可通过参数调优适配不同机器人;
插件化体系是 Nav2 的核心优势,用户可自定义规划器、控制器、恢复行为,无需修改框架源码;
部署关键在于代价地图分辨率、机器人半径、膨胀半径的校准,调试可通过 RViz 可视化核心数据。