ROS2Humble版本的Nav2导航包的介绍、和ROS1中Nav包的显著区别、Nav2包的官方git clone代码的快速使用步骤,以及如何快速在自己的launch.py文件中引入Nav2包的步骤

提问

为我提供ROS2的Humble版本的Nav2导航包的介绍、和ROS1中Nav包的显著区别、Nav2包的官方git clone代码的快速使用步骤,以及如何快速在自己的launch.py文件中引入Nav2包的步骤。

  1. 介绍的内容包括:例如功能概述、架构图、模块分解
  2. 目前只考虑在仿真环境(如Rviz2,且不考虑在Gazebo中使用)

回答

明白了。我将为你整理ROS 2 Humble版本中Nav2导航包的功能概述、模块架构、与ROS 1的主要区别,并说明如何快速使用Nav2(包括从官方仓库clone并启动DWA和A*算法),以及如何在自己的launch.py文件中引入这些模块。

请稍等,我会尽快整理完整内容与步骤提供给你。

ROS 2 Humble Nav2 导航包详解

1. 功能概述

Nav2(Navigation2)是ROS 2中功能完备的移动机器人导航框架,是ROS 1导航栈(move_base等)的继任者。Nav2的主要目标是为移动机器人提供从A点安全自主移动到B点的能力,包括路径规划、运动控制、障碍物避免和故障恢复等。这一框架支持机器人在各种环境和运动学类型下完成复杂导航任务,不仅能执行简单的点到点导航,还支持插入中间航路点、多目标巡航、目标物追踪、全覆盖式导航等高级应用。Nav2经过生产级验证,具备高可靠性和灵活性,已被全球众多公司应用于实际机器人系统。

Nav2提供了一系列模块和工具来实现自主导航功能:

  • 建图与定位:加载、提供和保存静态地图,使用AMCL算法在已有地图上对机器人进行定位。支持从已有栅格地图开始导航,也可与SLAM工具结合实现边构图边导航
  • 环境感知:接收激光雷达等传感器数据,实时构建2D成本地图表示环境。代价地图融合静态地图和传感器障碍信息,用于路径规划和碰撞检测。
  • 全局路径规划:根据地图和目标,计算从机器人当前位置到目标点的无碰撞路径。Nav2内置多种全局规划器插件(如基于网格的NavFn和Smac等),默认使用网格搜索算法(如Dijkstra或A*)来寻找最优路径。
  • 局部路径跟踪:实时跟踪全局路径,计算避障后的速度控制指令发送给机器人。Nav2默认使用DWB局部规划器,它是ROS 1中DWA算法的改进移植版,通过动态窗口方法计算安全速度。该模块确保机器人沿路径前进并在遇到新障碍时进行避让。
  • 路径平滑:可选的路径平滑器模块,对全局路径或速度指令进行滤波处理,使轨迹更加平滑可行,减少机器人运动的急转弯或不连续。
  • 行为规划与恢复:通过行为树(Behavior Tree)协调各模块,实现复杂导航逻辑和故障恢复策略。Nav2内置多种恢复行为(如原地旋转、后退、重新规划、清除costmap等)用于在机器人遇到阻碍或定位不准时自动采取措施恢复导航。相比ROS 1固定的有限状态机,行为树使导航任务流程更加灵活可配置。
  • 多目标航点巡航:提供航路点跟随功能,可一次性规划并依次导航经过一系列预定义航点,实现巡逻等复杂任务。
  • 生命周期管理:内置生命周期管理器,统一控制导航各功能节点的启动、暂停和退出,确保各模块按序正确启动和安全关闭。这利用ROS 2的生命周期节点特性,使系统启动和恢复更可靠。
  • 插件化与扩展:Nav2采用高度模块化和插件化设计。核心接口定义在nav2_core包中,开发者可以根据需要替换或新增规划器、控制器、行为器等插件,只要遵循接口即可无缝集成。例如,Nav2除了默认的DWB局部规划器外,还支持TEB、纯追踪等第三方局部规划算法作为插件;全局规划器也支持Theta*、Hybrid A*等高级算法插件。
  • 可视化与调试:Nav2提供RViz集成的导航插件,方便在RViz中发送导航目标、可视化机器人姿态、路径、成本地图和传感器数据等。还提供Python接口(如Simple Commander API)以便脚本化控制导航以及碰撞监测速度平滑等高级辅助功能,进一步提高导航性能和安全性。

上述功能协同工作,使Nav2能够为全向轮差速驱动腿式Ackermann转向等各种运动底盘提供稳定的自主导航能力。总之,Nav2涵盖了移动机器人自主导航所需的各个方面,对于初学者和开发者来说提供了开箱即用、可扩展定制的解决方案。

2. 架构与模块分解

上述架构图展示了ROS 2 Nav2导航系统的主要模块及其关系示意。Nav2采用分布式模块化架构,以行为树(BT)为决策中枢,将导航任务拆解给多个功能服务器处理。在Nav2行为树导航器(nav2_bt_navigator)的统筹下,不同服务器各司其职:全局规划、局部控制、路径平滑、恢复行为等由独立节点异步并行完成,最终协调生成机器人运动指令发送到底层驱动。这种架构利用ROS 2的Action通信机制,将复杂导航流程解耦为可独立调试和替换的子任务,提高了系统的鲁棒性可扩展性

Nav2的核心模块/节点列表如下,每个模块通常对应一个ROS 2节点(具备生命周期管理):

  • Behavior Tree Navigator(行为树导航器,nav2_bt_navigator:Nav2的决策层,替代ROS 1中的move_base状态机。它加载行为树XML文件,根据任务需求(如NavigateToPose)调用下述各功能服务器的动作接口,按行为树逻辑决定何时规划、控制、恢复等。行为树使导航策略更具层次性和灵活性,支持在XML中配置调整导航流程,而无需修改代码。
  • Planner Server(全局规划器服务器,nav2_planner:负责路径规划功能。它维护全局成本地图(静态地图+环境感知)并提供ComputePathToPose动作接口。内部可加载一个或多个全局规划算法插件,默认插件为NavFn(从ROS 1移植的Dijkstra/A栅格规划器)。Nav2也引入了更新的SmacPlanner(Hybrid-A等)等插件供选择。Planner Server接收目标位姿后,调用选定的规划器插件计算无碰撞路径,输出为路径点序列。
  • Controller Server(局部控制器服务器,nav2_controller:负责轨迹跟踪与避障控制。它维护局部成本地图(机器人周围一定范围内的动态障碍物信息),提供FollowPath动作接口。内部可加载多个局部控制算法插件,默认插件为DWB控制器(Dynamic Window Approach算法改进版)。Controller Server接收Planner输出的全局路径,持续调用局部控制插件计算短周期的速度指令,使机器人沿路径前进并动态避开新出现的障碍。
  • Behavior Server(恢复行为服务器,nav2_behavior_server:提供导航失败时的恢复动作接口。例如原地旋转(Spin)、直线后退(Backup)、定向前进(DriveOnHeading)等恢复策略都作为插件由Behavior Server托管。当导航过程中检测到机器人长期无法前进、路径无效等情况时,BT导航器会通过Behavior Server触发相应恢复动作,以清除局部障碍或调整姿态,然后重新尝试规划路径。
  • Smoother Server(路径平滑服务器,nav2_smoother:提供路径/轨迹平滑服务,可选模块。当启用时,Planner规划出的生硬路径可通过Smoother插件(如nav2_smac_planner/SimpleSmoother)进行平滑优化,再交由Controller跟踪执行。平滑器能去除路径上的锐角和不必要的曲折,使行驶更平稳。
  • Waypoint Follower(航点跟随器,nav2_waypoint_follower:提供NavigateThroughPoses行动接口,使机器人依次经过一系列给定航路点。Waypoint Follower内部调用Planner/Controller实现多个目标点的连贯导航,可用于巡逻等任务。
  • Lifecycle Manager(生命周期管理器,nav2_lifecycle_manager:负责一次启动/停止多个Nav2节点。Nav2各核心节点均为生命周期节点,Lifecycle Manager根据配置顺序调用它们的configure()activate(),在导航启动时逐一激活地图、AMCL、Planner、Controller等;在错误或退出时则安全地 deactivate/shutdown 节点。这一机制确保Nav2子系统按正确次序初始化,并在任何一个关键子节点崩溃时能够通知Lifecycle Manager快速终止整个导航系统以避免不确定状态。
  • Map Server / Map Saver(地图服务器,nav2_map_server:提供地图加载和保存服务。在Nav2启动时读取磁盘上的栅格地图文件(.yaml+.pgm),发布静态地图话题供Costmap使用;在需要时也可保存当前建图结果。Nav2中Map Server相当于ROS 1的map_server功能扩展移植。
  • AMCL 局部化(nav2_amcl:提供自适应蒙特卡洛粒子滤波定位功能。Nav2中nav2_amcl是ROS 1 amcl包的移植,用于根据激光数据和地图进行机器人全局定位。Nav2也支持其它定位方案(如robot_localization融合),但AMCL是常用选择。
  • Costmap 2D(代价地图,nav2_costmap_2d:全局和局部代价地图构建库。在Nav2架构图中,Planner和Controller各自包含一个Costmap实例:全局Costmap覆盖整个已知地图范围(通常静态,只更新静态障碍),局部Costmap覆盖机器人周边区域(动态更新传感器障碍)。Costmap 2D模块将地图与传感器数据融合为栅格代价地图,并提供通用插件接口来添加不同类型的层(静态层、障碍物层、膨胀层等)。ROS 1的costmap_2d被移植为nav2_costmap_2d,配置方式类似。
  • Nav2 RViz Plugin(RViz导航插件,nav2_rviz_plugins:为RViz提供专用面板,可发布2D初始姿态2D导航目标,并能显示当前导航状态、路径和成本地图等。用户在RViz中使用该插件的按钮即可与Nav2交互(开始/取消导航等),方便调试和监控。
  • Nav2 Core(核心接口库,nav2_core:定义Nav2各插件的基础接口类,例如GlobalPlanner, LocalPlanner, Recovery等接口。第三方若要自定义算法插件,可继承这些接口实现,并通过参数加载到对应的Server中。nav2_core是ROS 1 nav_core的移植,接口有所改进。
  • 其他实用工具:Nav2还附带碰撞监控器(Collision Monitor)、速度平滑器(Velocity Smoother)等辅助节点,用于提高导航安全性和平稳性。碰撞监控器可直接监测原始雷达数据,提前发现可能的碰撞威胁并发出急停指令;速度平滑器在控制器输出速度上增加动态限制,防止过大的加速度或振荡。这些模块在需要时可以启用,以增强机器人在动态环境中的安全导航表现。

以上模块通过行为树紧密协作:Behavior Tree会依据任务流程顺序调用Planner、Controller、Behavior等服务器。例如典型的“导航至目标”行为树会先调用Planner规划全局路径,然后周期性调用Controller跟踪路径行驶;如果检测到长期无法前进,则调用Behavior Server执行恢复动作(如清除障碍或重新规划),之后继续导航。在整个过程中,Lifecycle Manager确保各模块运行状态受控,RViz插件提供了监控与交互界面,形成一个完整的闭环导航系统。

这种模块化架构相较ROS 1的单进程move_base具有显著优势:松耦合的组件便于分别调试和优化,插件机制利于扩展算法,行为树提高了任务层的决策灵活性,生命周期管理增强了系统的稳定性和恢复能力。下节我们进一步总结Nav2相对于ROS 1 move_base的区别。

3. 与ROS 1导航栈(move_base)的区别

相对于ROS 1经典的move_base导航系统,ROS 2的Nav2在架构和功能上做了重大改进,主要体现在以下几个方面:

  • 架构解耦与多进程:ROS 1的move_base将全局规划、局部规划、成本地图和简单恢复策略都集成在单一节点中,通过状态机串联流程。Nav2则将这些功能拆分为多个组件/节点——规划器、控制器、恢复等各自独立,通过ROS 2的动作服务器通信进行协同。这种分布式架构利用ROS 2高性能通信中间件(DDS),确保模块间通信低延迟且可靠。结果是导航系统更加灵活,可伸缩到更复杂的行为,同时当某一模块出现问题时不会直接导致整个导航崩溃。

  • 行为树替代状态机:在ROS 1中,move_base使用固定的状态机流程(例如“规划->控制->遇障碍->尝试恢复->失败”)。Nav2引入了行为树(Behavior Tree)来组织导航任务流程。行为树具有层次化和组合式的结构,比有限状态机更直观可扩展。开发者可以方便地修改BT XML文件以调整导航决策逻辑,比如添加新的检查条件或任务顺序,而无需改动源码。这赋予Nav2高度的可配置性,能够根据不同机器人和场景定制导航策略。

  • 生命周期管理与可靠性:Nav2的各组件节点均采用ROS 2的生命周期节点,由Lifecycle Manager统一管理启动和停止。ROS 1的move_base在启动和退出时容易出现顺序问题或资源未清理的情况,而Nav2通过显式的配置、激活、停用步骤,使启动/关闭更加安全确定。如果运行过程中某个关键节点崩溃,Lifecycle Manager还能感知并自动关闭整个导航堆栈以避免无人监控的状态,这在ROS 1中需要自行实现额外的监控机制。

  • 插件化和多算法支持:ROS 1的move_base支持插件,但实际应用中通常各只有一个全局/局部planner插件同时工作。Nav2在规划器、控制器等服务器中支持加载多个算法插件,并可通过行为树选择在不同情境下调用哪个插件。例如,Nav2可以同时加载DWB和TEB两种控制器,根据路径曲率或场景自动切换适用的算法。这种上下文导航能力在ROS 1中难以实现。此外,Nav2默认集成了一系列ROS 1没有的新算法插件,如Smac Planner (A*)Hybrid-A*全局规划,Regulated Pure Pursuit局部控制,Velocity Smoother速度平滑等,提供了更丰富的选择。

  • 改进的恢复行为:ROS 1 move_base提供的恢复动作有限(常用的如原地转圈清理代价地图)。Nav2不仅移植了原有恢复行为(旋转、后退、清地图等),还新增了等待等恢复策略,并将恢复动作独立成Behavior Server便于扩展。得益于行为树,Nav2可以在任意需要的时机插入恢复节点,例如定期检查路径是否过长、遇到动态障碍时临时停车等待等,使导航过程更健壮。

  • 性能与可靠性提升: Nav2充分利用ROS 2中多线程执行器异步通信特性,各模块可并行处理(例如控制器在持续运行的同时全局规划器可在后台重新规划路径),提高了效率和实时性。同时ROS 2基于DDS的通信在丢包、延迟方面较ROS 1有所改善,再加上Nav2对TF变换时间同步等的严格管理,使导航在复杂环境下表现出更好的稳定性。Nav2还具有更完善的测试(包含系统集成测试套件)和社区维护,长期来看较ROS 1导航有更强的生命力。

  • 功能集成差异:Nav2集成了ROS 1导航缺少的一些功能组件。例如Nav2内置了Waypoint Follower用于多航点导航、Simple Commander Python接口方便脚本调用、Collision Monitor提高行驶安全、Path Smoother优化路径平滑度等。这些特性要么在ROS 1时代需要额外插件实现,要么当时尚不可用。总体而言,Nav2作为新一代导航栈,其功能范围更广,并针对实际机器人应用进行了优化。

  • 算法移植与更名:Nav2中的许多包是对ROS 1导航包的直接移植和升级,命名上有所区分。例如ROS 1的amclmap_servercostmap_2d等分别迁移为nav2_amclnav2_map_servernav2_costmap_2d全局规划器global_plannernav2_planner取代,后者可托管多个规划插件;**局部规划器base_local_planner (DWA)**被nav2_controller下的DWB插件取代;核心接口nav_core迁移为nav2_core并改进了插件接口。此外Nav2新增了一些ROS 1没有的模块包,如上文提到的nav2_bt_navigator(行为树导航器),nav2_lifecycle_manager(生命周期管理),nav2_waypoint_follower(航点任务)等。这些变化反映了ROS 2导航栈在架构理念上的与时俱进。

总的来说,Nav2在架构解耦灵活性算法丰富性鲁棒性等方面都显著优于ROS 1的导航栈move_base。对于开发者而言,Nav2提供了更加现代和可定制的平台来构建机器人导航应用,但同时也引入了一定的复杂度(例如需要理解行为树和多节点协调)。随着ROS 1逐步退出历史舞台,掌握Nav2的用法和原理将成为ROS机器人开发的新必备技能。

4. Nav2源码克隆编译与快速运行

下面介绍如何从Nav2官方GitHub获取源码并在ROS 2 Humble环境下编译运行Nav2导航系统。假定您已安装ROS 2 Humble并完成工作空间初始化。

步骤1:克隆Nav2源码仓库 – 创建ROS 2工作空间并下载Nav2源码。Nav2的源码分支命名与ROS发行版对应,例如Humble发行版对应仓库的humble分支。

# 新建工作空间并进入src目录
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws
# 从GitHub克隆Nav2源码(使用--branch指定ROS2发行版,如humble)
git clone https://github.com/ros-planning/navigation2.git --branch humble src/navigation2

上述命令将把Nav2所有相关包源码下载到~/nav2_ws/src/navigation2目录下。如果需要特定版本,也可切换到相应的tag或分支。请确保使用与当前ROS 2发行版匹配的分支,以避免依赖兼容性问题。

步骤2:安装依赖 – 使用rosdep自动安装编译Nav2所需的所有依赖库和ROS包:

# 安装工作空间中src下所有包的依赖
rosdep install -y --from-paths src --ignore-src --rosdistro humble

该命令会读取Nav2包的package.xml,通过ROS仓库自动安装诸如behavior-tree-cpp(行为树库), ompl(路径规划库)等Nav2所需的依赖。如果已安装ROS 2桌面版,大部分依赖都会已经存在;rosdep会跳过已安装部分。

步骤3:编译源码 – 使用colcon编译整个Nav2工作空间:

# 编译Nav2源码(symlink安装方便调试参数文件等)
colcon build --symlink-install

等待片刻,编译成功后会在~/nav2_ws/install目录生成所有Nav2组件的可执行文件和资源。如果编译出现错误,建议检查ROS发行版是否匹配、依赖是否全部安装完毕。

步骤4:设置环境并启动Nav2 – 编译完成后,source该工作空间的setup脚本,然后启动Nav2导航系统。在终端执行:

# Source工作空间的安装脚本,覆盖ROS环境
source ~/nav2_ws/install/setup.bash

Nav2提供了启动launch文件来一键启动导航所需的各组件。常用的是nav2_bringup包内的bringup_launch.py,可加载地图并启动AMCL定位、地图服务器、规划器、控制器等节点。例如,使用以下命令启动Nav2(假设已有地图文件):

ros2 launch nav2_bringup bringup_launch.py \
   use_sim_time:=False autostart:=True \
   map:=$HOME/maps/mymap.yaml

该命令在非仿真(实机或录包)情况下启动Nav2导航栈:不使用模拟时间use_sim_time:=False,自动启动各生命周期节点autostart:=True,并指定静态地图文件路径为mymap.yaml。**注意:**请将map参数替换为实际地图文件的路径。如果没有现成地图,可先运行SLAM生成地图,或在Gazebo中建图。

成功执行后,终端会显示各Nav2节点启动的日志。通常包括:map_server, amcl, planner_server, controller_server, recoveries_server, bt_navigator 等。其中[BT_Navigator] [INFO] Navigation LifecycleManager: Activating表示导航各模块已激活,准备好接收目标点进行导航。

步骤5:启动RViz可视化 – Nav2默认的launch文件会尝试同时启动一个RViz2实例以加载导航可视化界面。如果未自动弹出RViz界面,可手动运行:

ros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz

这将打开RViz并加载Nav2预配置的面板(包含地图、机器人模型、LaserScan、costmap等显示)。在RViz左下角可以看到Nav2的导航插件面板,其中包括“Startup”按钮以及“2D Pose Estimate”“Nav2 Goal”等工具。

步骤6:定位初始化并发送导航目标 – 刚启动时,AMCL尚未收敛,机器人在地图上的初始位姿未知。在RViz中点击顶部工具栏的“2D Pose Estimate”按钮,在地图上机器人实际所在位置处按下鼠标并拖动朝向,为AMCL提供初始位姿猜测。此操作会在RViz中显示一个绿色的箭头,同时Nav2的粒子滤波器根据该位置开始全局定位。初始定位后,观察RViz中机器人模型与地图的对齐情况,必要时可多次调整2D估计。

一旦定位正确,Nav2会将所有模块切换为“Active”状态(RViz面板中的|PN|指示变为绿色激活)。接下来,使用RViz的“Nav2 Goal”工具,在地图上点击选择一个目标点并拖动朝向,发送导航目标。Nav2接收到目标后,行为树将触发Planner计算路径,随后Controller不断产生速度指令。如果使用仿真或真实机器人,此时机器人应开始沿规划路径移动并最终到达目标。

⚠️ 调试提示:初学者在无实际机器人或Gazebo仿真的情况下运行上述流程,机器人不会实际移动,但Nav2仍会在RViz中显示规划出的路径和尝试运动。如果没有机器人的里程计和定位反馈,Nav2可能因检测到无法前进而触发恢复行为甚至取消任务。这属于正常现象,用于验证Nav2各模块是否工作。如需在无机器人硬件时测试导航全过程,可考虑在Gazebo中加载机器人模型,或使用Loopback模拟器节点来虚拟机器人的运动反馈。

5. 将Nav2集成到自定义Launch文件(使用DWB局部规划+A*全局规划示例)

在实际项目中,我们往往需要将Nav2导航功能集成到自己的启动文件中,以便和机器人其他节点一起管理启动。ROS 2的Launch系统允许我们直接包含(include)Nav2自带的启动文件,或者手动实例化各导航节点。下面给出一个简化的launch.py示例,将Nav2导航功能整合进自定义启动文件。在该示例中,我们仅启用DWB局部规划器(基于DWA算法)和A*全局规划器,以满足常见导航需求。

首先,编写自定义的Python启动文件(如my_robot_navigation.launch.py),内容如下:

from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from ament_index_python.packages import get_package_share_directory
import os

def generate_launch_description():
    # Nav2 bringup_launch.py 路径
    nav2_bringup_dir = get_package_share_directory('nav2_bringup')
    bringup_launch = os.path.join(nav2_bringup_dir, 'launch', 'bringup_launch.py')
    # 自定义参数文件路径(配置DWB和A*插件)
    nav2_params_file = os.path.join(get_package_share_directory(''), 'config', 'nav2_params.yaml')
    # 地图文件路径
    map_file = os.path.join(get_package_share_directory(''), 'maps', 'mymap.yaml')

    return LaunchDescription([
        # 包含Nav2官方的bringup启动文件,并传入必要的参数
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource(bringup_launch),
            launch_arguments={
                'map': map_file,
                'use_sim_time': 'False',
                'autostart': 'True',
                'params_file': nav2_params_file
            }.items(),
        )
    ])

上述启动文件利用IncludeLaunchDescription引入了Nav2提供的bringup_launch.py,相当于一键启动Nav2导航堆栈。通过launch_arguments传入了四个参数:

  • map:指定地图文件路径(例如上面代码中的mymap.yaml),Nav2启动时将加载此地图。
  • use_sim_time:是否使用仿真时钟。这里设为False表示使用系统实时时间(机器人实机运行时应为False;如在Gazebo中则设True)。
  • autostart:是否自动激活Nav2各生命周期节点。设为True时,Nav2会在启动后直接激活各节点并开始定位导航,无需在RViz中手动点击“Startup”。
  • params_file:Nav2参数配置文件的路径。我么将在该文件中配置所需的规划器/控制器等插件选项。

接下来,编写Nav2的参数YAML文件(例如nav2_params.yaml),只保留我们需要的全局规划器和局部控制器插件,并设置其类型为A*算法和DWB算法。例如:

# nav2_params.yaml (片段)
amcl:
  ros__parameters:
    use_sim_time: False

# 地图服务器参数
map_server:
  ros__parameters:
    yaml_filename: "path/to/mymap.yaml"
    use_sim_time: False

# 全局规划器(Planner Server)参数
planner_server:
  ros__parameters:
    expected_planner_frequency: 1.0
    planner_plugin_ids: ["GridBased"]   # 仅加载名为GridBased的一个全局规划插件
    use_sim_time: False
    GridBased:
      plugin: "nav2_navfn_planner/NavfnPlanner"  # 使用NavFn全局规划器插件(基于A*网格搜索)
      tolerance: 0.5
      use_astar_optimizer: true       # (示例参数)启用A*优化策略,提高路径搜索效率
      default_tolerance: 0.5

# 局部控制器(Controller Server)参数
controller_server:
  ros__parameters:
    controller_plugins: ["FollowPath"]  # 仅加载名为FollowPath的一个局部控制插件
    use_sim_time: False
    FollowPath:
      plugin: "dwb_core::DWBLocalPlanner"   # 使用DWB局部规划器插件(DWA算法的ROS2实现)
      # DWB相关参数(速度限制、加速度限制、轨迹评分函数等)可在此配置...
      min_vel_x: 0.0
      min_vel_y: 0.0
      max_vel_x: 0.26
      max_vel_theta: 1.0

# 其它Nav2模块(行为、平滑等)保持默认或空配置...

上述参数文件中,我们在planner_server下将planner_plugin_ids设置为只包含"GridBased",并将该插件映射到nav2_navfn_planner/NavfnPlanner类。NavFn规划器是经典的网格路径规划算法(ROS 1中的Navfn实现),它使用Dijkstra/A算法在栅格地图上寻找从起点到终点的最短路径。通过设置use_astar_optimizer: true等参数,可以让NavFn在生成路径时使用启发式,提高速度。您也可以选择Nav2更新的SmacPlanner插件,其默认就采用A搜索算法并支持多种优化,但配置稍复杂,在此不展开。

controller_server下,我们将controller_plugins列表设置为仅"FollowPath",对应加载dwb_core::DWBLocalPlanner插件。DWB(Dynamic Window Approach Better)是ROS 2中默认的局部规划器,它继承自ROS 1的DWA算法,通过采样机器人的速度空间并进行轨迹评分来选择最优速度指令。上例中我们仅示意性地配置了DWB的一些基本参数(最大速度等),更详细的DWB参数如障碍物距离权重、轨迹振荡检测等,可根据需要调整。

完成上述launch.py和参数文件编写后,您就可以通过启动自己的launch文件来运行Nav2导航功能。例如:

ros2 launch <your_package> my_robot_navigation.launch.py

这将启动Nav2并加载您定制的参数,Nav2只会使用A*全局规划器和DWB局部控制器这两个插件来执行导航任务。您依然可以在RViz中进行初始定位和发送目标,与之前使用bringup_launch.py启动Nav2的效果一致。区别在于,现在Nav2的启动与您自定义的机器人其他节点可以集成在同一个launch中,便于统一管理。

通过上述方式,初学者可以快速将Nav2集成到自己的ROS 2项目里,并根据需要裁剪或替换Nav2的各功能插件。例如,若想改用TEB局部规划器或其它全球规划算法,只需修改参数文件中相应插件的plugin名称即可,无需改动代码。这体现了Nav2高度模块化和可配置的设计理念。随着对Nav2更深入的学习,您还可以尝试自定义行为树、调整参数来优化导航性能,为机器人实现可靠高效的自主导航。

参考资料:ROS 2 Nav2官方教程、Nav2框架概述、ROS 1与ROS 2导航对比等。

继续提问

  1. AMCL依靠的传感器是纯激光数据吗?有融合其他的传感器数据吗?是否可以把激光数据换成其他数据比如X波段雷达或者毫米波雷达的数据?
  2. Nav2目前有无和UE5配套使用的插件?应该没有吧?
  3. Nav2目前有无和Simulink配套使用的插件?
  4. ROS1里,即便没有Gazebo仿真或者实际机器人,启动Nav只需要在rviz中进行,导入地图和urdf还有yaml文件以后,机器人也是可以看到在rviz中移动的。在ROS2中,难道只有Rviz也不行吗?
  5. 如果我在某一个工作空间git clone了Nav2导航包,那我可以在另一个工作空间直接引用Nav2的一系列模块吗?
  6. 难道ROS2就不可以不依赖实际机器人和Gazebo,就像ROS1那样,只在Rviz中查看机器人的运动吗?我不需要有传感器数据,我自己已经写了脚本模拟IMU和GPS,知道实时的位姿数据,然后我只需要启动A*和DWB即可。应该也可以在Rviz中通过给一个2D pose,然后让机器人模型自己到达目标点吧?如果可以,大致如何操作?详细步骤暂不用说,等我给你更多细节你再说

回答

下面针对你的每个问题逐条回答:


1. AMCL 依赖的传感器类型与可替换性

  • 默认传感器
    Nav2 中的 AMCL(nav2_amcl)节点默认使用的是 ROS 标准的 sensor_msgs/LaserScan 数据,也就是激光雷达(2D LiDAR)扫描结果来做粒子滤波定位。

  • 多传感器融合
    AMCL 本身只消费 LaserScan 输入,不会直接融合 IMU、GPS、里程计等数据。想要融合更多传感器通常有两种思路:

    1. 前端数据融合:用 robot_localization 包(EKF/UKF)把 IMU、GPS、轮速计等融合成更稳定的 /odombase_link TF,再让 AMCL 订阅更准的里程计配合 LaserScan。
    2. 替换定位方案:放弃 AMCL,直接使用诸如 Google Cartographer 或者自定义的雷达扫描匹配(scan matching)+ EKF,也有社区方案把毫米波雷达点云转成 LaserScan 再给 AMCL。
  • 换用其他雷达

    • 如果你用的 X 波段或毫米波雷达自带点云输出(PointCloud2),可以在 ROS2 中通过 pointcloud_to_laserscan 或自己写节点把点云转成 LaserScan,再给 AMCL;
    • 也可改写 AMCL 的 measurement model,但这需要在 amcl_node.cpp 中替换 SensorModel,由于默认模型假设“激光从机器人中心水平扫描”,直接替换较复杂;
    • 更推荐:将非激光雷达的数据预处理成 LaserScan 或者直接使用专门面向雷达的定位插件。

2. Nav2 × UE5 插件

目前没有官方或社区广泛认可的“Nav2 → UE5”对接插件。
如果想在 UE5 中可视化或驱动 Nav2:

  1. 利用开源的 ROSIntegration(社区维护,有 ROS2 Beta 支持)/UnrealEngineROS 插件,将 ROS2 topic(例如 /cmd_vel, /odom, /scan)桥接到 UE5;
  2. 在 UE5 里写蓝图或 C++ 接收这些消息,驱动虚拟机器人模型;
  3. 在 RViz2/Gazebo 外做可视化时,UE5 只是一个渲染层,Nav2 并不能直接在 UE5 中加载行为树或 costmap。

3. Nav2 × Simulink 插件

同样,Nav2 目前没有开箱即用的 Simulink 接口包。
如果要在 Simulink 中使用 Nav2:

  • 可以用 ROS2 S-Function(Matlab ROS Toolbox for ROS2)在 Simulink 里订阅 /cmd_vel、发布 /odom/scan
  • 把 Nav2 各节点作为外部进程运行,通过 DDS/ros2_bridge 与 Simulink 通信;
  • 或者在 Simulink 里写 ROS2 Publisher/Subscriber 组件,实现与 Nav2 消息互通。

4. 仅靠 RViz2 是否可以运行 Nav2

  • 在 ROS 1 中,move_baseamclmap_server 在没有 Gazebo/实际机器人时,只要提供 map、URDF、/tf/scan/odom 等主题,就能在 RViz 里看到“虚拟机器人”动起来。

  • ROS 2 Nav2 也是同理:Nav2 本身不做物理仿真,它只消费消息并发布 /cmd_vel

    • 你需要:

      1. TF 发布odom → base_link
      2. 里程计反馈:订阅 /cmd_vel 后发布 /odom
      3. 激光扫描:可以使用固定空白 LaserScan 或者脚本生成模拟障碍。
    • 如果你不提供这些,Nav2

      • AMCL 会因没有 LaserScan 或没有 TF 报错;
      • Planner/Controller 会因没有里程计或 TF 不完整而无法规划/跟踪。
  • 结论仅启动 RViz2 界面本身不足,你要用脚本或小节点“模拟”机器人核心话题,才能在 RViz2 里完整地观察到导航流程。


5. 跨工作空间引用 Nav2 包

  • ROS2 支持Overlay Overlay工作空间:

    1. 在第一个工作空间 ws1 中 clone 并编译 Nav2;
    2. 在第二个工作空间 ws2 中做你的项目,只要在终端依次 source ~/ws1/install/setup.bashsource ~/ws2/install/setup.bashws2 就能找到 Nav2 的 package、节点和接口;
    3. ws2package.xmlCMakeLists.txt 里直接 declare 依赖 nav2_bringup, nav2_planner 等;
  • 注意:要确保两个空间 ROS_DISTRO 一致,且编译顺序(先编译 Nav2,再编译引用它的项目)。


6. 纯脚本模拟 & RViz2 中的“无机器人”导航

完全可行,大致思路如下(详细脚本等待你提供更多细节后再深入):

  1. 启动 Map Server & AMCL

    ros2 launch nav2_map_server map_server_launch.py map:=your_map.yaml
    ros2 run nav2_amcl amcl --ros-args -p use_sim_time:=False
    
  2. TF & 里程计模拟节点

    • 自写或用开源脚本订阅 /cmd_vel,在内存中做简单的欧拉积分(x, y, θ),发布 /odomnav_msgs/Odometry)和对应的 TF。
  3. (可选) 激光模拟

    • 如果只想看规划结果,可以绕过 AMCL,直接用 Fake Localization

      ros2 run nav2_amcl amcl --ros-args -p localization_pose:=[x, y, theta]
    • 或者用空白 LaserScan(全 0 或固定障碍)脚本不断发布 /scan

  4. 启动 Nav2 行为树导航

    ros2 launch nav2_bringup bringup_launch.py \
      use_sim_time:=False autostart:=True \
      params_file:=your_nav2_params.yaml
    

    其中,在你的 your_nav2_params.yaml 中把 AMCL、map_server、planner_server、controller_server 都配置为“无需真实传感”,仅关注路径生成和 cmd_vel 输出。

  5. RViz2 可视化

    ros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz
    

    在 RViz2 里:

    • 用 2D Pose Estimate 或直接写 /initialpose 消息初始化;
    • 用 Nav2 Goal 工具发送目标;
    • 你会在 RViz 中看到规划出的路径和机器人模型沿路径“虚拟”移动。

后续如果你已有自己的 IMU/GPS 脚本发布位姿,就把那部分脚本替换上面的“TF & 里程计模拟节点”,Nav2 依然能用你的真实或仿真数据直接导航。等你给出更详细的场景和脚本细节,再帮你补全完整的 launch 和脚本示例。

继续提问

你的意思是,在Nav2中,必须要发布/scan话题?

回答

不是说“Nav2 核心里硬性要求收到 /scan”,而是:

  1. AMCL 定位 默认只消费激光雷达数据(sensor_msgs/LaserScan),也就是 /scan 话题。如果你用 AMCL,就必须给它“看”到激光扫描,否则它没法做粒子滤波定位。

  2. 代价地图(Costmap2D) 在默认配置下,局部障碍层(obstacle_layer)和清除层(inflation_layer)也是基于 /scan 中的障碍信息来更新动态障碍区。如果不发布 /scan,局部地图里就不会有任何动态障碍,虽然全局地图上的静态障碍(来自 map_server)仍在,但机器人就不会避让新出现的物体。


如何“去掉”或“替换” /scan

  • 完全禁用激光层
    如果你只关心 A* 规划和 DWB 控制,不需要实时避障,也不做 AMCL 定位,可以在参数里把 obstacle_layer 移除:

    global_costmap:
      ros__parameters:
        plugin_names: ["static_layer"]
    local_costmap:
      ros__parameters:
        plugin_names: ["static_layer"]
    

    这样就只用静态地图,不再订阅 /scan,Nav2 依然会规划和跟踪路径,只是不会做动态避障。

  • 用其他传感器替换
    如果你有毫米波雷达或 X 波段雷达输出点云(PointCloud2),可以像这样在参数里重配置 obsrvation_sources:

    local_costmap:
      ros__parameters:
        obstacle_layer:
          observation_sources: radar
          radar:
            topic: /your_radar_points  
            data_type: PointCloud2
            marking: true
            clearing: true
    

    此时 Nav2 会订阅你指定的 /your_radar_points,不再要求 /scan

  • 跳过 AMCL,使用静态定位
    如果你不需要 AMCL,也可以∶

    1. 不在 launch 里启动 nav2_amcl
    2. static_transform_publisher 或自己写节点,在 map → odom → base_link 之间发布 TF;
    3. 直接在参数里把 AMCL 部分注释掉。

这样一来,Nav2 只要能拿到里程计(或静态 TF)和全局地图,就能做规划,且 DWB 控制器会根据你脚本发布的 /odom 来跟踪路径。


小结

  • 默认:AMCL+Costmap 都需要 /scan
  • 可选:通过配置参数禁用激光层或改用其他话题/传感器,Nav2 本身并不“强制”只有 /scan 才行——它只要在 Costmap 和定位模块里找到你配置的传感器输入,就能工作。

继续提问

为了使用nav2包,需要经过以下两个步骤,缺一不可吗?

  1. git clone https://github.com/ros-planning/navigation2.git --branch humble src/navigation2

sudo apt update
sudo apt install -y
ros-humble-navigation2
ros-humble-nav2-bringup
ros-humble-nav2-map-server
ros-humble-nav2-bt-navigator
ros-humble-nav2-controller
ros-humble-nav2-planner
ros-humble-nav2-recovery
ros-humble-nav2-lifecycle-manager
ros-humble-rviz2

回答

不一定要同时做这两个步骤——它们其实是两种获取 Nav2 的不同方式,你可以根据自己的需求择一:

  1. 二进制安装(Apt 安装)

    sudo apt update
    sudo apt install -y \
      ros-humble-navigation2 \
      ros-humble-nav2-bringup \
      ros-humble-nav2-map-server \
      ros-humble-nav2-bt-navigator \
      ros-humble-nav2-controller \
      ros-humble-nav2-planner \
      ros-humble-nav2-lifecycle-manager \
      ros-humble-rviz2
    

    这一步会把 Nav2 的所有包都以二进制形式安装到你的系统中,你就可以直接 source /opt/ros/humble/setup.bash 然后 ros2 launch nav2_bringup bringup_launch.py … 来使用。不需要再 clone 源码

  2. 从源码编译(Git clone + colcon build)

    mkdir -p ~/nav2_ws/src && cd ~/nav2_ws/src
    git clone https://github.com/ros-planning/navigation2.git --branch humble
    cd ~/nav2_ws
    rosdep install -y --from-paths src --ignore-src --rosdistro humble
    colcon build --symlink-install
    source install/setup.bash
    

    这套流程会把 Nav2 的源码拉到你的工作区,编译后你同样可以直接运行 Nav2。在这种模式下,你不需要再用 apt install ros-humble-navigation2 那些包,只要用 rosdep 装好依赖就行。


何时选哪种方式?

  • 只想快速使用、不改源码 → 直接用 Apt 安装,最省事。

  • 需要修改或追最新源码 → 用 clone + 编译,能够拿到最新的开发版本,方便调试和贡献。

  • 混合模式也可行

    • 先用 Apt 安装好依赖和已有的二进制包(把大多数包都装好),
    • 再在工作区 clone 你自己要定制的部分包做 overlay 编译。

只要确保环境中 sourced 的 setup 顺序正确(先 source 安装的 /opt/ros/humble/setup.bash,再 source 你的工作区 install/setup.bash),ROS2 会优先使用工作区里编译过的包。

继续提问

我想用这个命令:
sudo apt update
sudo apt install -y
ros-humble-navigation2
ros-humble-nav2-bringup
ros-humble-nav2-map-server
ros-humble-nav2-bt-navigator
ros-humble-nav2-controller
ros-humble-nav2-planner
ros-humble-nav2-recovery
ros-humble-nav2-lifecycle-manager
ros-humble-rviz2

但是可能有一些已经安装过了,是不是不用担心?会直接覆盖

回答

在 Ubuntu/Debian 的包管理里,执行

sudo apt update
sudo apt install -y \
  ros-humble-navigation2 \
  ros-humble-nav2-bringup \
  ros-humble-nav2-map-server \
  ros-humble-nav2-bt-navigator \
  ros-humble-nav2-controller \
  ros-humble-nav2-planner \
  ros-humble-nav2-recovery \
  ros-humble-nav2-lifecycle-manager \
  ros-humble-rviz2

幂等(idempotent)的操作:

  1. 已安装的包会被跳过或升级

    • 如果某个包(比如 ros-humble-navigation2)已经安装且当前就是最新版本,apt 会提示 “is already the newest version”,然后跳过,不会重新下载或覆盖。
    • 如果系统上有更低版本,而仓库里有更新版本,则会升级到最新版本。
  2. 仅安装缺失的依赖

    • 那些你还没装的包,apt 会帮你下载并安装。
  3. 不会产生重复安装或删除

    • apt install 从不会同时保留两个版本,也不会把你本地手动编译的工作区给“覆盖”——本地的 overlay 工作区(source + colcon build)会在你 source ~/your_ws/install/setup.bash 后优先被 ROS2 发现。
  4. 配置文件交互

    • 绝大多数 ROS2 Debian 包并不会带复杂的系统级配置文件;即便有冲突,-y 会让 debconf 选默认选项(一般是保留已安装的配置),也不会中断安装流程。

总结

如果只是想确保 ROS 2 Humble 下的 Nav2 相关包都已安装并且是最新版本,直接运行上述命令无需担心已安装的包会被乱改或重复安装。apt 会帮你安装缺失的、升级过时的,而对已是最新版的包则跳过。

继续提问

是不是在任何一个目录下安装都可以

回答

可以的。apt install 是一个系统级命令,它不依赖当前所在目录——无论你在家目录、工作目录,还是 /tmp/etc,都能正常运行。它会把对应的 Debian 包安装到系统的标准位置(/opt/ros/humble/.../usr/lib/... 等),与当前目录无关。

小贴士

  • 确保你有 sudo 权限。
  • 如果你是在开发自己的 ROS2 工作区(用 colcon build 的那种),那才需要注意“在哪个目录下 clone 源码、创建工作区”;而对于 apt install,无需担心目录问题。

你可能感兴趣的:(ROS2,git,ROS2,机器人)