Kilted 迁移指南
从 ROS 2 Kilted 迁移到 L-Turtle 版本,带来了多项稳定性改进,此处不一一赘述。
新的 Nav2 ROS Common 与 Nav2 Lifecycle 节点
Section titled “新的 Nav2 ROS Common 与 Nav2 Lifecycle 节点”从 Lyrical 版本起,新增了 nav2_ros_common 软件包,包含一组 Nav2 / ROS 2 工具、包装器(wrapper)和覆写(override),用于以标准化、可控的方式在 Nav2 中与 ROS 2 协同工作。
它整合了 nav2_util 中已有的能力(如 LifecycleNode 和 SimpleActionServer),并进一步扩展,在 nav2:: 命名空间中用 Nav2 变体包装所有 ROS 2 接口。
新的 nav2::LifecycleNode 的工厂成员(create_client、create_service、create_publisher、create_subscriber、create_action_server 和 create_action_client)现在返回这些 Nav2 对象。
使用 Nav2 风格的自定义插件、任务服务器(Task Server)或其他组件/应用需要做相应迁移。
此外,该软件包还提供一组在栈中全局使用的 QoS 配置(QoS profile),让开发者对 QoS 设置拥有完全控制权。开发者可在同一处集中更新或测试不同配置,并可全局应用于整个栈。
这项工作的动机是为接口设置全局配置——例如通过运行时参数启用发布者和订阅者的 QoS 覆写,以及启用 Action 和 Service 内省(introspection)。 它还让我们能在整个代码库中添加此前无法实现的额外配置、追踪(tracing)、高级特性和包装器。
所有 Nav2 节点和软件包都应全局使用该软件包中的工具,以保持一致性并避免代码重复。 生命周期节点包含订阅、发布、客户端和服务器的工厂,这些工厂返回本软件包中的 Nav2 对象而非 ROS 2 基类,充当常见样板配置和能力的抽象层。 工厂如下所列:
create_client→nav2::ServiceClientcreate_service→nav2::ServiceServercreate_publisher→nav2::Publishercreate_subscriber→nav2::Subscribercreate_action_server→nav2::SimpleActionServercreate_action_client→nav2::ActionClient
大多数情况下,这些工厂与之前的 rclcpp 版本非常相似。
如果之前已有 nav2_util 版本,API 应基本一致,只是现在应改用 create_* 工厂而非手动构造,以利用抽象后的配置设置和未来的高级特性。
有变化之处,通常只是将 QoS profile 规范移到了参数末尾——它现在是可选的,默认使用 nav2::qos::StandardTopicQoS profile(可靠(reliable)、易失(volatile)、队列深度为 10)。
nav2_util::LifecycleNode现为nav2::LifecycleNode,除工厂和少数内部实现细节外基本一致。- Service Client、Service Server 和 Simple Action Server 也移到了
nav2::命名空间,但不应直接访问它们。请使用nav2::LifecycleNode中的create_*工厂(如create_action_server或create_action_client)。 - 现在有供代码库统一使用、便于日后修改的
nav2::qos配置:nav2::qos::StandardTopicQoS、nav2::qos::LatchedPublisherQoS、nav2::qos::LatchedSubscriberQoS和nav2::qos::SensorDataQoS。应使用这些配置而不是rclcpp的配置。 create_*的 API 与默认版本非常相似,但略有不同:现在可选的 QoS profile 参数被移到了必需参数之后。未指定时使用StandardTopicQoS(可靠、队列大小 10)。只有在需要其他 QoS 类型时才覆写它。避免使用SystemDefaultsQoS。
插件迁移(Plugin Migration)
Section titled “插件迁移(Plugin Migration)”所有插件现在都使用 nav2::LifecycleNode,而不是 rclcpp_lifecycle::LifecycleNode 或 nav2_util::LifecycleNode。
从规划器、控制器到行为树节点,所有插件都必须更新以使用新 API。
同样,对 create_* 工厂的调用现在(在适用处)会指向 Nav2 对象。
上文展示了工厂的映射关系,下文则是从现有代码迁移到新版本的示例。
Service Client 迁移
Section titled “Service Client 迁移”不再需要手动创建该对象,也不应该这样做——手动创建会绕过生命周期节点工厂中设置的 introspection 和其他未来特性。
现在通过节点即可完成创建,无需再传入节点参数,也不用再在模板中指定节点类型。
所有 Nav2 服务器都应使用 nav2::ServiceClient<T>。
// If using rclcpp::Client<T> from previous create_client factor main_client_ = node->create_client<SrvT>(main_srv_name_, rclcpp::SystemDefaultsQoS(), callback_group_); // Type rclcpp:Client<T>
// If using nav2_util::ServiceClient<T> manually main_client_ = std::make_shared<nav2_util::ServiceClient<SrvT>>( main_srv_name_, node, false /* Does not create and spin an internal executor*/); // Type nav2_util::ServiceClient<T>改为:
main_client_ = node->create_client<SrvT>(main_srv_name_, false /* Does not create and spin an internal executor*/); // Type nav2::ServiceClient<T>如果从 rclcpp::Client<T> 工厂迁移,请查看 nav2::ServiceClient<T> 的 API 及其特性,例如 invoke()——它包装了异步调用,并使用给定节点或其他内部执行器(executor)执行回调以获取结果。
也可选择直接迁移:将 async_send_request 调用改为 async_call,其余在应用代码中照常处理 future。
现在通过参数 introspection_mode 支持服务内省。
Service Server 迁移
Section titled “Service Server 迁移”服务现在应使用 nav2::ServiceServer<T>,而不是 rclcpp::Service<T> 或 nav2_util::ServiceServer<T>。
现在通过节点上的 create_service(...) 工厂来创建服务服务器。
回调现在应包含 rmw_request_id_t 头,因此有 3 个占位符而不是 2 个:
// If using previous create_service factory service_ = node->create_service<std_srvs::srv::Trigger>( std::string(node->get_name()) + "/" + getName() + "/reroute", std::bind( &ReroutingService::serviceCb, this, std::placeholders::_1, std::placeholders::_2)); // type rclcpp::Service<T>
// If using nav2_util::ServiceServer<T> manually service_ = std::make_shared<nav2_util::ServiceServer<std_srvs::srv::Trigger, std::shared_ptr<rclcpp_lifecycle::LifecycleNode>>>( std::string(node->get_name()) + "/" + getName() + "/reroute", node, std::bind( &ReroutingService::serviceCb, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); // type nav2_util::ServiceServer<T>改为:
service_ = node->create_service<std_srvs::srv::Trigger>( std::string(node->get_name()) + "/" + getName() + "/reroute", std::bind(&ReroutingService::serviceCb, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); // type nav2::ServiceServer<T>处理逻辑与之前相同,无需其他修改。
现在通过参数 introspection_mode 支持服务内省。
Action Server 迁移
Section titled “Action Server 迁移”现在可通过节点上的工厂创建 action server,节点不再作为参数传入。
除此之外没有变化。
与之前的 action server 实现类似,但配置了 action 内省以及基础 rclcpp_action::Server<T> 中没有的其他特性。
compute_and_track_route_server_ = std::make_shared<ComputeAndTrackRouteServer>( node, "compute_and_track_route", std::bind(&RouteServer::computeAndTrackRoute, this), nullptr, std::chrono::milliseconds(500), true); // Type nav2_util::SimpleActionServer<T>改为:
compute_and_track_route_server_ = create_action_server<ComputeAndTrackRoute>( "compute_and_track_route", std::bind(&RouteServer::computeAndTrackRoute, this), nullptr, std::chrono::milliseconds(500), true); // Type nav2::SimpleActionServer<T>由于处理方式与之前相同,无需其他修改。
现在通过参数 introspection_mode 支持 action 请求、反馈和结果内省。
Action Client 迁移
Section titled “Action Client 迁移”现在可通过节点的 create_action_client 创建 action client,无需提供所有节点接口。
与之前的 action client 实现类似,但配置了 action 内省以及基础 rclcpp_action::Client<T> 中没有的其他特性。
nav_to_pose_client_ = rclcpp_action::create_client<ClientT>( get_node_base_interface(), get_node_graph_interface(), get_node_logging_interface(), get_node_waitables_interface(), "navigate_to_pose", callback_group_); // Type rclcpp_action::Client<T>改为:
nav_to_pose_client_ = create_action_client<ClientT>( "navigate_to_pose", callback_group_); // Type nav2::ActionClient<T>由于处理方式与之前相同,无需其他修改。
现在通过参数 introspection_mode 支持 action 请求、反馈和结果内省。
发布者/订阅者迁移
Section titled “发布者/订阅者迁移”迁移时,Subscription 的参数顺序需要调整,因为 QoS profile 现在是可选的。新顺序为 (topic, callback, QoS),QoS 默认为 StandardTopicQoS,目前与 rclcpp::QoS 相同。
明确指定 QoS profile 的发布者无需更改,但如果使用带 depth 参数的构造函数,现在必须明确指定策略。
两者现在分别是 nav2::Publisher 和 nav2::Subscription 对象,目前只是 rclcpp 和 rclcpp_lifecycle 版本的 typedef。
未来这里会添加更多特性(例如订阅的生命周期支持),因此强烈建议在本次迁移中也将 rclcpp:: 替换为 nav2::,以便届时轻松获得这些更新。
plan_publisher_ = create_publisher<nav_msgs::msg::Path>("plan", 1); plan_publisher_ = create_publisher<nav_msgs::msg::Path>("plan", rclcpp::QoS(), callback_group);
data_sub_ = node->create_subscription<sensor_msgs::msg::Range>( source_topic, range_qos, std::bind(&Range::dataCallback, this, std::placeholders::_1));改为:
plan_publisher_ = create_publisher<nav_msgs::msg::Path>("plan"); // No QoS is required if using the StandardTopicQoS, else it can be provided
data_sub_ = node->create_subscription<sensor_msgs::msg::Range>( source_topic, std::bind(&Range::dataCallback, this, std::placeholders::_1)); // QoS can be omitted if using StandardTopicQoS, else it can be provided last由于处理方式与之前相同,无需其他修改。
现在支持未来的生命周期订阅扩展或其他便捷包装 API。
此外,还通过参数 allow_parameter_qos_overrides 支持 QoS 覆写。
移除参数 action_server_result_timeout
Section titled “移除参数 action_server_result_timeout”在 rcl 和 rclcpp 内部解决早期目标移除问题后,所有 action server 中的 action_server_result_timeout 参数已被移除。
不再需要设置此参数。
停靠插件外部检测旋转
Section titled “停靠插件外部检测旋转”Simple(Non)ChargingDock 停靠插件的外部检测旋转顺序已改为更自然的 Rx -> Ry -> Rz(原为:Rz -> Rx -> Ry)。从实现角度看,setEuler() 调用已被 setRPY() 取代。仅在以下情况保留旧行为:
external_detection_rotation_yaw等于 0.0,或external_detection_rotation_pitch和external_detection_rotation_roll均为 0.0
与上述情况不同的非默认外部检测旋转需作相应调整。
停靠插件探测器控制
Section titled “停靠插件探测器控制”PR #5218 为 opennav_docking 增加了按需探测器控制。
ChargingDock 和 NonChargingDock 现在提供纯虚函数 startDetectionProcess / stopDetectionProcess,停靠服务器在感知循环前后调用它们。
- 自定义停靠插件必须实现新的钩子(如不需要额外操作则返回
true)。 Simple(Non)ChargingDock新增detector_service_name、detector_service_timeout和subscribe_toggle参数,仅在需要检测时触发探测器服务。- 请参阅配置停靠服务器(configuring docking server)获取更新后的参数参考和 YAML 示例。
为 route_server 添加角点平滑功能
Section titled “为 route_server 添加角点平滑功能”在 PR #5226 中,新增了用平滑圆弧拼接 route_server 中两条连续边(edge)的能力。举例来说:两条连续边构成一个角,以半径 1 的圆弧进行平滑。红线是路线图的边,绿线是可供局部规划器使用的合成路径。

新参数包括 smooth_corners(启用或禁用角点平滑)和 smoothing_radius(拟合到角点的圆弧半径)。圆弧起点和终点的切线与构成角的两条边的切线匹配。如果两条边基本是直线,则不添加角圆弧,而是进行常规线性插值。此外,如果角圆弧所需的起点和终点超出边长,也不会添加角圆弧。
新增 NonblockingSequence 控制节点
Section titled “新增 NonblockingSequence 控制节点”在 PR #5325 中,新增了一个 Nav2 专用的行为树控制节点。新的行为树控制节点 NonblockingSequence 允许序列中的每个子节点都被 tick,即使其中一个子节点返回了 RUNNING。这样可以防止长时间运行的子节点阻塞整个序列。
有关 NonblockingSequence 的更多细节,请参阅 Nav2 专用节点讲解(Nav2 specific node walkthrough)和 NonblockingSequence 配置指南(NonblockingSequence configuration guide)。
MPPI 最优轨迹校验器插件
Section titled “MPPI 最优轨迹校验器插件”MPPI 控制器现在有一个插件 OptimalTrajectoryValidator,可用于校验即将执行的输出轨迹。
它可以检查碰撞、与障碍物的间距、与路径的偏离程度、是否取得进展等。
默认情况下,它使用 DefaultOptimalTrajectoryValidator 来检查碰撞。
注意,运动学和动力学约束无需检查,因为优化器(Optimizer)会自动确保这些约束得到满足。
新增 PersistentSequence 和 PauseResumeController 控制节点
Section titled “新增 PersistentSequence 和 PauseResumeController 控制节点”在 PR #5247 中新增了两个 Nav2 专用的行为树控制节点。
PauseResumeController(PauseResumeController configuration guide)增加了暂停和恢复行为树执行的 service。与此配合,PersistentSequence(PersistentSequence configuration guide)控制节点可通过双向端口将子节点索引暴露给行为树,使序列在恢复执行时从暂停处继续。
可选使用 point_cloud_transport
Section titled “可选使用 point_cloud_transport”在 PR #5264 中,增加了使用 point_cloud_transport 的选项。 这样可以使用压缩库(如 Draco、Zstd、Zlib 等)来传输 PointCloud,减少网络流量,并在低带宽环境中绕过 DDS 的限制。
默认值:
"raw"— 使用sensor_msgs/msg/PointCloud2,无压缩。
如果你的传感器已经发布压缩流(例如 Stereolabs ZED X 相机),可在接收 pointcloud 传感器流(即障碍物层、voxel 层)的代价地图图层以及碰撞监控器中启用此选项。
代价地图图层配置示例:
<costmap_layer>: observation_sources: pointcloud pointcloud: data_type: "PointCloud2" topic: /intel_realsense_r200_depth/points # Change this to your topic transport_type: "raw" # Change this to your compressed format (zlib, draco, zstd)碰撞监控器配置类似:
collision_monitor: ros__parameters: observation_sources: ["pointcloud"] pointcloud: type: "pointcloud" topic: /intel_realsense_r200_depth/points # Change this to your topic transport_type: "raw" # Change this to your compressed format (zlib, draco, zstd)关于 transport_type 的更多信息,请参阅配置碰撞监控器节点(configuring collision monitor node)。
以下是不同传输类型在默认参数下测得的带宽值:
| 传输类型 | 带宽(KB) |
|---|---|
| raw | 593.63 |
| draco | 443.28 |
| zstd | 64.33 |
| zlib | 121.95 |
私有 BT 导航器的 Blackboard ID 参数
Section titled “私有 BT 导航器的 Blackboard ID 参数”BT 导航器中用于指定行为树黑板(blackboard)变量名称的参数 xx_blackboard_id 已移入各自的导航器,需要在特定导航器的命名空间下指定。
这些参数包括:
-
NavigateToPose:
<navigate_to_pose_name>.goal_blackboard_id<navigate_to_pose_name>.path_blackboard_id
-
NavigateThroughPoses:
<navigate_through_poses_name>.goals_blackboard_id<navigate_through_poses_name>.path_blackboard_id<navigate_through_poses_name>.waypoint_statuses_blackboard_id
-
CoverageNavigator:
<coverage_navigator_name>.path_blackboard_id<coverage_navigator_name>.field_file_blackboard_id<coverage_navigator_name>.field_polygon_blackboard_id<coverage_navigator_name>.polygon_frame_blackboard_id
示例:
bt_navigator: ros__parameters: other parameters: ....
navigate_to_pose: plugin: "nav2_bt_navigator::NavigateToPoseNavigator" enable_groot_monitoring: false groot_server_port: 1667 goal_blackboard_id: "goal" path_blackboard_id: "path"
navigate_through_poses: plugin: "nav2_bt_navigator::NavigateThroughPosesNavigator" enable_groot_monitoring: false groot_server_port: 1669 goals_blackboard_id: "goals" path_blackboard_id: "path" waypoint_statuses_blackboard_id: "waypoint_statuses"
navigate_complete_coverage: plugin: "opennav_coverage_navigator/CoverageNavigator" path_blackboard_id: "path" field_file_blackboard_id: "field_filepath" field_polygon_blackboard_id: "field_polygon" polygon_frame_blackboard_id: "polygon_frame_id"另请参阅配置 BT 导航器(configuring bt navigator)。
支持行为树子树(BehaviorTree SubTrees)
Section titled “支持行为树子树(BehaviorTree SubTrees)”BehaviorTree 引擎现在支持从多个文件加载子树(SubTree)。
这样可以将行为树拆分为更小的组件,并在不同树之间复用。
.xml 文件应放在通过 bt_search_directories 参数设置的目录中。
接口还支持以文件路径或 ID 请求所需的行为树。
要使用 ID 或多子树特性,每个行为树都需要有唯一 ID——将 MainTree 替换为唯一 ID 即可。
Savitzky-Golay 平滑器支持自定义窗口大小和多项式阶数
Section titled “Savitzky-Golay 平滑器支持自定义窗口大小和多项式阶数”在 PR #5489 中,新增了自定义窗口大小和多项式阶数的选项。 此前实现使用固定的窗口大小 7 和多项式阶数 3。
默认值:
- window_size: 7
- poly_order: 3
栅格地图支持矢量对象(Vector Objects)
Section titled “栅格地图支持矢量对象(Vector Objects)”PR #5479 在 nav2_map_server 软件包中新增了 Vector Object 服务器。
它从输入参数读取矢量对象(多边形和多边形链为 PolygonObject.msg;圆为 CircleObject.msg),通过 service 调用(AddShapes.srv/GetShapes.srv/RemoveShapes.srv)处理,最终将它们叠加到输出的栅格 OccupancyGrid 地图上。
该地图通常与代价地图配合使用,充当 Costmap Filter 的输入掩码。
可覆盖以下用例:在地图上添加虚拟障碍物、动态物体模拟/高亮、隐藏某些区域或机器人伸出部分、传感器噪声去除、在地图上涂黑区域、基于矢量添加禁入区或最大速度限制区域、合成测试等。
要运行 Vector Object 服务器,提供了新的 vector_object_server.launch.py 启动文件。
矢量对象(Vector Objects) 教程说明了如何启动 Vector Object 服务器,以及如何使用添加到栅格代价地图中的矢量对象进行导航。
有关 Vector Object 服务器的参数设置,请参阅配置矢量对象服务器(configuring vector object server)配置指南。
碰撞监控器切换 service 与 BT 插件
Section titled “碰撞监控器切换 service 与 BT 插件”PR #5493 和 PR #5532 为碰撞监控器引入了新的切换(toggle)service。 该 service 可启用或禁用所有碰撞监控器多边形,同时保持碰撞监控器内的传感器检查处于激活状态。
该 service 使用新接口 Toggle.srv 定义:
bool enable --- bool success string message该接口未来可根据需要扩展。
此外还创建了调用该 service 的对应行为树(BT)插件。
该插件基于 BtServiceNode,提供以下输入端口:
service_name:切换 service 的名称server_timeout:service 调用超时enable:启用或禁用碰撞监控器的布尔标志
在行为树 XML 文件中的用法示例:
<ToggleCollisionMonitor enable="false" service_name="collision_monitor/toggle"/>跟随服务器(Following Server)
Section titled “跟随服务器(Following Server)”PR #5565 在 opennav_following 软件包中新增了跟随服务器(Following Server)。
跟随服务器用于跟随动态物体或特定参考坐标系。
该服务器允许机器人通过基于话题的检测技术或坐标系跟踪,跟随已检测到的物体或特定坐标系,并保持设定距离。
有关跟随服务器的参数设置,请参阅配置跟随服务器(configuring following server)配置指南。
跟随服务器的教程最近已更新。有关最新说明和示例,请参阅动态点跟随。
MPPI 可选开环模式
Section titled “MPPI 可选开环模式”在 PR #5617 中,为 MPPI 增加了开环选项。 新增选项:使用最后一条命令速度进行初始状态估计,而不是使用里程计。 这在低加速度或轮式里程计延迟(电机响应差)导致 MPPI 初始状态估计出现问题的情况下很有用。
默认值:
- open_loop: false
规划器服务器的部分路径
Section titled “规划器服务器的部分路径”PR #5687 为规划器服务器在规划穿越多个姿态的路径时,增加了输出部分路径的支持。这是对现有”全有或全无”方式(要么返回穿越所有姿态的完整路径,要么因任何姿态被障碍物阻挡而完全不返回路径)的替代方案。
部分路径输出默认处于禁用状态,可通过新的 allow_partial_planning 动态参数开启。
使用该功能时,compute_path_through_poses action server 的结果将在 last_reached_index 字段中指示目标列表中最后到达的姿态。
Rotation Shim Controller 中主控制器参数增加命名空间
Section titled “Rotation Shim Controller 中主控制器参数增加命名空间”在 PR #5654 中,为 Rotation Shim Controller 内的主控制器参数引入了命名空间。 此更改通过将主控制器的参数分组到各自的命名空间下,确保动态参数更新被正确处理。
之前:
plugin: "nav2_rotation_shim_controller::RotationShimController" primary_controller: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController" desired_linear_vel: 1.0 lookahead_dist: 0.6之后:
plugin: "nav2_rotation_shim_controller::RotationShimController" primary_controller: plugin: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController" desired_linear_vel: 1.0 lookahead_dist: 0.6Collision Monitor 和 CollisionDetector 新增 CostmapSource 观察类型
Section titled “Collision Monitor 和 CollisionDetector 新增 CostmapSource 观察类型”在 PR #5642 中,为 Collision Monitor 和 Collision Detector 新增了 CostmapSource 观察类型,允许直接订阅 nav2_msgs/msg/Costmap 消息作为观察源。使用此源时应谨慎。
使用隔离测试构建的选项
Section titled “使用隔离测试构建的选项”在 PR #5516 中,新增了使用隔离测试构建的选项。
这样 rmw_zenoh_cpp 的用户无需在单独的终端中启动 Zenoh 路由器即可运行测试。
可通过在构建时传入 --cmake-args -DUSE_ISOLATED_TESTS=ON 来启用此功能。
RoundRobin 的 wrap_around 参数
Section titled “RoundRobin 的 wrap_around 参数”PR #5308 为 RoundRobin 行为树控制节点新增了 wrap_around 参数。
该参数控制 RoundRobin 节点在最后一个子节点失败后是否绕回第一个子节点:
wrap_around=false(默认):节点返回 FAILURE,而不绕回第一个子节点wrap_around=true:节点绕回第一个子节点并继续轮询(round-robin)行为
破坏性更改:默认行为已更改。此前,RoundRobin 总是绕回。现在默认 wrap_around=false,这意味着现有行为树除非显式配置,否则将使用新的不绕回行为。
此更改解决了 RoundRobin 索引在恢复序列中与 RecoveryNode 重试计数器可能错位的问题,确保每个恢复行为恰好执行一次。
<!-- New default behavior (no wrap-around) --> <RoundRobin wrap_around="false"> <Action_A/> <Action_B/> <Action_C/> </RoundRobin>
<!-- Previous behavior (wrap-around) --> <RoundRobin wrap_around="true"> <Action_A/> <Action_B/> <Action_C/> </RoundRobin>有关 RoundRobin 的更多细节,请参阅 RoundRobin 配置指南(RoundRobin configuration guide)。
代价地图转换的可配置内切障碍物代价
Section titled “代价地图转换的可配置内切障碍物代价”在 PR #5781 中,新增了参数 inscribed_obstacle_cost_value,以修复以下问题:Costmap2DPublisher 将 INSCRIBED_INFLATED_OBSTACLE (253) 映射到 OccupancyGrid 中的值 99,但 StaticLayer 错误地将其转换回 251 而非 253。
默认值:
- inscribed_obstacle_cost_value: 99
更新的 Nav2 RViz 面板
Section titled “更新的 Nav2 RViz 面板”在 PR #5774 中,重新设计了 Nav2 面板(nav2_rviz_plugins),提供对导航请求的全面控制并统一目标管理工具。
主要改进:
- 动态行为树(BT)选择:新增选择器,可指定自定义行为树 XML 文件。这样可在运行时修改导航逻辑(例如特定的恢复行为),适用于
NavigateToPose和NavigateThroughPoses请求。 - 手动坐标输入:支持通过数字字段精确输入坐标(X、Y、Theta)和 frame_id,作为可视化工具的补充。
UI 工作流现在组织为两种主要导航模式:
-
单目标导航(
NavigateToPose)专为单个目标设计。目标可使用标准的 “Nav2 Goal” 工具(在地图上点击)定义,也可直接在面板中手动输入精确坐标。 -
多目标导航(
NavigateThroughPoses、Waypoint Following)专为执行姿态序列而设计。此模式使用姿态累积模式,在执行前构建并管理目标列表:- 列表构建:姿态可通过混合方式添加:使用 “Nav2 Goal” 工具、手动输入坐标或加载 YAML 文件。
- 编辑:列表完全可交互;用户可修改特定姿态参数或从序列中移除单个目标。
- 执行:列表定义好后,可通过
NavigateThroughPoses或Waypoint Followingaction 执行导航。

上面的 GIF 展示了如何混合使用可视化目标设置和文件加载,为 NavigateThroughPoses 和 Waypoint Following action 配置多目标导航。
Regulated Pure Pursuit 控制器新增动态窗口纯跟踪选项
Section titled “Regulated Pure Pursuit 控制器新增动态窗口纯跟踪选项”在 PR #5783 中,增加了在 Regulated Pure Pursuit 控制器中启用动态窗口纯跟踪(Dynamic Window Pure Pursuit,DWPP)算法的选项。启用后,计算命令速度时会显式考虑速度和加速度约束。请参阅配置指南了解与该功能相关的新参数。
- Fumiya Ohnishi and Masaki Takahashi, DWPP: Dynamic Window Pure Pursuit Considering Velocity and Acceleration Constraints。arXiv:2601.15006,2026。

以下参数为此功能进行了更新。
max_linear_vel(已重命名):
| 类型 | 默认值 |
|---|---|
| double | 0.5 |
描述:要使用的最大线速度(m/s)。之前名为 desired_linear_vel
注意:速度平滑器(velocity smoother)在发布
cmd_vel之前,会根据其自身的速度和加速度限制裁剪该控制器产生的速度命令。 因此,速度平滑器的参数max_velocity、min_velocity、max_accel和max_decel必须设置为与该控制器相应的速度、加速度和减速度参数一致或更大。
Bond 心跳周期默认值更改
Section titled “Bond 心跳周期默认值更改”在 L-turtle 中,所有 Nav2 生命周期节点(包括生命周期管理器)的 bond_heartbeat_period 参数默认值从 0.1 增加到 0.25 秒。此更改旨在减少计算开销,在节点众多的系统中节省 CPU 资源。
迁移说明:如果在配置中显式设置了 bond_heartbeat_period 为 0.1,可能需要移除该设置以使用新的默认值;如需显式指定,也可将其设置为 0.25。此值现在也应在生命周期管理器节点中设置。
下表显示了将 bond 心跳周期从 0.1 秒更改为 0.25 秒的性能影响:
| Bond 周期(s) | 组合 CPU | 单进程 CPU |
|---|---|---|
| 0.1 | 140% | 13% |
| 0.2 | 110% | 10% |
| 0.25 | 100% | 9% |
| 0.5 | 85% | 8% |
| 1.0 | 80% | 8% |
注:此表应使用 issue #5784 评论中的数据填充。组合 CPU 是所有 Nav2 进程的总和。
在控制器服务器中集中化路径处理逻辑
Section titled “在控制器服务器中集中化路径处理逻辑”PR #5446 将路径处理逻辑集中到控制器服务器中。此前,每个控制器插件都实现自己的该逻辑版本。
通过此更改,用户现在可以在控制器服务器中配置路径处理器(path handler):
PathHandler: plugin: "nav2_controller::FeasiblePathHandler" prune_distance: 2.0 enforce_path_inversion: True enforce_path_rotation: False inversion_xy_tolerance: 0.2 inversion_yaw_tolerance: 0.4 minimum_rotation_angle: 0.785 reject_unit_path: False更多细节请参阅控制器服务器文档中的 Path Handler 部分。
此更新解决了 Navigate Through Poses 在经过中间目标姿态附近时可能提前终止的问题。作为此修复的一部分,我们还引入了以下 API 更改。
GoalChecker
Section titled “GoalChecker”之前:
virtual bool isGoalReached( const geometry_msgs::msg::Pose & query_pose, const geometry_msgs::msg::Pose & goal_pose, const geometry_msgs::msg::Twist & velocity) = 0;现在:
virtual bool isGoalReached( const geometry_msgs::msg::Pose & query_pose, const geometry_msgs::msg::Pose & goal_pose, const geometry_msgs::msg::Twist & velocity, const nav_msgs::msg::Path & transformed_global_plan) = 0;新增了一个参数:来自路径处理器的转换并裁剪后的全局路径。
控制器插件(Controller Plugins)
Section titled “控制器插件(Controller Plugins)”之前:
virtual void setPlan(const nav_msgs::msg::Path & path) = 0;现在:
virtual void newPathReceived(const nav_msgs::msg::Path & raw_global_path) = 0;该回调现在应只执行轻量任务(例如重置内部状态)。控制器将在 computeVelocityCommands() 期间获得处理后的路径。
之前:
virtual geometry_msgs::msg::TwistStamped computeVelocityCommands( const geometry_msgs::msg::PoseStamped & pose, const geometry_msgs::msg::Twist & velocity, nav2_core::GoalChecker * goal_checker) = 0;现在:
virtual geometry_msgs::msg::TwistStamped computeVelocityCommands( const geometry_msgs::msg::PoseStamped & pose, const geometry_msgs::msg::Twist & velocity, nav2_core::GoalChecker * goal_checker, const nav_msgs::msg::Path & transformed_global_plan, const geometry_msgs::msg::PoseStamped & global_goal) = 0;提供了两个新参数:
- 来自路径处理器的转换并裁剪后的全局路径。
- 全局路径的最后一个姿态。
此外,作为集中化控制器服务器中路径处理逻辑的一部分,若干参数也从各个控制器插件的配置中被添加/移除。
移除的参数
prune_planshorten_transformed_planprune_distanceforward_prune_distancetransform_tolerancepublish_global_planpublish_transformed_plan
新增的参数
path_length_tolerance
移除的参数
transform_tolerancemax_robot_pose_search_dist
Graceful
Section titled “Graceful”移除的参数
transform_tolerancemax_robot_pose_search_dist
移除的参数
transform_toleranceprune_distancemax_robot_pose_search_distenforce_path_inversioninversion_xy_toleranceinversion_yaw_tolerance
目标检查与导航的对称偏航容差
Section titled “目标检查与导航的对称偏航容差”PR #5833 为目标检查与导航引入了对称偏航容差(symmetric yaw tolerance)特性,使对称机器人无需进行不必要的 180° 旋转即可到达目标。
Nav2 可选启用进程内通信
Section titled “Nav2 可选启用进程内通信”在 PR 5804 中,增加了在 Nav2 中启用进程内通信(Intra-process Communication)的选项。可以在启动 Nav2 节点时传入 use_intra_process_comms 参数为 true 来启用。
它当前默认处于禁用状态。请参阅性能与 ROS 2以及 Nav2 栈中的 TB3/TB4 示例作为参考。
新的 AxisGoalChecker 插件
Section titled “新的 AxisGoalChecker 插件”新增了一个目标检查器插件 AxisGoalChecker,提供路径方向感知的目标检查。与基于距离的目标检查器不同,AxisGoalChecker 将机器人位置投影到由路径最后一段定义的路径方向上,允许沿路径方向(along_path_tolerance)和垂直于路径方向(cross_track_tolerance)设置独立容差。
关键参数:
along_path_tolerance:沿路径方向的容差(默认:0.25m)cross_track_tolerance:垂直于路径的容差(默认:0.25m)path_length_tolerance:考虑目标检查的最大剩余路径长度(默认:1.0m)is_overshoot_valid:为 true 时,允许机器人沿路径超出目标任意距离,同时仍处于容差内(默认:false)
该目标检查器特别适用于需要沿特定轴精确对齐的应用,例如停靠操作或横向精度不同于前后精度的仓库导航。
完整的配置细节请参阅配置 AxisGoalChecker 插件(configuring nav2 controller axis goal checker plugin)。
bt_navigator 新增 default_cancel_timeout 参数
Section titled “bt_navigator 新增 default_cancel_timeout 参数”在 PR 5895 中,引入了新的 default_cancel_timeout 参数,以解决 action 取消期间的超时问题,例如 Failed to get result for follow_path in node halt!。
默认值为 50 毫秒,应根据规划时间和整体系统性能进行调整。
支持在 SMAC 规划器之间切换
Section titled “支持在 SMAC 规划器之间切换”在 PR 5840 之前,由于 SMAC 规划器实现中的静态变量在创建多个实例时导致冲突,运行时在 SMAC 规划器之间切换不受支持。该 PR 通过重构 SMAC 规划器代码、消除静态变量的使用来解决此问题,使不同 SMAC 规划器的多个实例可以无冲突地共存。
SmacPlannerLattice 支持 OMNI 解析扩展
Section titled “SmacPlannerLattice 支持 OMNI 解析扩展”PR #5965 为 SmacPlannerLattice 增加了全向(OMNI)解析扩展支持。
当 lattice 原语文件在其元数据中指定 motion_model: "omni" 时,规划器现在会自动:
- 使用
SE2StateSpace(直线,带线性航向插值)而不是 Dubins/Reeds-Shepp 进行解析扩展和距离启发式 - 在解析路径扩展中跳过转弯半径细化(SE2 路径与半径无关)
- 在完整约束(holonomic)模式下配置路径平滑器
- 禁用
allow_reverse_expansion并给出警告(对全向机器人无意义)
无需修改参数——OMNI 运动模型从 lattice 文件元数据中自动检测。
之前:


之后:


bt_navigator 新增 bt_log_idle_transitions 参数
Section titled “bt_navigator 新增 bt_log_idle_transitions 参数”在 PR 5963 中,BT 导航器新增了 bt_log_idle_transitions 参数。设置为 true(默认)时,行为树中的空闲(无状态变化)转换会发布到 /behavior_tree_log 话题和控制台输出。设置为 false 时,只记录状态变化,减少话题和控制台噪声。这对于调试行为树执行很有用,而不会被重复的空闲 tick 消息淹没。
新的 IsWithinPathTrackingBounds 节点
Section titled “新的 IsWithinPathTrackingBounds 节点”在 PR 5983 中,新增了行为树节点 IsWithinPathTrackingBounds,用于检查机器人是否在路径的指定边界内以进行跟踪。请参阅这个 demo 了解如何在行为树中使用此节点的示例。
RPP:min_distance_to_obstacle 修复与新的 allow_obstacle_checking_beyond_goal 参数
Section titled “RPP:min_distance_to_obstacle 修复与新的 allow_obstacle_checking_beyond_goal 参数”PR #5677 解决了启用 use_velocity_scaled_lookahead_dist 时 min_distance_to_obstacle 未被正确强制执行的问题。此前,碰撞检查限制在 carrot 距离内,低速时该距离可能小于 min_distance_to_obstacle。例如,min_lookahead_dist: 0.3、min_distance_to_obstacle: 0.9、max_lookahead_dist: 1.5 时,如果机器人未加速到 lookahead 达到 0.9m,障碍物检查只能覆盖到 carrot 位置,而不是配置的 0.9m。碰撞检查器现在正确地将模拟距离扩展到 min_distance_to_obstacle(以 max_lookahead_dist 为上限),无论当前 carrot 距离如何。
此外,参数处理器增加了警告,以提醒用户注意 min_distance_to_obstacle 无法完全强制执行的配置:
- 使用
use_velocity_scaled_lookahead_dist时,如果min_distance_to_obstacle超过max_lookahead_dist,会发出警告。 - 使用恒定
lookahead_dist时,如果min_distance_to_obstacle超过lookahead_dist,会发出警告。
还新增了参数 allow_obstacle_checking_beyond_goal(默认:false)。默认情况下,沿投影轨迹的障碍物检查在目标位置(路径末端)停止。启用后,碰撞检查会越过目标继续,最多达 min_distance_to_obstacle,无论剩余路径长度如何。此参数要求启用 use_velocity_scaled_lookahead_dist 且 min_distance_to_obstacle > 0.0。
OpenMP 驱动的膨胀层重构
Section titled “OpenMP 驱动的膨胀层重构”PR #5933 重构了 Inflation 层,利用 OpenMP 进行并行处理,在大地图上显著提高了性能。
新实现用 Felzenszwalb-Huttenlocher 距离变换算法取代了之前基于队列的单元格迭代。 编译时不可用 OpenMP 时,该层回退到单线程运行。
将 isStopped、isPathValid 和 isPoseOccupied 从条件节点移至动作节点
Section titled “将 isStopped、isPathValid 和 isPoseOccupied 从条件节点移至动作节点”在 PR 5991 中,以下节点从条件节点移至动作节点并重命名:
IsStopped现在是CheckStopStatusIsPathValid现在是ValidatePathIsPoseOccupied现在是CheckPoseOccupancy
此更改是因为这些行为树节点可能返回 RUNNING 或需要更多时间完成,不适合期望以 100 Hz tick 的行为树。
Collision Monitor 防抖参数
Section titled “Collision Monitor 防抖参数”PR #6006 为 Collision Monitor 和 Collision Detector 增加了多边形触发行为的时间防抖控制:
<polygon_name>.trigger_consecutive_points<polygon_name>.release_consecutive_points
1/1 的值保留单周期触发/释放行为。
实际上,大于 1 的值可以减少传感器噪声闪烁,同时保持响应性。
请参阅:
- 配置碰撞监控器节点(configuring collision monitor node)
- 配置碰撞检测器节点(configuring collision detector node)
MPPI 逐 critic 轨迹代价可视化
Section titled “MPPI 逐 critic 轨迹代价可视化”PR #6036 增强了 MPPI 轨迹可视化,支持逐 critic 代价着色。
启用 visualize 后,候选轨迹现在以代价着色线渲染,使用绿色到黄色到红色的渐变,碰撞轨迹显示为洋红色。
新的 critic_index_to_visualize 参数(默认 0)选择显示哪个 critic 的代价:0 显示所有 critic 的总代价,1..N 按索引选择单个 critic。
publish_critics_stats 参数已移除;启用 visualize 时,critic 统计信息(~/critics_stats 话题)现在自动发布。
修正 Constrained Smoother 代价函数公式
Section titled “修正 Constrained Smoother 代价函数公式”PR #6000 更改了 nav2_constrained_smoother 中的代价函数公式。因此,constrained smoother 的权重可能需要调整。
此前,nav2_constrained_smoother 使用的代价公式为 cost = w_1^2 * cost_1^4 + w_2^2 * cost_2^4 + ...,因为没有考虑 Ceres Solver 内部对残差的平方处理。这导致优化器经常无法收敛。
现在考虑了 Ceres 的内部平方,代价公式修正为 cost = w_1 * cost_1^2 + w_2 * cost_2^2 + ...。这使得 constrained smoother 在测试中大约快 10 倍,并且能够收敛到解、提高路径质量。改进的详细分析见:Issue #5072。
不幸的是,所有用户都需要重新调整权重值,但会获得更快、更可靠的结果!
ValidatePath / IsPathValid 参数更改
Section titled “ValidatePath / IsPathValid 参数更改”PR #6027 将 ValidatePath BT 节点和 IsPathValid service 定义中的 check_full_path 参数重命名为 stop_at_first_collision。布尔语义被反转:check_full_path=false(旧默认值)等价于 stop_at_first_collision=true(新默认值)。
此外,BT 节点和 service 都新增了 max_lookahead_distance 参数(默认 -1.0)。设置为正值时,只验证机器人前方该距离内的路径部分,在不需要完整路径验证时可提高效率。
Nav2 回环仿真器转换为 C++
Section titled “Nav2 回环仿真器转换为 C++”PR #6062 将 nav2_loopback_sim 从 Python 转换为 C++,以提高性能并与 Nav2 栈的其余部分保持一致。这使得 CPU 消耗大约降低 2 倍。
主要更改:
clock_publisher不再是一个独立节点。它现在嵌入在loopback_simulator节点内。以前同时启动两个节点的启动文件应更新为只启动loopback_simulator节点。- 新的
speed_factor参数(默认1.0)控制模拟时钟速度(例如2.0表示 2 倍)。该参数支持动态重配置。 - 新增参数
publish_scan、odom_publish_dur和scan_noise_std。
完整的参数文档请参阅配置回环仿真器(configuring loopback sim)。
全局规划器插件原生支持途经点
Section titled “全局规划器插件原生支持途经点”PR #5995 更新了 BaseGlobalPlanner 的 createPath API,增加一个 std::vector<geometry_msgs::msg::PoseStamped> 向量参数,用于接收中间点列表并将其传递给规划器插件实现。
所有继承自 BaseGlobalPlanner 的自定义规划器插件都必须相应更新 createPath 的函数签名。此更改不改变 ComputePathThroughPoses 将连续线段首尾相连的行为,但升级了 ComputePathToPose action。
MPPI 运动模型使用基于插件的配置
Section titled “MPPI 运动模型使用基于插件的配置”PR #6076 增加了 MPPI 运动模型基于插件的配置支持。
运动模型现在必须通过指定要使用的插件来设置:
MPPIController: plugin: "nav2_mppi_controller::MPPIController" motion_model: "diff_drive" diff_drive: plugin: "mppi::DiffDriveMotionModel"支持的运动模型插件有:
mppi::DiffDriveMotionModel:取代motion_model: DiffDrivemppi::OmniMotionModel:取代motion_model: Omnimppi::AckermannMotionModel:取代motion_model: Ackermann
虽然 motion_model 参数的默认值是 “diff_drive”,但如上所示,仍然需要为其指定插件。
自适应容差目标检查器
Section titled “自适应容差目标检查器”PR #6052 新增了一个自适应容差目标检查器。
自适应容差目标检查器使用两个基础目标容差:精细容差和粗略容差。精细容差用于机器人靠近目标时立即触发目标到达(功能上与简单目标检查器相同),而粗略容差用于机器人离目标较远但未朝目标做出有意义的进展(或不预期有进展)时触发目标到达。
当满足以下任一条件时,认为目标已到达:
- 机器人在精细目标容差内
- 机器人在粗略目标容差内,且其线速度和角速度在设定数量的周期内低于指定阈值
- 机器人在粗略目标容差内,且机器人到目标的距离在设定数量的周期内没有改善
- 机器人在粗略目标容差内,且已越过终点线(与粗略容差内第一个机器人位姿垂直并通过目标位姿的线)
完整的细节请参阅配置自适应容差目标检查器插件(configuring nav2 controller adaptive tolerance goal checker plugin)。
从 Regulated Pure Pursuit 控制器移除 stateful 参数
Section titled “从 Regulated Pure Pursuit 控制器移除 stateful 参数”PR #6071 从 Regulated Pure Pursuit 控制器中移除了 stateful 参数。该参数此前启用了有状态目标处理,允许控制器保持目标处于激活状态,并在达到 XY 容差后继续对齐航向,而不是恢复为 XY 位置修正。
GoalChecker 新增了 isGoalXYReached API,用于检查 XY 位置是否已达到(而不检查 yaw)。如果在目标检查器配置中设置为 true,它会考虑 stateful 参数。这消除了对单独控制器插件参数的需求,并且该行为现在一致地应用于 Graceful 控制器、Rotation Shim 控制器和 Regulated Pure Pursuit 控制器。
清除单个代价地图插件
Section titled “清除单个代价地图插件”PR #6140 扩展了以下代价地图清除服务,允许可选地清除所选代价地图插件的子集。
- ClearEntireCostmap
- ClearCostmapAroundRobot
- ClearCostmapAroundPose
- ClearCostmapExceptRegion
这些 service 请求中新增了字段 plugins,它接受要清除的插件名称列表。
如果该字段为空,则像以前一样清除所有插件。如果提供了特定插件名称,则只清除这些插件,其余保持不变。
这对于选择性清除特定图层很有用(例如只完全清除障碍物图层,同时保持静态图层不变)。
service 请求中指定的任何插件名称都必须满足以下条件。如果任一条件不满足,则不执行清除操作,service 返回失败响应。
- 插件名称必须对应于代价地图中当前加载的插件。
- 请求的插件必须是
clearable(可清除)的。例如,类型为ObstacleLayer的插件是可清除的,而类型为StaticLayer的插件则不是。
MPPI 控制器:基于命令历史回放的逐轴延迟补偿
Section titled “MPPI 控制器:基于命令历史回放的逐轴延迟补偿”PR #6154 添加了一项功能,用于补偿逐轴的执行器和传输延迟。没有它,规划器假定命令立即生效。在液压转向或任何其他滞后源的平台上,这种不匹配会导致跟踪路径时振荡。该功能与设置 open_loop: true 结合使用效果最佳。
三个新的 MPPIController 参数,默认 0.0(功能禁用):
model_delay_vx— 线性 x 命令延迟model_delay_vy— 线性 y 命令延迟(仅全向平台)model_delay_wz— 角速度 z 命令延迟
当非零时,优化器会从最近发布命令(仍在传输中)的环形缓冲区中填充每个轴的前 round(delay / model_dt) 个 rollout 步,并将计划控制序列向前移动相同的步数。第一条新命令落在 rollout 位置,即实际执行的位置。

该图显示了具有 600 毫秒转向延迟的车辆路径。没有延迟补偿(左)时,控制器围绕规划路径振荡。启用延迟补偿 model_delay_wz=0.6(右)后,跟踪明显更好。
SpeedFilter 路径前视
Section titled “SpeedFilter 路径前视”PR #6150 为 SpeedFilter 插件增加了可选的路径前视(path-lookahead)模式,通过 enable_path_lookahead 参数启用(默认禁用)。启用后,过滤器沿规划路径向前看,并应用在速度相关窗口内找到的最严格速度限制,使机器人能在进入限速区域前减速。当参数 enable_path_lookahead 保持禁用时,默认的速度限制仅在机器人当前位置生效的行为不变。请参阅 SpeedFilter 配置页面(speed filter)了解控制前视行为的新参数。
TruncatePathLocal BT 节点:robot_frame 重命名为 robot_base_frame
Section titled “TruncatePathLocal BT 节点:robot_frame 重命名为 robot_base_frame”PR #6242 将 robot_frame 输入端口重命名为 robot_base_frame,以与 Nav2 命名约定保持一致。该节点现在使用 deconflictPortAndParamFrame(),在省略端口时遵循 BT 导航器配置中的 robot_base_frame 参数,与 GetCurrentPose 和 GoalReached 等其他 BT 节点的行为一致。
使用旧端口名的 TruncatePathLocal 行为树需要更新:
<!-- Before --> <TruncatePathLocal robot_frame="base_link" ... />
<!-- After --> <TruncatePathLocal robot_base_frame="base_link" ... />非对称膨胀场(Asymmetric Inflation Field)
Section titled “非对称膨胀场(Asymmetric Inflation Field)”PR #6118 新增了一个非对称膨胀场。
非对称膨胀场允许用户创建一种不对称性,根据全局路径移动 Voronoi 边界。这对于机器人应偏向靠右或靠左行驶的情况很有用,为另一个参与者留出足够的空间从机器人旁边通过,而无需采取规避机动。

膨胀层自定义内切半径
Section titled “膨胀层自定义内切半径”PR #6223 为 Inflation Layer 新增了 custom_inscribed_radius 参数,允许用户覆盖基于 footprint 的默认内切半径。
设置为负值(默认 -1.0)时,使用根据机器人 footprint 计算的标准内切半径。
根据机器人 footprint 计算的默认内切半径,会为内切半径区域内的所有单元格给出相同的 INSCRIBED_INFLATED_OBSTACLE 代价值。
因此,在如下两个示例所示的情况下,footprintCost 函数会返回相同的值,因为它沿 footprint 选取最高代价。

然而,对于希望拥有更细粒度代价分布以更好地反映实际碰撞风险的情况,这可能并不理想。
现在有了新的 custom_inscribed_radius 参数,用户可以设置自定义内切半径来覆盖默认值。
例如,将其设置为 0.0 将完全跳过内切半径区域,并在 LETHAL 区域之后直接给出衰减代价分布。

警告: 这存在潜在的安全问题! 更改内切半径可能对机器人安全产生严重影响。 此参数仅适用于明确设计为使用此类数据的控制器。 它不适用于依赖基于 footprint 的内切半径的全局路径规划器或配置。
完整的参数文档请参阅 Inflation Layer 配置指南(Inflation Layer configuration guide)。
Collision Monitor 排除区域
Section titled “Collision Monitor 排除区域”PR #6233 为 Collision Monitor 和 Collision Detector 增加了按源的排除区域(exclusion zone)。
排除区域会在数据点被与碰撞多边形进行检查之前,屏蔽掉落在多边形或圆形内部的点,例如忽略机器人必须靠近的停靠站,或从某个源中自过滤机器人身体点。
区域可以锚定到任意 TF frame_id(例如 dock_link),因此在机器人移动时会跟踪该坐标系,3D 源还可以有可选的高度带。
区域是故障安全的:如果区域坐标系变换不可用,则不排除任何点。
请参阅:
- 配置碰撞监控器节点(configuring collision monitor node)
- 配置碰撞检测器节点(configuring collision detector node)
行为树 action 请求错误上报
Section titled “行为树 action 请求错误上报”PR #6289 更新了 BtActionNode,使请求 action 目标时的失败可以通过行为树上报。基础节点现在提供 error_code_id 和 error_msg 输出端口,并处理以下回调:
on_timeouton_goal_rejectedon_send_goal_failure
Nav2 action 定义现在包含 GOAL_REJECTED=1 和 SEND_GOAL_FAILURE=2 错误码。支持超时处理的 action 定义还定义了 TIMEOUT 错误码。当 action 请求或执行失败时,这些错误码写入 error_code_id 输出,相应的原因写入 error_msg。
与 BtActionNode 一起使用的自定义 action 定义应在其结果定义中添加新的错误码。自定义 BT action 节点应删除重复的 error_code_id 和 error_msg 输出端口,以及只提供这种通用行为的 on_timeout 覆写。当需要自定义处理时,覆写 on_goal_rejected 或 on_send_goal_failure。如果 action 定义不提供其中一个标准错误码,BtActionNode 会在可用时使用 UNKNOWN 并在构造期间发出警告。
Action Server 中的目标验证
Section titled “Action Server 中的目标验证”PR #6279 为 Nav2 action server 增加了专门的目标验证回调。
这意味着 goal_received_callback 现在可以用于静态检查传入目标并在需要时拒绝,而不是启动执行然后中止。
这会更改 create_action_server 的签名。它现在在完成回调之前需要一个目标验证回调:
// Old style action_server_ = create_action_server<ActionT>( "my_action", std::bind(&MyServer::execute, this), std::bind(&MyServer::onCompletion, this), std::chrono::milliseconds(500), true);改为:
// New style action_server_ = create_action_server<ActionT>( "my_action", std::bind(&MyServer::execute, this), std::bind(&MyServer::goalReceived, this, std::placeholders::_1), std::bind(&MyServer::onCompletion, this), std::chrono::milliseconds(500), true);如果不需要目标验证,传入 nullptr。
action_server_ = create_action_server<ActionT>( "my_action", std::bind(&MyServer::execute, this), nullptr, std::bind(&MyServer::onCompletion, this), std::chrono::milliseconds(500), true);推荐的迁移模式是将快速验证检查(例如无效插件 ID、空路径/航点列表)从执行时逻辑移到 goal_received_callback 中。
这使无效请求更早失败,避免不必要的执行启动,并干净地拒绝不支持的目标。
此外,BtActionServer 现在在由于缺少当前目标而无法开始执行时报告 GOAL_REJECTED(而不是 UNKNOWN)。
新的 ZoneParameterFilter 代价地图过滤器
Section titled “新的 ZoneParameterFilter 代价地图过滤器”PR #6104 新增了 ZoneParameterFilter 代价地图过滤器,它根据机器人位置使用过滤器掩码为其他节点设置 ROS 参数。每个掩码值选择一个承载参数设定值的已声明状态,例如雪地区域内较低的 FollowPath.max_vel_x。离开所有区域,或进入掩码值为 0 的区域,会恢复声明的 nominal_defaults。每次状态转换都会作为 std_msgs/UInt8 发布在 state_event_topic 上。请参阅 ZoneParameterFilter 配置页面(zone parameter filter)了解参数和示例,以及区域参数过滤器(Zone Parameter Filter)教程。