Skip to content

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::ServiceClient
  • create_service → nav2::ServiceServer
  • create_publisher → nav2::Publisher
  • create_subscriber → nav2::Subscriber
  • create_action_server → nav2::SimpleActionServer
  • create_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。

所有插件现在都使用 nav2::LifecycleNode,而不是 rclcpp_lifecycle::LifecycleNode 或 nav2_util::LifecycleNode。 从规划器、控制器到行为树节点,所有插件都必须更新以使用新 API。 同样,对 create_* 工厂的调用现在(在适用处)会指向 Nav2 对象。 上文展示了工厂的映射关系,下文则是从现有代码迁移到新版本的示例。

不再需要手动创建该对象,也不应该这样做——手动创建会绕过生命周期节点工厂中设置的 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 支持服务内省。

服务现在应使用 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,节点不再作为参数传入。 除此之外没有变化。 与之前的 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 请求、反馈和结果内省。

现在可通过节点的 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 请求、反馈和结果内省。

迁移时,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 覆写。

在 rcl 和 rclcpp 内部解决早期目标移除问题后,所有 action server 中的 action_server_result_timeout 参数已被移除。 不再需要设置此参数。

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

与上述情况不同的非默认外部检测旋转需作相应调整。

PR #5218 为 opennav_docking 增加了按需探测器控制。 ChargingDock 和 NonChargingDock 现在提供纯虚函数 startDetectionProcess / stopDetectionProcess,停靠服务器在感知循环前后调用它们。

  • 自定义停靠插件必须实现新的钩子(如不需要额外操作则返回 true)。
  • Simple(Non)ChargingDock 新增 detector_service_name、detector_service_timeout 和 subscribe_toggle 参数,仅在需要检测时触发探测器服务。
  • 请参阅配置停靠服务器(configuring docking server)获取更新后的参数参考和 YAML 示例。

在 PR #5226 中,新增了用平滑圆弧拼接 route_server 中两条连续边(edge)的能力。举例来说:两条连续边构成一个角,以半径 1 的圆弧进行平滑。红线是路线图的边,绿线是可供局部规划器使用的合成路径。

smoothing

新参数包括 smooth_corners(启用或禁用角点平滑)和 smoothing_radius(拟合到角点的圆弧半径)。圆弧起点和终点的切线与构成角的两条边的切线匹配。如果两条边基本是直线,则不添加角圆弧,而是进行常规线性插值。此外,如果角圆弧所需的起点和终点超出边长,也不会添加角圆弧。

在 PR #5325 中,新增了一个 Nav2 专用的行为树控制节点。新的行为树控制节点 NonblockingSequence 允许序列中的每个子节点都被 tick,即使其中一个子节点返回了 RUNNING。这样可以防止长时间运行的子节点阻塞整个序列。

有关 NonblockingSequence 的更多细节,请参阅 Nav2 专用节点讲解(Nav2 specific node walkthrough)和 NonblockingSequence 配置指南(NonblockingSequence configuration guide)。

MPPI 控制器现在有一个插件 OptimalTrajectoryValidator,可用于校验即将执行的输出轨迹。 它可以检查碰撞、与障碍物的间距、与路径的偏离程度、是否取得进展等。 默认情况下,它使用 DefaultOptimalTrajectoryValidator 来检查碰撞。 注意,运动学和动力学约束无需检查,因为优化器(Optimizer)会自动确保这些约束得到满足。

新增 PersistentSequence 和 PauseResumeController 控制节点

Section titled “新增 PersistentSequence 和 PauseResumeController 控制节点”

在 PR #5247 中新增了两个 Nav2 专用的行为树控制节点。

PauseResumeController(PauseResumeController configuration guide)增加了暂停和恢复行为树执行的 service。与此配合,PersistentSequence(PersistentSequence configuration guide)控制节点可通过双向端口将子节点索引暴露给行为树,使序列在恢复执行时从暂停处继续。

在 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)
raw593.63
draco443.28
zstd64.33
zlib121.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"/>

PR #5565 在 opennav_following 软件包中新增了跟随服务器(Following Server)。 跟随服务器用于跟随动态物体或特定参考坐标系。 该服务器允许机器人通过基于话题的检测技术或坐标系跟踪,跟随已检测到的物体或特定坐标系,并保持设定距离。

有关跟随服务器的参数设置,请参阅配置跟随服务器(configuring following server)配置指南。

跟随服务器的教程最近已更新。有关最新说明和示例,请参阅动态点跟随。

在 PR #5617 中,为 MPPI 增加了开环选项。 新增选项:使用最后一条命令速度进行初始状态估计,而不是使用里程计。 这在低加速度或轮式里程计延迟(电机响应差)导致 MPPI 初始状态估计出现问题的情况下很有用。

默认值:

  • open_loop: false

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.6

Collision Monitor 和 CollisionDetector 新增 CostmapSource 观察类型

Section titled “Collision Monitor 和 CollisionDetector 新增 CostmapSource 观察类型”

在 PR #5642 中,为 Collision Monitor 和 Collision Detector 新增了 CostmapSource 观察类型,允许直接订阅 nav2_msgs/msg/Costmap 消息作为观察源。使用此源时应谨慎。

在 PR #5516 中,新增了使用隔离测试构建的选项。 这样 rmw_zenoh_cpp 的用户无需在单独的终端中启动 Zenoh 路由器即可运行测试。 可通过在构建时传入 --cmake-args -DUSE_ISOLATED_TESTS=ON 来启用此功能。

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

在 PR #5774 中,重新设计了 Nav2 面板(nav2_rviz_plugins),提供对导航请求的全面控制并统一目标管理工具。

主要改进:

  • 动态行为树(BT)选择:新增选择器,可指定自定义行为树 XML 文件。这样可在运行时修改导航逻辑(例如特定的恢复行为),适用于 NavigateToPose 和 NavigateThroughPoses 请求。
  • 手动坐标输入:支持通过数字字段精确输入坐标(X、Y、Theta)和 frame_id,作为可视化工具的补充。

UI 工作流现在组织为两种主要导航模式:

  1. 单目标导航(NavigateToPose)专为单个目标设计。目标可使用标准的 “Nav2 Goal” 工具(在地图上点击)定义,也可直接在面板中手动输入精确坐标。

  2. 多目标导航(NavigateThroughPoses、Waypoint Following)专为执行姿态序列而设计。此模式使用姿态累积模式,在执行前构建并管理目标列表:

    • 列表构建:姿态可通过混合方式添加:使用 “Nav2 Goal” 工具、手动输入坐标或加载 YAML 文件。
    • 编辑:列表完全可交互;用户可修改特定姿态参数或从序列中移除单个目标。
    • 执行:列表定义好后,可通过 NavigateThroughPoses 或 Waypoint Following action 执行导航。

nav2_new_rviz_panel

上面的 GIF 展示了如何混合使用可视化目标设置和文件加载,为 NavigateThroughPoses 和 Waypoint Following action 配置多目标导航。

Regulated Pure Pursuit 控制器新增动态窗口纯跟踪选项

Section titled “Regulated Pure Pursuit 控制器新增动态窗口纯跟踪选项”

在 PR #5783 中,增加了在 Regulated Pure Pursuit 控制器中启用动态窗口纯跟踪(Dynamic Window Pure Pursuit,DWPP)算法的选项。启用后,计算命令速度时会显式考虑速度和加速度约束。请参阅配置指南了解与该功能相关的新参数。

dwpp_comparison

以下参数为此功能进行了更新。

max_linear_vel(已重命名):

类型默认值
double0.5

描述:要使用的最大线速度(m/s)。之前名为 desired_linear_vel

注意:速度平滑器(velocity smoother)在发布 cmd_vel 之前,会根据其自身的速度和加速度限制裁剪该控制器产生的速度命令。 因此,速度平滑器的参数 max_velocity、min_velocity、max_accel 和 max_decel 必须设置为与该控制器相应的速度、加速度和减速度参数一致或更大。

在 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.1140%13%
0.2110%10%
0.25100%9%
0.585%8%
1.080%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 更改。

之前:

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;

新增了一个参数:来自路径处理器的转换并裁剪后的全局路径。

之前:

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_plan
  • shorten_transformed_plan
  • prune_distance
  • forward_prune_distance
  • transform_tolerance
  • publish_global_plan
  • publish_transformed_plan

新增的参数

  • path_length_tolerance

移除的参数

  • transform_tolerance
  • max_robot_pose_search_dist

移除的参数

  • transform_tolerance
  • max_robot_pose_search_dist

移除的参数

  • transform_tolerance
  • prune_distance
  • max_robot_pose_search_dist
  • enforce_path_inversion
  • inversion_xy_tolerance
  • inversion_yaw_tolerance

目标检查与导航的对称偏航容差

Section titled “目标检查与导航的对称偏航容差”

PR #5833 为目标检查与导航引入了对称偏航容差(symmetric yaw tolerance)特性,使对称机器人无需进行不必要的 180° 旋转即可到达目标。

在 PR 5804 中,增加了在 Nav2 中启用进程内通信(Intra-process Communication)的选项。可以在启动 Nav2 节点时传入 use_intra_process_comms 参数为 true 来启用。

它当前默认处于禁用状态。请参阅性能与 ROS 2以及 Nav2 栈中的 TB3/TB4 示例作为参考。

新增了一个目标检查器插件 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 毫秒,应根据规划时间和整体系统性能进行调整。

在 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 文件元数据中自动检测。

之前:

smac_lattice_omni_before_1

smac_lattice_omni_before_2

之后:

smac_lattice_omni_after_1

smac_lattice_omni_after_2

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 消息淹没。

在 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。

PR #5933 重构了 Inflation 层,利用 OpenMP 进行并行处理,在大地图上显著提高了性能。

新实现用 Felzenszwalb-Huttenlocher 距离变换算法取代了之前基于队列的单元格迭代。 编译时不可用 OpenMP 时,该层回退到单线程运行。

将 isStopped、isPathValid 和 isPoseOccupied 从条件节点移至动作节点

Section titled “将 isStopped、isPathValid 和 isPoseOccupied 从条件节点移至动作节点”

在 PR 5991 中,以下节点从条件节点移至动作节点并重命名:

  • IsStopped 现在是 CheckStopStatus
  • IsPathValid 现在是 ValidatePath
  • IsPoseOccupied 现在是 CheckPoseOccupancy

此更改是因为这些行为树节点可能返回 RUNNING 或需要更多时间完成,不适合期望以 100 Hz tick 的行为树。

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)

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。

不幸的是,所有用户都需要重新调整权重值,但会获得更快、更可靠的结果!

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)。设置为正值时,只验证机器人前方该距离内的路径部分,在不需要完整路径验证时可提高效率。

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: DiffDrive
  • mppi::OmniMotionModel:取代 motion_model: Omni
  • mppi::AckermannMotionModel:取代 motion_model: Ackermann

虽然 motion_model 参数的默认值是 “diff_drive”,但如上所示,仍然需要为其指定插件。

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 控制器。

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 位置,即实际执行的位置。

mppi_delay_compensation_serpentines

该图显示了具有 600 毫秒转向延迟的车辆路径。没有延迟补偿(左)时,控制器围绕规划路径振荡。启用延迟补偿 model_delay_wz=0.6(右)后,跟踪明显更好。

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 边界。这对于机器人应偏向靠右或靠左行驶的情况很有用,为另一个参与者留出足够的空间从机器人旁边通过,而无需采取规避机动。

asymmetric_layer_active

PR #6223 为 Inflation Layer 新增了 custom_inscribed_radius 参数,允许用户覆盖基于 footprint 的默认内切半径。 设置为负值(默认 -1.0)时,使用根据机器人 footprint 计算的标准内切半径。

根据机器人 footprint 计算的默认内切半径,会为内切半径区域内的所有单元格给出相同的 INSCRIBED_INFLATED_OBSTACLE 代价值。 因此,在如下两个示例所示的情况下,footprintCost 函数会返回相同的值,因为它沿 footprint 选取最高代价。

large_overlap low_overlap

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

custom_inscribed_radius_zero

警告: 这存在潜在的安全问题! 更改内切半径可能对机器人安全产生严重影响。 此参数仅适用于明确设计为使用此类数据的控制器。 它不适用于依赖基于 footprint 的内切半径的全局路径规划器或配置。

完整的参数文档请参阅 Inflation Layer 配置指南(Inflation Layer configuration guide)。

PR #6233 为 Collision Monitor 和 Collision Detector 增加了按源的排除区域(exclusion zone)。 排除区域会在数据点被与碰撞多边形进行检查之前,屏蔽掉落在多边形或圆形内部的点,例如忽略机器人必须靠近的停靠站,或从某个源中自过滤机器人身体点。 区域可以锚定到任意 TF frame_id(例如 dock_link),因此在机器人移动时会跟踪该坐标系,3D 源还可以有可选的高度带。 区域是故障安全的:如果区域坐标系变换不可用,则不排除任何点。

请参阅:

  • 配置碰撞监控器节点(configuring collision monitor node)
  • 配置碰撞检测器节点(configuring collision detector node)

PR #6289 更新了 BtActionNode,使请求 action 目标时的失败可以通过行为树上报。基础节点现在提供 error_code_id 和 error_msg 输出端口,并处理以下回调:

  • on_timeout
  • on_goal_rejected
  • on_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 并在构造期间发出警告。

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)教程。