Skip to content

插件(Plugins)

Nav2 提供了丰富的插件接口,方便用户自定义应用逻辑和算法,包括代价地图层(costmap layer)、规划器(planner)、控制器(controller)、行为树(behavior tree)和行为(behavior)插件。下方列出了 ROS 2 Navigation 已知的全部插件。如果你知道尚未收录的插件,或自行开发了新插件,欢迎提交 Pull Request 补充信息。

有关自定义插件的编写教程,请参阅编写新的 Costmap2D 插件、编写新的 BT 插件、编写新的控制器插件、编写新的规划器插件、编写新的行为插件或编写新的导航器插件。

行为树导航器(Behavior-Tree Navigators)

Section titled “行为树导航器(Behavior-Tree Navigators)”
插件名称创建者描述
NavigateToPoseNavigatorSteve Macenski通过行为树动作服务器进行点到点(point-to-point)导航
NavigateThroughPosesNavigatorSteve Macenski通过行为树动作服务器进行点序列(point-through-points)导航
CoverageNavigatorSteve Macenski通过行为树实现全覆盖(coverage)导航(笛卡尔坐标或 GPS)
插件名称创建者描述
Voxel LayerEitan Marder-Eppstein使用深度和激光传感器读数维护持久的 3D 体素层,并通过射线投射(raycasting)清除自由空间
Range LayerDavid Lu使用概率模型,将发布 range 消息的传感器数据放入代价地图
Static LayerEitan Marder-Eppstein获取静态 map 并将占用信息加载到代价地图中
Inflation LayerTony Najjar以指数衰减的方式在代价地图中膨胀致命障碍物(可选择使用 OpenMP 进行并行化)
Legacy Inflation LayerEitan Marder-Eppstein以指数衰减的方式在代价地图中膨胀致命障碍物
Asymmetric Inflation LayerMarc Blöchlinger使用全局路径,对路径一侧的致命障碍物进行非对称膨胀
Obstacle LayerEitan Marder-Eppstein从 2D 激光扫描维护持久的 2D 代价地图,并通过射线投射清除自由空间
Spatio-Temporal Voxel LayerSteve Macenski通过传感器模型维护带衰减的时域 3D 稀疏体素栅格
Non-Persistent Voxel LayerSteve Macenski维护仅由最近几组测量构成的 3D 占用栅格
Denoise LayerAndrey Ryzhikov过滤噪声引起的孤立障碍物或小障碍物群
Plugin Container LayerAlexander Yuen将指定的多个代价地图层组合在一起,以隔离层叠加的方式填充同一张代价地图
Ground Consistency LayerMuhammad Haider Khan Lodhi使用 3D 地面分割的高度感知代价地图层。与膨胀层(Inflation Layer)配合使用可实现地形感知导航
Semantic Segmentation LayerPedro Gonzalez基于视觉的语义分割代价地图层,使用逐像素类别掩码和配准后的点云实现地形感知导航
Virtual LayerSherif Fathey使用多边形、线条和圆形创建动态虚拟代价区域和限制区域

代价地图过滤器(Costmap Filters)

Section titled “代价地图过滤器(Costmap Filters)”
插件名称创建者描述
Keepout FilterAlexey Merzlyakov维护禁入/安全区域和移动的优选车道(preferred lanes)
Speed FilterAlexey Merzlyakov限制机器人在限速区域内的最大速度
Binary FilterAlexey Merzlyakov启用二进制(布尔)掩码行为以触发动作
Zone Parameter FilterAkihiko Komada根据机器人位姿处的掩码值,应用一组配置好的 ROS 参数
插件名称创建者描述驱动方式支持
DWB ControllerDavid Lu!!高度可配置的 DWA 实现,带插件接口Differential、Omnidirectional、Legged
TEB ControllerChristoph Rösmann类 MPC 的控制器,适用于阿克曼、差速和全向机器人Ackermann、Legged、Omnidirectional、Differential
Regulated Pure PursuitSteve Macenski纯跟踪(pure pursuit)算法的服务/工业机器人变体,具有自适应特性Ackermann、Legged、Differential
MPPI ControllerSteve Macenski、Aleksei Budyakov具有模块化及自定义代价函数的预测性 MPC 控制器,可完成多种任务Differential、Omni、Ackermann
Rotation Shim ControllerSteve Macenski一种「垫片」(shim)控制器,在移交给主控制器进行跟踪之前先旋转到路径航向Differential、Omni、原地旋转模型
Graceful ControllerAlberto Tudela基于位姿跟随控制律生成平滑轨迹的控制器Differential、Omni、Legged
Vector Pursuit ControllerBlack Coffee Robotics基于矢量追踪(vector pursuit)算法的控制器,适用于高速精确的路径跟踪Differential、Ackermann、Legged
插件名称创建者描述驱动方式支持
NavFn PlannerEitan Marder-Eppstein & Kurt Konolige使用 A* 或 Dijkstra 扩展的导航函数,假设为 2D 全向(holonomic)质点Differential、Omnidirectional、Legged
SmacPlannerHybrid(原名 SmacPlanner)Steve MacenskiSE2 Hybrid-A* 实现,使用 Dubins 或 Reeds-Shepp 运动模型,内置平滑器和多分辨率查询。适用于汽车、类汽车和阿克曼车辆,满足运动学约束Ackermann、Differential、Omnidirectional、Legged
SmacPlanner2DSteve Macenski2D A* 实现,使用 4 或 8 连通邻域,内置平滑器和多分辨率查询Differential、Omnidirectional、Legged
SmacPlannerLatticeSteve Macenski状态格(State Lattice)规划器实现,使用预生成的最小控制集,可为任意类型车辆生成运动学可行的路径。包含用于阿克曼、差速、全向和足式机器人的生成脚本Differential、Omnidirectional、Ackermann、Legged、Arbitrary / Custom
ThetaStarPlannerAnshumaan SinghTheta* 的实现,使用 4 或 8 连通邻域,假设机器人为 2D 全向质点Differential、Omnidirectional
插件名称创建者描述
Simple SmootherSteve Macenski适用于运动学不可行(如 2D)规划器的简单路径平滑器
Constrained SmootherMatej Vargovcik & Steve Macenski使用约束问题求解器的路径平滑器,可优化平滑度、与障碍物距离等多种指标,同时保持最小转弯半径
Savitzky-Golay SmootherSteve Macenski使用 Savitzky-Golay 滤波器,通过数字信号处理技术平滑路径、去除噪声
插件名称创建者描述
Clear CostmapEitan Marder-Eppstein在感知错误或机器人卡住时,清除指定代价地图的服务
SpinSteve Macenski可配置角度的旋转行为,用于清除周围自由空间并帮助机器人摆脱局部困境
Back UpBrian Wilcox可配置距离的后退行为,帮助机器人脱困
WaitSteve Macenski可配置时长的等待行为,用于应对临时性障碍物(如人流)或等待更多传感器数据
Drive On HeadingJoshua Wallace可配置行驶距离的按航向行驶行为
Assisted TeleopJoshua WallaceAssistedTeleop 行为,缩放遥操作指令以防止碰撞

航点任务执行器(Waypoint Task Executors)

Section titled “航点任务执行器(Waypoint Task Executors)”
插件名称创建者描述
WaitAtWaypointFetullah Atas在航点到达时执行等待行为的插件
PhotoAtWaypointFetullah Atas在航点到达时拍照并保存到指定目录的插件
InputAtWaypointSteve Macenski在移动到下一个航点之前等待用户输入的插件
插件名称创建者描述
SimpleGoalCheckerDavid Lu!!检查机器人是否在目标点的平移和旋转容差范围内
StoppedGoalCheckerDavid Lu!!在 SimpleGoalChecker 基础上,额外检查速度是否低于阈值
PositionGoalCheckerPrabhav Saxena仅检查平移距离是否在容差范围内,不要求旋转收敛
AxisGoalCheckerGuillaume Doisy & Tony Najjar检查机器人沿路径方向和垂直于路径方向(cross-track)是否均在容差范围内
AdaptiveToleranceGoalCheckerDavid Grbac检查机器人是否在目标点的平移(使用两级容差)和旋转容差范围内
插件名称创建者描述
SimpleProgressCheckerDavid Lu!!检查机器人是否在给定时间内向目标移动了最小距离
PoseProgressCheckerGuillaume Doisy检查机器人是否在给定时间内向目标移动了最小距离或角度
插件名称创建者描述
FeasiblePathHandlerMaurice Alexander Purnawan将全局路径变换到局部代价地图坐标系,裁剪至代价地图边界内,并处理原地旋转和尖点(cusp)裁剪

动作插件(Action Plugins)

动作插件名称创建者描述
Back Up ActionMichael Jeronimo调用后退行为动作
Drive On Heading ActionJoshua Wallace调用按航向行驶行为动作
Assisted Teleop ActionJoshua Wallace调用辅助遥操作行为动作
Clear Entire Costmap ServiceCarl Delsey调用清除整个代价地图的服务
Clear Costmap Except Region ServiceGuillaume Doisy调用清除除指定区域外代价地图的服务
Clear Costmap Around Robot ServiceGuillaume Doisy调用清除机器人周围代价地图的服务
Compute Path to Pose ActionMichael Jeronimo调用 Nav2 规划器服务器
Smooth Path ActionMatej Vargovcik调用 Nav2 平滑器服务器
Follow Path ActionMichael Jeronimo调用 Nav2 控制器服务器
Navigate to Pose ActionMichael Jeronimo供其他 BehaviorTree.CPP 行为树以子树形式调用 Nav2 导航动作的 BT 节点
Reinitialize Global Localization ServiceCarl Delsey将 AMCL 重新初始化到新位姿
Spin ActionCarl Delsey调用旋转行为动作
Wait ActionSteve Macenski调用等待行为动作
Truncate PathFrancisco Martín截短路径
Truncate Path LocalMatej Vargovcik提取机器人周围的一段路径
Planner SelectorPablo Iñigo Blasco基于话题输入选择全局规划器,否则使用默认规划器 id
Controller SelectorPablo Iñigo Blasco基于话题输入选择控制器,否则使用默认控制器 id
Goal Checker SelectorPablo Iñigo Blasco基于话题输入选择目标检查器,否则使用默认目标检查器 id
Smoother SelectorOwen Hooper基于话题输入选择平滑器,否则使用默认平滑器 id
Progress Checker SelectorSteve Macenski基于话题输入选择进度检查器,否则使用默认进度检查器 id
Path Handler SelectorMaurice Alexander Purnawan基于话题输入选择路径处理器,否则使用默认路径处理器 id
Navigate Through PosesSteve Macenski供其他 BehaviorTree.CPP 行为树以子树形式调用 Nav2 NavThroughPoses 动作的 BT 节点
Remove Passed GoalsSteve Macenski移除已通过或在容差范围内的目标位姿,用于在路径重新规划时剔除旧的途经点(viapoints)
Remove In Collision GoalsTony Najjar移除足迹或点代价高于阈值的目标位姿
Compute Path Through PosesSteve Macenski使用指定的规划器插件计算通过一组位姿的路径,而非仅到单个目标位姿的路径
Compute RouteSteve Macenski计算穿过导航图的路线(Route),返回一条密集路径以及一组稀疏的路线节点和边
Compute And Track RouteSteve Macenski在计算路线的同时主动跟踪进度,并触发路线上下文相关的语义操作
Cancel Control ActionPradheep Padmanabhan取消 Nav2 控制器服务器
Cancel BackUp ActionPradheep Padmanabhan取消后退行为动作
Cancel Spin ActionPradheep Padmanabhan取消旋转行为动作
Cancel Wait ActionPradheep Padmanabhan取消等待行为动作
Cancel Route ActionSteve Macenski取消 ComputeAndTrackRoute 动作
Cancel Drive on Heading ActionJoshua Wallace取消按航向行驶行为动作
Cancel Assisted Teleop ActionJoshua Wallace取消辅助遥操作行为动作
Cancel Complete Coverage ActionSteve Macenski取消计算完整覆盖
Compute Complete Coverage Path ActionSteve Macenski调用覆盖规划器服务器
Get Pose From Path ActionMarc Morcos从路径中提取位姿
Dock Robot ActionSteve Macenski调用停靠机器人动作
Undock Robot ActionSteve Macenski调用解除停靠机器人动作
Concatenate Paths ActionSteve Macenski将两条路径拼接在一起
Get Current Pose ActionSteve Macenski获取当前位姿并写入黑板(blackboard)
Append Goal Pose To Goals ActionSteve Macenski将目标位姿追加到目标向量
Extract Route Nodes To Goals ActionSteve Macenski将路线节点转换为目标
Get Next Few Goals ActionSteve Macenski获取目标向量中的接下来 N 个目标
Toggle Collision Monitor ServiceDavid Grbac调用碰撞监控器的启停服务
Follow ObjectAlberto Tudela动态跟随物体
Cancel Follow ObjectAlberto Tudela取消跟随物体动作
Validate PathJoshua Wallace通过确保路径上没有致命(LETHAL)障碍物来检查路径是否有效
Check Stop StatusTony Najjar检查机器人是否已持续停止一段时间
Check Pose OccupancyMaurice Alexander Purnawan检查位姿是否被占用

条件插件(Condition Plugins)

条件插件名称创建者描述
Goal Reached ConditionCarl Delsey检查是否在容差范围内到达目标
Goal Updated ConditionAitor Miguel Blanco检查目标是否被抢占(preempted)
Global Updated Goal ConditionJoshua Wallace检查全局 BT 上下文中目标是否被抢占
Initial Pose received ConditionCarl Delsey检查是否已设置初始位姿
Is Stuck ConditionMichael Jeronimo检查机器人正在前进还是已卡住
Transform Available ConditionSteve Macenski检查 TF 变换是否可用。成功后,后续调用均返回成功
Distance Traveled ConditionSarthak Mittal检查机器人是否已行驶给定距离
Time Expired ConditionSarthak Mittal检查给定时长是否已过
Is Battery Low ConditionSarthak Mittal检查电池百分比是否低于指定值
Path Expiring TimerJoshua Wallace检查定时器是否已过期。若路径更新,则重置定时器
Are Error Codes PresentJoshua Wallace检查指定错误码是否存在
Would A Controller Recovery HelpJoshua Wallace检查控制器恢复是否有助于清除控制器服务器错误码
Would A Planner Recovery HelpJoshua Wallace检查规划器恢复是否有助于清除规划器服务器错误码
Would A Smoother Recovery HelpJoshua Wallace检查平滑器恢复是否有助于清除平滑器服务器错误码
Would A Route Recovery HelpSteve Macenski检查路线恢复是否有助于清除路线服务器错误码
Is Battery Charging ConditionAlberto Tudela检查电池是否正在充电
Are Poses Near ConditionSteve Macenski检查两个位姿是否彼此靠近
Is Goal Nearby ConditionJakub Chudziński根据剩余路径长度检查机器人是否靠近目标
Is Within Path Tracking Bounds ConditionBerkan Tali检查机器人是否在路径跟踪边界内

装饰器插件(Decorator Plugins)

装饰器插件名称创建者描述
Rate ControllerMichael Jeronimo将子节点节流(throttle)到给定频率
Distance ControllerSarthak Mittal根据机器人行驶的距离来 tick 子节点
Speed ControllerSarthak Mittal根据当前机器人速度将子节点节流到一定频率
Goal UpdaterFrancisco Martín更新通过话题订阅接收到的目标
Single TriggerSteve Macenski每次 BT 运行仅触发下方节点/子树一次
PathLongerOnApproachPradheep Padmanabhan接近目标时,若新全局路径明显长于旧全局路径,则触发子节点
GoalUpdatedControllerSophia Koffler若目标已更新,则 tick 子节点

控制插件(Control Plugins)

控制插件名称创建者描述
Pipeline SequenceCarl Delsey序列节点的变体,即使后续子节点正在运行,也会重新 tick 之前的子节点
RecoveryCarl Delsey节点必须包含 2 个子节点。若第一个成功则直接返回成功;若失败则 tick 第二个子节点,若第二个成功则重试第一个,并返回其结果
Round RobinMohammad Haghighipanah依次 tick 第 i 个子节点直至返回结果,然后继续 tick 第 i+1 个
Nonblocking SequenceAlexander Yuen序列节点的变体,即使某个子节点返回 RUNNING 也会 tick 完整个序列。重新 tick 该控制节点时,已成功的子节点会再次被 tick,以防陈旧状态被锁存(latched)
Persistent SequenceEnjoy Robotics序列节点的一种变体,将 current_child_idx 暴露为双向端口
Pause Resume ControllerEnjoy Robotics通过服务调用来控制树的暂停与恢复执行
插件名称创建者描述
DistanceScorerSteve Macenski按边长度评分,可选择按相对速度限制进行缩放
TimeScorerSteve Macenski根据绝对速度限制或历史通行时间估算边的通行时间并评分
PenaltyScorerSteve Macenski使用静态语义惩罚值评分
SemanticScorerSteve Macenski利用边和/或节点上存储的语义数据评分
StartPoseOrientationScorerAlex Yuen根据初始位姿与起始边朝向的关系评分
GoalPoseOrientationScorerAlex Yuen根据目标位姿与目标边朝向的关系评分
DynamicEdgesScorerSteve Macenski根据动态设置的服务代价和/或关闭状态评分
插件名称创建者描述
AdjustSpeedLimitSteve Macenski使用边的语义数据调整机器人速度限制
CollisionMoniterSteve Macenski跟踪路线时检查近期是否会发生碰撞
TimeMarkerSteve Macenski在边的元数据中记录边的通行时间
ReroutingServiceSteve Macenski从外部服务器触发重新规划路线
TriggerEventSteve Macenski基于可配置的服务器名称触发事件

图文件解析器(Graph File Parsers)

Section titled “图文件解析器(Graph File Parsers)”

目前仅支持 geojson 解析。