插件(Plugins)
Nav2 提供了丰富的插件接口,方便用户自定义应用逻辑和算法,包括代价地图层(costmap layer)、规划器(planner)、控制器(controller)、行为树(behavior tree)和行为(behavior)插件。下方列出了 ROS 2 Navigation 已知的全部插件。如果你知道尚未收录的插件,或自行开发了新插件,欢迎提交 Pull Request 补充信息。
有关自定义插件的编写教程,请参阅编写新的 Costmap2D 插件、编写新的 BT 插件、编写新的控制器插件、编写新的规划器插件、编写新的行为插件或编写新的导航器插件。
行为树导航器(Behavior-Tree Navigators)
Section titled “行为树导航器(Behavior-Tree Navigators)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| NavigateToPoseNavigator | Steve Macenski | 通过行为树动作服务器进行点到点(point-to-point)导航 |
| NavigateThroughPosesNavigator | Steve Macenski | 通过行为树动作服务器进行点序列(point-through-points)导航 |
| CoverageNavigator | Steve Macenski | 通过行为树实现全覆盖(coverage)导航(笛卡尔坐标或 GPS) |
代价地图层(Costmap Layers)
Section titled “代价地图层(Costmap Layers)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| Voxel Layer | Eitan Marder-Eppstein | 使用深度和激光传感器读数维护持久的 3D 体素层,并通过射线投射(raycasting)清除自由空间 |
| Range Layer | David Lu | 使用概率模型,将发布 range 消息的传感器数据放入代价地图 |
| Static Layer | Eitan Marder-Eppstein | 获取静态 map 并将占用信息加载到代价地图中 |
| Inflation Layer | Tony Najjar | 以指数衰减的方式在代价地图中膨胀致命障碍物(可选择使用 OpenMP 进行并行化) |
| Legacy Inflation Layer | Eitan Marder-Eppstein | 以指数衰减的方式在代价地图中膨胀致命障碍物 |
| Asymmetric Inflation Layer | Marc Blöchlinger | 使用全局路径,对路径一侧的致命障碍物进行非对称膨胀 |
| Obstacle Layer | Eitan Marder-Eppstein | 从 2D 激光扫描维护持久的 2D 代价地图,并通过射线投射清除自由空间 |
| Spatio-Temporal Voxel Layer | Steve Macenski | 通过传感器模型维护带衰减的时域 3D 稀疏体素栅格 |
| Non-Persistent Voxel Layer | Steve Macenski | 维护仅由最近几组测量构成的 3D 占用栅格 |
| Denoise Layer | Andrey Ryzhikov | 过滤噪声引起的孤立障碍物或小障碍物群 |
| Plugin Container Layer | Alexander Yuen | 将指定的多个代价地图层组合在一起,以隔离层叠加的方式填充同一张代价地图 |
| Ground Consistency Layer | Muhammad Haider Khan Lodhi | 使用 3D 地面分割的高度感知代价地图层。与膨胀层(Inflation Layer)配合使用可实现地形感知导航 |
| Semantic Segmentation Layer | Pedro Gonzalez | 基于视觉的语义分割代价地图层,使用逐像素类别掩码和配准后的点云实现地形感知导航 |
| Virtual Layer | Sherif Fathey | 使用多边形、线条和圆形创建动态虚拟代价区域和限制区域 |
代价地图过滤器(Costmap Filters)
Section titled “代价地图过滤器(Costmap Filters)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| Keepout Filter | Alexey Merzlyakov | 维护禁入/安全区域和移动的优选车道(preferred lanes) |
| Speed Filter | Alexey Merzlyakov | 限制机器人在限速区域内的最大速度 |
| Binary Filter | Alexey Merzlyakov | 启用二进制(布尔)掩码行为以触发动作 |
| Zone Parameter Filter | Akihiko Komada | 根据机器人位姿处的掩码值,应用一组配置好的 ROS 参数 |
控制器(Controllers)
Section titled “控制器(Controllers)”| 插件名称 | 创建者 | 描述 | 驱动方式支持 |
|---|---|---|---|
| DWB Controller | David Lu!! | 高度可配置的 DWA 实现,带插件接口 | Differential、Omnidirectional、Legged |
| TEB Controller | Christoph Rösmann | 类 MPC 的控制器,适用于阿克曼、差速和全向机器人 | Ackermann、Legged、Omnidirectional、Differential |
| Regulated Pure Pursuit | Steve Macenski | 纯跟踪(pure pursuit)算法的服务/工业机器人变体,具有自适应特性 | Ackermann、Legged、Differential |
| MPPI Controller | Steve Macenski、Aleksei Budyakov | 具有模块化及自定义代价函数的预测性 MPC 控制器,可完成多种任务 | Differential、Omni、Ackermann |
| Rotation Shim Controller | Steve Macenski | 一种「垫片」(shim)控制器,在移交给主控制器进行跟踪之前先旋转到路径航向 | Differential、Omni、原地旋转模型 |
| Graceful Controller | Alberto Tudela | 基于位姿跟随控制律生成平滑轨迹的控制器 | Differential、Omni、Legged |
| Vector Pursuit Controller | Black Coffee Robotics | 基于矢量追踪(vector pursuit)算法的控制器,适用于高速精确的路径跟踪 | Differential、Ackermann、Legged |
规划器(Planners)
Section titled “规划器(Planners)”| 插件名称 | 创建者 | 描述 | 驱动方式支持 |
|---|---|---|---|
| NavFn Planner | Eitan Marder-Eppstein & Kurt Konolige | 使用 A* 或 Dijkstra 扩展的导航函数,假设为 2D 全向(holonomic)质点 | Differential、Omnidirectional、Legged |
SmacPlannerHybrid(原名 SmacPlanner) | Steve Macenski | SE2 Hybrid-A* 实现,使用 Dubins 或 Reeds-Shepp 运动模型,内置平滑器和多分辨率查询。适用于汽车、类汽车和阿克曼车辆,满足运动学约束 | Ackermann、Differential、Omnidirectional、Legged |
| SmacPlanner2D | Steve Macenski | 2D A* 实现,使用 4 或 8 连通邻域,内置平滑器和多分辨率查询 | Differential、Omnidirectional、Legged |
| SmacPlannerLattice | Steve Macenski | 状态格(State Lattice)规划器实现,使用预生成的最小控制集,可为任意类型车辆生成运动学可行的路径。包含用于阿克曼、差速、全向和足式机器人的生成脚本 | Differential、Omnidirectional、Ackermann、Legged、Arbitrary / Custom |
| ThetaStarPlanner | Anshumaan Singh | Theta* 的实现,使用 4 或 8 连通邻域,假设机器人为 2D 全向质点 | Differential、Omnidirectional |
平滑器(Smoothers)
Section titled “平滑器(Smoothers)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| Simple Smoother | Steve Macenski | 适用于运动学不可行(如 2D)规划器的简单路径平滑器 |
| Constrained Smoother | Matej Vargovcik & Steve Macenski | 使用约束问题求解器的路径平滑器,可优化平滑度、与障碍物距离等多种指标,同时保持最小转弯半径 |
| Savitzky-Golay Smoother | Steve Macenski | 使用 Savitzky-Golay 滤波器,通过数字信号处理技术平滑路径、去除噪声 |
行为(Behaviors)
Section titled “行为(Behaviors)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| Clear Costmap | Eitan Marder-Eppstein | 在感知错误或机器人卡住时,清除指定代价地图的服务 |
| Spin | Steve Macenski | 可配置角度的旋转行为,用于清除周围自由空间并帮助机器人摆脱局部困境 |
| Back Up | Brian Wilcox | 可配置距离的后退行为,帮助机器人脱困 |
| Wait | Steve Macenski | 可配置时长的等待行为,用于应对临时性障碍物(如人流)或等待更多传感器数据 |
| Drive On Heading | Joshua Wallace | 可配置行驶距离的按航向行驶行为 |
| Assisted Teleop | Joshua Wallace | AssistedTeleop 行为,缩放遥操作指令以防止碰撞 |
航点任务执行器(Waypoint Task Executors)
Section titled “航点任务执行器(Waypoint Task Executors)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| WaitAtWaypoint | Fetullah Atas | 在航点到达时执行等待行为的插件 |
| PhotoAtWaypoint | Fetullah Atas | 在航点到达时拍照并保存到指定目录的插件 |
| InputAtWaypoint | Steve Macenski | 在移动到下一个航点之前等待用户输入的插件 |
目标检查器(Goal Checkers)
Section titled “目标检查器(Goal Checkers)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| SimpleGoalChecker | David Lu!! | 检查机器人是否在目标点的平移和旋转容差范围内 |
| StoppedGoalChecker | David Lu!! | 在 SimpleGoalChecker 基础上,额外检查速度是否低于阈值 |
| PositionGoalChecker | Prabhav Saxena | 仅检查平移距离是否在容差范围内,不要求旋转收敛 |
| AxisGoalChecker | Guillaume Doisy & Tony Najjar | 检查机器人沿路径方向和垂直于路径方向(cross-track)是否均在容差范围内 |
| AdaptiveToleranceGoalChecker | David Grbac | 检查机器人是否在目标点的平移(使用两级容差)和旋转容差范围内 |
进度检查器(Progress Checkers)
Section titled “进度检查器(Progress Checkers)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| SimpleProgressChecker | David Lu!! | 检查机器人是否在给定时间内向目标移动了最小距离 |
| PoseProgressChecker | Guillaume Doisy | 检查机器人是否在给定时间内向目标移动了最小距离或角度 |
路径处理器(Path Handlers)
Section titled “路径处理器(Path Handlers)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| FeasiblePathHandler | Maurice Alexander Purnawan | 将全局路径变换到局部代价地图坐标系,裁剪至代价地图边界内,并处理原地旋转和尖点(cusp)裁剪 |
行为树节点(Behavior Tree Nodes)
Section titled “行为树节点(Behavior Tree Nodes)”动作插件(Action Plugins)
| 动作插件名称 | 创建者 | 描述 |
|---|---|---|
| Back Up Action | Michael Jeronimo | 调用后退行为动作 |
| Drive On Heading Action | Joshua Wallace | 调用按航向行驶行为动作 |
| Assisted Teleop Action | Joshua Wallace | 调用辅助遥操作行为动作 |
| Clear Entire Costmap Service | Carl Delsey | 调用清除整个代价地图的服务 |
| Clear Costmap Except Region Service | Guillaume Doisy | 调用清除除指定区域外代价地图的服务 |
| Clear Costmap Around Robot Service | Guillaume Doisy | 调用清除机器人周围代价地图的服务 |
| Compute Path to Pose Action | Michael Jeronimo | 调用 Nav2 规划器服务器 |
| Smooth Path Action | Matej Vargovcik | 调用 Nav2 平滑器服务器 |
| Follow Path Action | Michael Jeronimo | 调用 Nav2 控制器服务器 |
| Navigate to Pose Action | Michael Jeronimo | 供其他 BehaviorTree.CPP 行为树以子树形式调用 Nav2 导航动作的 BT 节点 |
| Reinitialize Global Localization Service | Carl Delsey | 将 AMCL 重新初始化到新位姿 |
| Spin Action | Carl Delsey | 调用旋转行为动作 |
| Wait Action | Steve Macenski | 调用等待行为动作 |
| Truncate Path | Francisco Martín | 截短路径 |
| Truncate Path Local | Matej Vargovcik | 提取机器人周围的一段路径 |
| Planner Selector | Pablo Iñigo Blasco | 基于话题输入选择全局规划器,否则使用默认规划器 id |
| Controller Selector | Pablo Iñigo Blasco | 基于话题输入选择控制器,否则使用默认控制器 id |
| Goal Checker Selector | Pablo Iñigo Blasco | 基于话题输入选择目标检查器,否则使用默认目标检查器 id |
| Smoother Selector | Owen Hooper | 基于话题输入选择平滑器,否则使用默认平滑器 id |
| Progress Checker Selector | Steve Macenski | 基于话题输入选择进度检查器,否则使用默认进度检查器 id |
| Path Handler Selector | Maurice Alexander Purnawan | 基于话题输入选择路径处理器,否则使用默认路径处理器 id |
| Navigate Through Poses | Steve Macenski | 供其他 BehaviorTree.CPP 行为树以子树形式调用 Nav2 NavThroughPoses 动作的 BT 节点 |
| Remove Passed Goals | Steve Macenski | 移除已通过或在容差范围内的目标位姿,用于在路径重新规划时剔除旧的途经点(viapoints) |
| Remove In Collision Goals | Tony Najjar | 移除足迹或点代价高于阈值的目标位姿 |
| Compute Path Through Poses | Steve Macenski | 使用指定的规划器插件计算通过一组位姿的路径,而非仅到单个目标位姿的路径 |
| Compute Route | Steve Macenski | 计算穿过导航图的路线(Route),返回一条密集路径以及一组稀疏的路线节点和边 |
| Compute And Track Route | Steve Macenski | 在计算路线的同时主动跟踪进度,并触发路线上下文相关的语义操作 |
| Cancel Control Action | Pradheep Padmanabhan | 取消 Nav2 控制器服务器 |
| Cancel BackUp Action | Pradheep Padmanabhan | 取消后退行为动作 |
| Cancel Spin Action | Pradheep Padmanabhan | 取消旋转行为动作 |
| Cancel Wait Action | Pradheep Padmanabhan | 取消等待行为动作 |
| Cancel Route Action | Steve Macenski | 取消 ComputeAndTrackRoute 动作 |
| Cancel Drive on Heading Action | Joshua Wallace | 取消按航向行驶行为动作 |
| Cancel Assisted Teleop Action | Joshua Wallace | 取消辅助遥操作行为动作 |
| Cancel Complete Coverage Action | Steve Macenski | 取消计算完整覆盖 |
| Compute Complete Coverage Path Action | Steve Macenski | 调用覆盖规划器服务器 |
| Get Pose From Path Action | Marc Morcos | 从路径中提取位姿 |
| Dock Robot Action | Steve Macenski | 调用停靠机器人动作 |
| Undock Robot Action | Steve Macenski | 调用解除停靠机器人动作 |
| Concatenate Paths Action | Steve Macenski | 将两条路径拼接在一起 |
| Get Current Pose Action | Steve Macenski | 获取当前位姿并写入黑板(blackboard) |
| Append Goal Pose To Goals Action | Steve Macenski | 将目标位姿追加到目标向量 |
| Extract Route Nodes To Goals Action | Steve Macenski | 将路线节点转换为目标 |
| Get Next Few Goals Action | Steve Macenski | 获取目标向量中的接下来 N 个目标 |
| Toggle Collision Monitor Service | David Grbac | 调用碰撞监控器的启停服务 |
| Follow Object | Alberto Tudela | 动态跟随物体 |
| Cancel Follow Object | Alberto Tudela | 取消跟随物体动作 |
| Validate Path | Joshua Wallace | 通过确保路径上没有致命(LETHAL)障碍物来检查路径是否有效 |
| Check Stop Status | Tony Najjar | 检查机器人是否已持续停止一段时间 |
| Check Pose Occupancy | Maurice Alexander Purnawan | 检查位姿是否被占用 |
条件插件(Condition Plugins)
| 条件插件名称 | 创建者 | 描述 |
|---|---|---|
| Goal Reached Condition | Carl Delsey | 检查是否在容差范围内到达目标 |
| Goal Updated Condition | Aitor Miguel Blanco | 检查目标是否被抢占(preempted) |
| Global Updated Goal Condition | Joshua Wallace | 检查全局 BT 上下文中目标是否被抢占 |
| Initial Pose received Condition | Carl Delsey | 检查是否已设置初始位姿 |
| Is Stuck Condition | Michael Jeronimo | 检查机器人正在前进还是已卡住 |
| Transform Available Condition | Steve Macenski | 检查 TF 变换是否可用。成功后,后续调用均返回成功 |
| Distance Traveled Condition | Sarthak Mittal | 检查机器人是否已行驶给定距离 |
| Time Expired Condition | Sarthak Mittal | 检查给定时长是否已过 |
| Is Battery Low Condition | Sarthak Mittal | 检查电池百分比是否低于指定值 |
| Path Expiring Timer | Joshua Wallace | 检查定时器是否已过期。若路径更新,则重置定时器 |
| Are Error Codes Present | Joshua Wallace | 检查指定错误码是否存在 |
| Would A Controller Recovery Help | Joshua Wallace | 检查控制器恢复是否有助于清除控制器服务器错误码 |
| Would A Planner Recovery Help | Joshua Wallace | 检查规划器恢复是否有助于清除规划器服务器错误码 |
| Would A Smoother Recovery Help | Joshua Wallace | 检查平滑器恢复是否有助于清除平滑器服务器错误码 |
| Would A Route Recovery Help | Steve Macenski | 检查路线恢复是否有助于清除路线服务器错误码 |
| Is Battery Charging Condition | Alberto Tudela | 检查电池是否正在充电 |
| Are Poses Near Condition | Steve Macenski | 检查两个位姿是否彼此靠近 |
| Is Goal Nearby Condition | Jakub Chudziński | 根据剩余路径长度检查机器人是否靠近目标 |
| Is Within Path Tracking Bounds Condition | Berkan Tali | 检查机器人是否在路径跟踪边界内 |
装饰器插件(Decorator Plugins)
| 装饰器插件名称 | 创建者 | 描述 |
|---|---|---|
| Rate Controller | Michael Jeronimo | 将子节点节流(throttle)到给定频率 |
| Distance Controller | Sarthak Mittal | 根据机器人行驶的距离来 tick 子节点 |
| Speed Controller | Sarthak Mittal | 根据当前机器人速度将子节点节流到一定频率 |
| Goal Updater | Francisco Martín | 更新通过话题订阅接收到的目标 |
| Single Trigger | Steve Macenski | 每次 BT 运行仅触发下方节点/子树一次 |
| PathLongerOnApproach | Pradheep Padmanabhan | 接近目标时,若新全局路径明显长于旧全局路径,则触发子节点 |
| GoalUpdatedController | Sophia Koffler | 若目标已更新,则 tick 子节点 |
控制插件(Control Plugins)
| 控制插件名称 | 创建者 | 描述 |
|---|---|---|
| Pipeline Sequence | Carl Delsey | 序列节点的变体,即使后续子节点正在运行,也会重新 tick 之前的子节点 |
| Recovery | Carl Delsey | 节点必须包含 2 个子节点。若第一个成功则直接返回成功;若失败则 tick 第二个子节点,若第二个成功则重试第一个,并返回其结果 |
| Round Robin | Mohammad Haghighipanah | 依次 tick 第 i 个子节点直至返回结果,然后继续 tick 第 i+1 个 |
| Nonblocking Sequence | Alexander Yuen | 序列节点的变体,即使某个子节点返回 RUNNING 也会 tick 完整个序列。重新 tick 该控制节点时,已成功的子节点会再次被 tick,以防陈旧状态被锁存(latched) |
| Persistent Sequence | Enjoy Robotics | 序列节点的一种变体,将 current_child_idx 暴露为双向端口 |
| Pause Resume Controller | Enjoy Robotics | 通过服务调用来控制树的暂停与恢复执行 |
路线插件(Route Plugins)
Section titled “路线插件(Route Plugins)”边评分器(Edge Scorers)
Section titled “边评分器(Edge Scorers)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| DistanceScorer | Steve Macenski | 按边长度评分,可选择按相对速度限制进行缩放 |
| TimeScorer | Steve Macenski | 根据绝对速度限制或历史通行时间估算边的通行时间并评分 |
| PenaltyScorer | Steve Macenski | 使用静态语义惩罚值评分 |
| SemanticScorer | Steve Macenski | 利用边和/或节点上存储的语义数据评分 |
| StartPoseOrientationScorer | Alex Yuen | 根据初始位姿与起始边朝向的关系评分 |
| GoalPoseOrientationScorer | Alex Yuen | 根据目标位姿与目标边朝向的关系评分 |
| DynamicEdgesScorer | Steve Macenski | 根据动态设置的服务代价和/或关闭状态评分 |
路线操作(Route Operations)
Section titled “路线操作(Route Operations)”| 插件名称 | 创建者 | 描述 |
|---|---|---|
| AdjustSpeedLimit | Steve Macenski | 使用边的语义数据调整机器人速度限制 |
| CollisionMoniter | Steve Macenski | 跟踪路线时检查近期是否会发生碰撞 |
| TimeMarker | Steve Macenski | 在边的元数据中记录边的通行时间 |
| ReroutingService | Steve Macenski | 从外部服务器触发重新规划路线 |
| TriggerEvent | Steve Macenski | 基于可配置的服务器名称触发事件 |
图文件解析器(Graph File Parsers)
Section titled “图文件解析器(Graph File Parsers)”目前仅支持 geojson 解析。