导航框架(Nav2)
Nav2官网:https://docs.nav2.org/
Nav2中文网(鱼香Ros社区):http://dev.nav2.fishros.com/
Nav2 基础配置指南:https://docs.nav2.org/configuration/index.html
Nav2 细节配置指南:https://docs.nav2.org/tuning/index.html
Nav2 默认插件列表及自定义插件教程: https://docs.nav2.org/plugins/index.html#plugins
Nav2 API 文档(底层算法API): https://api.nav2.org/
Nav2 Simple Commander API文档(上层应用API):https://docs.nav2.org/commander_api/index.html
Nav2 核心服务器
行为服务器:行为树执行 nav2框架的behavior_server 默认采用spin(旋转)和backup(后退)和drive_on_heading(定向行驶)和assisted_teleop(辅助遥控)和wait(等待)插件
行为树导航器: 导航状态机
规划器服务器:全局路径规划 nav2框架的controller_server 默认采用MPPIController控制器插件
控制器服务器:路径跟踪 nav2框架的planner_server 默认采用NavfnPlanner规划器插件
路径平滑服务器:na2框架的smoother_server 默认采用SimpleSmoother插件
速度平滑服务器:nav2框架的velocity_smoother
路由服务器:路径管理 nv2框架的route_server 默认采用AdjustSpeedLimit和ReroutingService和CollisionMonitor插件
航点跟随:多点导航 nav2框架的waypoint_follower 默认采用wait_at_waypoint插件
碰撞监视服务器:碰撞检测 nav2框架的collision_monitor
对接服务器:自动对接 nav2框架的docking_server 默认采用simple_charging_dock对接插件 用于充电桩,插座等的对接(未使用)
禁区导航服务器<在原本静态地图上添加掩膜地图>在原本静态地图上添加掩膜地图>,掩膜区域划分为禁止规划通行区域
速度限制导航服务器<在原本静态地图上添加掩膜地图>在原本静态地图上添加掩膜地图>,掩膜区域划分为速度限制区域,通过时会将速度限制在设定范围内低速前进。
建图(slam_toolbox)
nav2 包内部集成 slam_toolbox
slamtoolbox 底层使用 karto_slam 算法,基于图优化slam算法完成
手动建图
手动遥控移动机器人进行建图
自动探索建图(explore_lite)
添加 explore_lite 算法 自动探索地图边界进行自主建图
建图算法
目前使用 slam_toolbox 内的 karto 图优化算法
slam_toolbox 和 cartographer 算法对比
| 对比维度 | slam_toolbox | Cartographer |
|---|---|---|
| 核心特点 | 专注于 2D SLAM,集成了强大的定位模式和地图维护工具,以应对动态环境。 | 支持2D与3D SLAM,以其跨平台性、实时性及低资源消耗的工程化实现著称。 |
| 核心技术路线 | 基于改进的 Karto 算法(优化图方法),使用 Ceres 进行后端优化。 | 采用基于子地图与全局位姿图优化的框架,并使用分支定界法加速闭环检测。 |
| 定位能力 | 集成专门的优化定位模式,可作为高性能的纯定位器使用,并能持续优化地图。 | 主要用于建图过程中的实时定位,其定位能力内嵌于SLAM流程中,独立的纯定位模式并非主要设计目标。 |
| 地图维护 | 非常强大。支持终生地图(长期增量建图)、地图序列化、多地图合并、交互式编辑。 | 支持子地图的构建与拼接。侧重于一次性构建大范围高精度地图,动态增量更新的能力不如前者突出。 |
| 环境适应性 | 为动态、变化的室内环境(如仓库、商店)设计,通过定位模式和地图更新处理环境变化。 | 对静态或准静态环境(如建筑、街道)有非常好的建图效果,动态适应性非其强项。 |
| 资源消耗 | 相对较高,尤其是在开启高级特性(如终生地图)时,但它提供异步模式以降低负载。 | 设计目标之一是低计算资源消耗和实时性,适合嵌入式或资源受限的平台。 |
| 适用场景 | 机器人长期运营、环境频繁变化、需高精度定位的2D场景,如仓库物流、服务机器人、零售店。 | 快速构建大规模、高精度地图,包括室内外2D/3D场景,如扫地机器人建图、自动驾驶初步测绘。 |
定位 (AMCL)
nav2 包内部集成 nv2_amcl locatlization_launch.py
AMCL: Adaptive Monte Carlo Localization 自适应蒙特卡洛定位 基于 粒子滤波 算法实现
导航 (Nav2)
nav2 包 导航系统 navigation_launch.py
Nav2的导航行为树
具体可查看 nav2 官方文档:https://docs.nav2.org/behavior_trees/index.html
默认使用 navigate_to_pose_w_replanning_and_recovery.xml 和 navigate_through_poses_w_replanning_and_recovery.xml 这两种导航策略
Nav2 库默认包含的核心行为树策略
| 文件名 | 核心策略与作用 | 适用场景 |
|---|---|---|
navigate_to_pose_w_replanning_and_recovery.xml | 经典全能策略:周期性重规划(默认1Hz) + 完善的恢复机制(清除地图、旋转、等待、后退)。 | 通用、默认选择。环境动态变化、需要高鲁棒性的场景。 |
navigate_through_poses_w_replanning_and_recovery.xml | 多目标点导航策略:专为顺序访问多个目标点(巡航)设计,在每个点之间复用经典的单点导航逻辑。 | 送餐、巡检等需要按顺序访问多个位置的场景。 |
navigate_to_pose_w_replanning_goal_patience_and_recovery.xml | 目标点容错策略:在经典策略基础上,增加 GPAL (Goal Pose Acceptable Limits) 节点,对最终到达精度要求更宽松。 | 目标点定位有噪声、或不需要精确对准的场景(如到达一个区域即可)。 |
follow_point.xml | 跟随点策略:持续跟踪一个动态更新的目标点(通常来自 RVIZ 的点击),不执行恢复动作,反应极快。 | 人工遥操作、实时目标跟踪。 |
odometry_calibration.xml | 里程计校准策略:控制机器人执行特定的固定运动模式(如旋转、前进),用于校准里程计参数。 | 系统调试和标定,非日常导航。 |
基于不同触发条件的重规划策略
| 文件名 | 重规划触发条件 | 设计目的与特点 |
|---|---|---|
navigate_w_replanning_time.xml | 定时触发:每 N 秒规划一次。 | 环境持续缓慢变化,平衡计算开销。 |
navigate_w_replanning_distance.xml | 定距触发:机器人移动 N 米后规划。 | 长距离直线行进,避免静止时无意义规划。 |
navigate_w_replanning_speed.xml | 低速触发:当机器人速度低于阈值时规划。 | 机器人被卡住或进展缓慢时立刻反应。 |
navigate_w_replanning_only_if_goal_is_updated.xml | 目标更新触发:仅当目标位置改变时重规划。 | 目标一旦设定就不变,或由外部高级规划器频繁更新的场景。 |
navigate_w_replanning_only_if_path_becomes_invalid.xml | 路径失效触发:仅当当前路径被障碍物阻挡时重规划。 | 静态环境,计算开销最小。 |
nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.xml | 组合触发:目标更新或路径失效时都触发重规划。 | 响应更灵敏,是上面两种策略的“或”组合。 |
navigate_w_recovery_and_replanning_only_if_path_becomes_invalid.xml | 极致保守策略:仅当路径失效时,才先尝试恢复动作,再重规划。 | 对稳定性要求极高,希望尽可能减少任何不必要动作的环境。 |
Nav2 行为树预注册的行为节点
动作插件 (Action Plugins)
| 中文名称 | 英文名称/ID (常见) | 功能简介 |
|---|---|---|
| 等待 | Wait | 实现机器人原地等待。(恢复行为) |
| 旋转 | Spin | 让机器人原地旋转指定的角度。(恢复行为) |
| 后退 | BackUp | 让机器人向后移动指定的距离。(恢复行为) |
| 驱车航行 | DriveOnHeading | 让机器人朝特定方向直线移动一段距离或时间。 |
| 辅助远程操作 | AssistedTeleop | 在人工遥控模式下提供辅助避障和局部规划。 |
| 计算到姿态的路径 | ComputePathToPose | 核心路径规划。根据目标位姿计算一条全局路径。 |
| 计算路由 | ComputeRouteToPose | 用于具有道路网络(如地图拓扑)的场景,计算路径点序列。 |
| 计算途径路由路由 | ComputePathThroughPoses | 计算一条经过一系列中间点的路径。 |
| 跟随路径 | FollowPath | 核心路径跟踪。控制机器人沿给定的路径移动。 |
| 导航定位 | NavigateToPose | 高层导航动作,内部封装了完整的规划、跟踪和恢复逻辑。 |
| 清除整个代价地图 | ClearEntireCostmap | 清除指定代价地图(全局或局部)的所有障碍物信息。 |
| 清除区域外的代价地图 | ClearCostmapExceptRegion | 清除代价地图中除指定矩形区域外的部分。 |
| 清除机器人周围的代价地图 | ClearCostmapAroundRobot | 清除机器人周围指定半径内的代价地图。 |
| 清除位姿周围的代价地图 | ClearCostmapAroundPose | 清除特定位姿周围指定半径内的代价地图。 |
| 重新初始化全局定位 | ReinitializeGlobalLocalization | 重置机器人的全局定位(如AMCL),通常在定位丢失时使用。 |
| 截断路径 | TruncatePath | 将路径从起点截断一定长度。 |
| 截断路径本地 | TruncatePathLocal | 在局部坐标系下截断路径。 |
| 规划选择器 | PlannerSelector | 动态切换使用哪个全局路径规划器。 |
| 控制器选择器 | ControllerSelector | 动态切换使用哪个局部路径跟踪控制器。 |
| 平滑器选择器 | SmootherSelector | 动态切换使用哪个路径平滑器。 |
| 目标检查器选择器 | GoalCheckerSelector | 动态切换使用哪个目标到达检查器。 |
| 进度检查器选择器 | ProgressCheckerSelector | 动态切换使用哪个进度检查器(用于检测是否被困)。 |
| 路径处理选择器 | PathProcessingSelector | 动态切换使用哪个路径后处理器。 |
| 导航姿势 | NavigateThroughPoses | 高层导航动作,顺序导航通过一系列目标点。 |
| 计算覆盖路径 | ComputePathToCoverage | 计算一条覆盖指定区域的路径(如清洁、巡检)。 |
| 取消导航 | CancelNav | 取消当前的导航任务。 |
| 移除已通过目标 | RemovePassedGoals | (多目标导航中)移除已通过的目标点。 |
| 移除碰撞目标 | RemoveCollisionGoals | 移除与障碍物冲突的目标点。 |
| 取消控制 | CancelControl | 取消当前的控制器跟踪动作。 |
| 取消后退 | CancelBackUp | 取消正在执行的后退动作。 |
| 取消旋转 | CancelSpin | 取消正在执行的旋转动作。 |
| 取消等待 | CancelWait | 取消正在执行的等待动作。 |
| 取消驾驶方向 | CancelDriveOnHeading | 取消正在执行的朝向驾驶动作。 |
| 取消辅助远程操作 | CancelAssistedTeleop | 取消正在执行的辅助遥控动作。 |
| 取消计算与追踪路线 | CancelComputePathThroughPoses | 取消正在执行的多点路径规划。 |
| 平滑路径 | SmoothPath | 对给定的路径进行平滑处理。 |
| 从路径获取位姿 | GetPoseFromPath | 从路径中提取特定索引或比例的位姿。 |
| 对接机器人 | DockRobot | 执行自动回充对接流程。 |
| 非对接机器人 | UndockRobot | 执行离开充电桩的流程。 |
| 连接路径 | ConcatenatePaths | 将多条路径连接成一条。 |
| 获取当前位置 | GetCurrentPose | 获取机器人当前的位姿估计。 |
| 附加目标姿势到目标 | AppendGoalPoseToPath | 将目标位姿附加到路径末尾。 |
| 提取路径节点作为目标 | ExtractRouteNodesAsGoals | 从路由网络中提取节点作为导航目标点序列。 |
| 获取下一个目标 | GetNextFewGoals | (多目标导航中)获取接下来的几个目标。 |
| 切换碰撞监视器 | ToggleCollisionMonitor | 启用或禁用碰撞监视系统。 |
| 跟随对象 | FollowObject | 动态跟踪一个移动的物体。 |
| 取消跟随对象 | CancelFollowObject | 取消物体跟踪任务。 |
条件插件 (Condition Plugins)
| 中文名称 | 英文名称/ID (常见) | 功能简介 |
|---|---|---|
| 目标到达 | GoalReached | 检查机器人是否已到达最终目标容差范围内。 |
| 变换可用 | TransformAvailable | 检查所需的坐标变换(TF)是否可用。 |
| 行走距离 | DistanceTraveled | 检查机器人自某参考点以来是否移动了指定距离。 |
| 目标已更新 | GoalUpdated | 核心条件。检查导航目标是否在任务执行中被更新。 |
| 全局更新目标 | GloballyUpdatedGoal | 检查全局(可能来自更高层任务)的目标是否更新。 |
| 初始姿势已接收 | InitialPoseReceived | 检查是否已收到有效的初始定位位姿。 |
| 目标附近 | IsGoalNearPose | 检查某个位姿是否在目标附近。 |
| 卡住了 | IsStuck | 检查机器人是否在指定时间内移动不足(被困)。 |
| 停止了 | IsRobotStopped | 检查机器人当前是否处于静止状态。 |
| 时间已过 | TimeExpired | 检查自某参考时间以来是否已过指定时长。 |
| 电池低了 | IsBatteryLow | 检查机器人电池电量是否低于阈值。 |
| 路径有效 | IsPathValid | 检查当前规划出的路径是否有效(如未被障碍物完全阻挡)。 |
| 位姿被占据 | IsPoseOccupied | 检查地图上特定位姿是否被障碍物占据。 |
| 路径过期计时器 | PathExpiringTimer | 检查当前用于跟踪的路径是否即将过期(需要重新规划)。 |
| 存在错误码 | AreErrorCodesPresent | 检查是否有特定的错误码被设置。 |
| 控制器恢复是否有帮助 | WouldAControllerRecoveryHelp | 评估执行控制器级别的恢复动作(如清除局部地图)是否可能解决问题。 |
| 规划器恢复是否有帮助 | WouldAPlannerRecoveryHelp | 评估执行规划器级别的恢复动作(如清除全局地图)是否可能解决问题。 |
| 平滑器恢复是否有帮助 | WouldASmootherRecoveryHelp | 评估执行路径平滑是否可能解决问题。 |
| 路由恢复是否有帮助 | WouldARouteRecoveryHelp | 评估执行路由恢复是否可能解决问题。 |
| 电池正在充电 | IsBatteryCharging | 检查电池当前是否处于充电状态。 |
| 位姿接近 | ArePosesNear | 检查两个位姿在距离和角度上是否都足够接近。 |
控制插件 (Control Plugins)
| 中文名称 | 英文名称/ID (常见) | 功能简介 |
|---|---|---|
| 管道序列 | PipelineSequence | 一种特殊的顺序节点,所有子节点在单次Tick中被依次执行,用于需要“流水线”式处理的场景。 |
| 循环赛 | RoundRobin | 按顺序轮流执行其子节点。 |
| 恢复节点 | RecoveryNode | 核心恢复逻辑。封装一个“尝试动作-检查结果-重试/回退”的恢复模式。 |
| 非阻塞序列 | ReactiveSequence | 反应式序列。按顺序执行子节点,但当一个子节点返回RUNNING时,仍会持续检查前面已成功的条件子节点。如果条件失败,则中断正在运行的动作。 |
| 持久序列 | ReactiveFallback | 反应式回退。尝试子节点,但当一个子节点返回RUNNING时,仍会持续检查其前面的条件/动作。 |
| 暂停恢复控制器 | PauseRecoveryController | 用于暂停控制器的恢复行为。 |
装饰器插件 (Decorator Plugins)
| 中文名称 (推断) | 英文名称/ID (常见) | 功能简介 |
|---|---|---|
| 速率控制器 | RateController | 控制其子节点的执行频率(如每秒最多Tick一次)。 |
| 距离控制器 | DistanceController | 控制其子节点在机器人移动特定距离后才执行一次。 |
| 速度控制器 | SpeedController | 根据机器人速度调整子节点的行为(如不同速度下使用不同的参数)。 |
| 目标更新器 | GoalUpdater | 用于在子节点执行前动态更新传递给它的目标参数。 |
| 接近时路径加长 | PathLongerOnApproach | 当接近目标时,对路径进行特殊处理(如延长以进行精确对准)。 |
| 单触发器 | SingleTrigger | 确保其子节点只成功执行一次,后续Tick直接返回成功。 |
| 目标更新控制器 | GoalUpdateController | 控制目标更新的逻辑,可能与GoalUpdater类似或为其组合。 |
路径规划 插件对比
目前使用的为 NavFn 插件
| 规划器类别/插件 | 核心算法 | 路径质量与特性 | 适用机器人类型 | 典型场景 | 主要优势/劣势 |
|---|---|---|---|---|---|
| NavFn | Dijkstra / A* | 离散格点路径,可能有“锯齿”,路径不保证运动学可行 | 圆形差速、全向 (可原地旋转) | 室内结构化环境、已知地图 | 优势:算法经典、成熟稳定、计算快 劣势:路径不连续、非圆形/阿克曼机器人支持差 |
| Smac 2D Planner | A* (高度优化,4/8连接) | 优化格点路径,更平滑,支持任意角度到达 | 圆形差速、全向 | 需要平滑路径的室内/结构化环境 | 优势:比传统Grid-Based路径更优、计算高效,是Nav2新默认规划器 |
| Theta* Planner | Theta* (基于A*) | 任意角度直线路径,绕过格点约束,更接近理论最短 | 圆形差速、全向 | 追求路径最短、平滑的场景 | 优势:路径长度理论最优、更自然 劣势:计算量稍大、需调参保证可行性 |
| Smac Hybrid-A | Hybrid-A* | 运动学可行路径,连续曲率,支持倒车 | 阿克曼、足式、任意形状 | 汽车模型、户外、非完整约束机器人 | 优势:保证运动学可行、可处理任意形状轮廓 劣势:计算量大于2D规划器 |
| Smac State Lattice | State Lattice | 运动学可行路径,基于运动基元库,非常平滑 | 差速、全向、阿克曼及自定义模型 | 对平滑性和精确运动控制要求高的场景 | 优势:路径平滑度高、可定制运动基元 劣势:需要预生成/加载运动基元库 |
控制器 插件对比
控制器算法插件
目前使用的为 MPPI 控制器
| 控制器名称 | 核心原理 | 主要优势 | 主要劣势/挑战 | 典型使用场景 | 适用机器人类型 |
|---|---|---|---|---|---|
| DWB Controller | 采样优化:生成多个可行的速度命令(轨迹),通过包含路径跟随、避障、速度等的代价函数进行评分,选择综合得分最高的轨迹执行。 | 1. 灵活可调:可通过代价函数灵活定义机器人行为。 2. 约束全面:易于融入动力学、平滑性等约束。 3. 动态避障:能较好处理动态障碍物。 | 1. 计算负担较重:实时生成和评估多条轨迹消耗资源。 2. 参数调优复杂:代价函数权重需仔细调整以平衡不同目标。 | 复杂动态环境下的高精度轨迹跟踪、需要灵活行为调整的场景。 | 差速、全向轮式移动机器人。 |
| Graceful Controller | 基于李雅普诺夫稳定性设计:在极坐标空间将运动分解为朝向(快子系统)和位置(慢子系统)控制,保证全局渐近稳定收敛。 | 1. 轨迹平滑:理论保证产生平滑、无超调的轨迹。 2. 乘坐舒适:非常适用于载人机器人。 3. 理论保证强:有严格的数学稳定性证明。 | 1. 动态环境适应性有限:原生设计主要针对静态路径跟踪,处理复杂动态障碍物能力较弱。 2. 调参抽象:参数与实际运动表现的对应关系不如其他控制器直观。 | 服务机器人、接待机器人、展示机器人等对运动平稳性和舒适性要求极高的场景。 | 差速、全向移动机器人。 |
| MPPI | 并行随机采样:在控制序列上施加随机扰动,通过GPU并行前向模拟生成大量“假设”轨迹,按指数加权代价选择最优控制序列。 | 1. 无需梯度:可处理非平滑、不连续的代价函数,适用性广。 2. 擅长复杂模型:能很好处理机器人及环境的强非线性。 3. 并行高效:算法天然适合GPU加速,实时性潜力大。 | 1. 依赖精确模型:前向模拟的质量完全取决于系统动力学模型的准确性。 2. 计算资源要求高:尽管可并行,但要达到实时仍需可观算力(通常需GPU)。 3. 理论门槛高:理解和调优相对复杂。 | 高动态、交互密集的复杂环境(如密集人群穿行、多机器人协作)、对控制性能有极致追求的前沿应用。 | 各类移动机器人、机械臂等,尤其适合计算平台强大的机器人。 |
| Regulated Pure Pursuit | 几何追踪 + 启发式规则:跟随路径前方一定距离的“前视点”,并加入对曲率、接近障碍物等因素的启发式速度调节规则。 | 1. 简单高效:计算量极小,非常稳定可靠。 2. 易于理解和调试:参数物理意义明确(前视距离、速度等)。 3. 安全增强:速度调节规则能在靠近障碍物或急弯时自动减速。 | 1. 灵活性一般:行为主要由几何和简单规则决定,难以实现非常复杂的跟踪或避障行为。 2. 复杂场景适应性有限:在极度混乱或动态极强的环境中可能表现不佳。 | 仓库物流机器人、酒店送货机器人、大多数服务机器人等需要稳定、可靠导航的日常场景。 | 差速机器人为主,部分适配全向和阿克曼转向机器人。 |
| Rotation Shim Controller | 前处理垫片:在路径跟踪主控制器执行前,判断路径初始方向与机器人当前朝向的偏差。若超过阈值,则先指令机器人原地旋转至对准路径,再移交控制权。 | 1. 解决特定问题:有效处理大初始航向偏差,避免“倒车”等异常。 2. 模块化设计:作为预处理插件,可与任何主控制器(如Pure Pursuit, DWB)无缝配合,提升其起始性能。 | 1. 功能单一:仅处理起始旋转问题,不负责后续路径跟踪。 2. 依赖主控制器:必须与其他控制器配合使用。 | 规划器生成的路径起始方向与机器人当前朝向存在较大偏差时;与非考虑运动学的规划器(如NavFn)配合使用时。 | 可原地旋转的差速、全向移动机器人。 |
控制器的目标检查器 插件
SimpleGoalChecker:检查机器人是否在目标点的平移距离(位置)和旋转距离(角度)容差范围内,检查 位置+角度 容差
StoppedGoalChecker:检查机器人是否在目标点的平移距离(位置)和旋转距离(角度) 以及速度阈值,检查 位置+角度+速度
PositionGoalChecker:检查机器人是否在目标点平移距离(直线距离)范围内,而不要求旋转方向(角度)对准,只检查 位置 ,不检查 角度
控制器的进程检查器 插件
SimpleProgressChecker:检查机器人在给定时间内是否能够移动一段最小距离以向目标点推进 距离目标的减少量
PoseProgressChecker:检查机器人在给定时间内是否能够移动一段最小直线距离或旋转一个最小角度以向目标点推进 与目标姿态的相对进展
路径平滑器插件
Simple Smoother:一个简单的路径平滑化 不可行(例如二维) 规划器(默认)
Constrained Smoother:使用一个更光滑的路径 约束问题解决器 以优化各种标准 例如光滑性或 距离障碍物, 保持最小转向 半径
Savitzky-Golay Smoother:使用一个更光滑的路径 萨维茨基-戈莱滤波器 将路径平滑化为 数字信号处理 以消除噪声 路径
航点任务执行器 插件
WaitAtWaypoint: 用于执行等待的插件 行为开启 航点到达
PhotoAtWaypoint: 用于保存照片的插件 到指定的目录 航点到达(无法执行触发拍照功能,在此插件基础上修改增加功能)
InputAtWaypoint: 等待用户输入的插件 然后再进入下一个 航点
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时