Skip to content

Humble 迁移指南

从 ROS 2 Humble 迁移到 Iron 时,添加了大量稳定性改进,此处不一一赘述。

在 PR 3345 中,导航器类型作为插件暴露给用户,可以被替换,也可以添加新的导航器类型。导航到姿态(navigate to pose)和穿过姿态导航(navigate through poses)的默认行为保持不变,但现在可以通过新的动作接口定义进行定制。这些插件实现了 nav2_core::BehaviorTreeNavigator 基类,该基类必须处理动作请求、反馈和完成消息。行为树逻辑由该基类统一处理,尽可能将通用逻辑抽象出来,以减少用户的重复工作。

关于编写新导航器插件的教程,请参阅编写新的导航器插件。

新增碰撞监控器(Collision Monitor)

Section titled “新增碰撞监控器(Collision Monitor)”

PR 2982 新增了一个独立于 Nav2 技术栈运行的安全层,确保机器人能够避免与附近障碍物发生碰撞,障碍物数据来自不同传感器(LaserScan、PointCloud、IR、声呐等)。更多细节请参阅 configuring_collision_monitor。它不包含在 nav2_bringup 默认 bringup 的「开箱即用」功能中。

PR #3131 使得可以在 launch 文件中统一为多个节点设置 use_sim_time 参数,而无需在 YAML 文件中逐个设置。如果使用 Nav2 的 launch 文件,你可以选择从 YAML 文件中移除 use_sim_time 参数,并通过 launch 参数进行设置。

PR 3201 将 Smac 规划器框架中图实现所用的核心数据结构替换为专用的 unordered map 实现。这在简单请求上可将规划器提速 10%,在涉及大量重哈希的复杂规划上可提速高达 30%。

Simple 和 Smac 规划器平滑器的递归细化次数已通过 refinement_num 参数暴露出来。此前,如果 do_refinement = True,该值被硬编码为 4。现在默认值为 2,以减少开箱即用的过度平滑(过度平滑会导致路径比理想情况更接近碰撞),但将值改回 4 即可获得旧行为。

PR 3159 及后续 PR 在 Python 3 的 Simple Commander 中加入了代价地图 API,用于接收来自 Nav2 的 OccupancyGrid 消息,并能在 Python 3 中原生处理它们,与 C++ 代价地图 API 类似。它还包含一个线段迭代器(line iterator)和碰撞检查对象,用于在 Python 3 中执行足迹或其他碰撞检查。更多细节请参阅 Simple Commander API。

PR 3168 将起始位姿添加到了 Smac 规划器(此前在回溯过程中被排除)。

PR 3204 使 RPP 的碰撞检查变为可选(默认为开启)。

PR 3218 新增了 launch 文件和更新的脚本,用于在 Nav2 的各规划器上执行客观的随机规划测试,以进行基准测试和指标计算。

PR 3219 为 Hybrid-A* 和 State Lattice 规划器添加了路径容差:如果无法找到精确路径,则在目标位姿周围的可配置容差范围内返回近似路径。

PR #3222 更改了独立 costmap 节点所用的构造函数。新构造函数不会在内部设置名称和命名空间,因此可通过 launch 文件进行设置。

PR #3146 更新了全局规划器,使其在规划失败时抛出异常。这些异常会被报告回规划器服务器,规划器服务器随后将错误码写入行为树导航器(Behavior Tree Navigator)的黑板(blackboard),供自主应用进行上下文相关的错误处理。

支持以下错误码(后续按需添加):未知(Unknown)、TF 错误(TF Error)、起点或目标在地图外(Start or Goal Outside of Map)、起点或目标被占用(Start or Goal Occupied)、超时(Timeout)、未找到有效路径(No Valid Path Found)。

PR #3248 更新了 compute path through poses 动作以报告规划失败。这些异常会被报告回规划器服务器,规划器服务器随后将错误码写入行为树导航器的黑板,供自主应用进行上下文相关的错误处理。

支持以下错误码(后续按需添加):未知(Unknown)、TF 错误(TF Error)、起点或目标在地图外(Start or Goal Outside of Map)、起点或目标被占用(Start or Goal Occupied)、超时(Timeout)、未找到有效路径(No Valid Path Found)和未提供航点(No Waypoints given)。

PR #3227 更新了控制器,使其在失败时抛出异常。这些异常会被报告回控制器服务器,控制器服务器随后将错误码写入行为树导航器的黑板,供自主应用进行上下文相关的错误处理。

支持以下错误码(后续按需添加):未知(Unknown)、TF 错误(TF Error)、无效路径(Invalid Path)、超出耐心时间(Patience Exceeded)、未能取得进展(Failed To Make Progress)、无有效控制(No Valid Control)。

PR #3251 通过 bt_navigator 传递最高优先级的错误码,并定义了错误码结构。

为 BT Navigator 新增了一个名为 error_code_id_names 的参数,添加到 nav2_params.yaml 中,用于定义要比较的错误码。动作请求(navigate to pose、navigate through poses、waypoint follower)中会返回 error_code_id_names 中数值最低的错误,而错误码枚举值随软件栈层级的升高而增大——即越底层的失败优先级越高。

服务器产生的错误码遵循以下准则:0 到 9999 的错误码保留给 Nav2,10000 到 65535 的错误码保留给外部服务器。每个服务器有两个「保留」错误码:0 保留给 NONE,序列中的第一个错误码保留给 UNKNOWN。

当前实现了错误码的服务器有:

  • Controller Server:NONE: 0,UNKNOWN: 100,服务器错误码:101-199
  • Planner Server(compute_path_to_pose):NONE: 0,UNKNOWN: 201,服务器错误码:201-299
  • Planner Server(compute_path_through_poses):NONE: 0,UNKNOWN: 301,服务器错误码:301-399
  • Smoother Server:NONE: 0,UNKNOWN: 501,服务器错误码:501-599
  • Waypoint Follower Server:NONE: 0,UNKNOWN: 601,服务器错误码:601-699

该 PR 还更新了 waypoint follower 服务器,使其在失败时抛出异常。这些异常会被报告回服务器,服务器随后将错误码写入行为树导航器的黑板,供自主应用进行上下文相关的错误处理。支持以下错误码(后续按需添加):未知(Unknown)和任务执行器失败(Task Executor Failed)。更多信息请参阅添加 Nav2 任务服务器和该 PR。

代价地图过滤器(Costmap Filters)

Section titled “代价地图过滤器(Costmap Filters)”

代价地图过滤器现在可以通过为相应过滤器调用 toggle_filter 服务在运行时启用/禁用(PR #3229)。

新增了二进制翻转(binary flip)过滤器,例如可以在敏感区域关闭摄像头、打开头灯/LED/其他安全设备,或者在机器人位于掩码(mask)标记区域内时切换操作模式(PR #3228)。

新增了一种平滑算法:Savitzky-Golay 平滑器。更多细节请参阅配置指南 configuring_savitzky_golay_filter_smoother。

Launch 中 map_server 节点地图 YAML 文件路径的变更

Section titled “Launch 中 map_server 节点地图 YAML 文件路径的变更”

PR #3174 增加了一种设置 map_server 节点地图 YAML 文件路径的方式:既可以从 YAML 文件中设置,也可以使用 launch 配置参数 map,launch 配置参数具有更高优先级。nav2_params.yaml 中不再严格要求必须有 yaml_filename。

PR #3283 新增了一个 BT 节点,用于基于话题或默认值设置平滑器。更多细节请参阅配置指南 configuring_simple_smoother。

PR #3320 使 nav2_costmap_2d 包能够发布与每个图层相关的代价地图数据。

让行为服务器访问两个代价地图

Section titled “让行为服务器访问两个代价地图”

PR #3255 使行为(behavior)能够访问局部和全局代价地图。

要更新行为,所有对 global_frame 的引用都必须改为 local_frame 参数,configuration 方法现在同时接收局部和全局碰撞检查器。最后,必须重写 getResourceInfo 以返回 CostmapInfoType::LOCAL。如果行为使用全局代价地图(和/或足迹),其他选项包括 GLOBAL;如果两者都需要,则为 BOTH。这使我们只需创建和维护最少量的高开销资源。

新的模型预测路径积分(MPPI)控制器

Section titled “新的模型预测路径积分(MPPI)控制器”

新的 Nav2 MPPI 控制器是一种预测控制器——是 TEB 和纯路径跟踪 MPC 控制器的后继者。它使用基于采样的方法选择最优轨迹,并在连续迭代之间进行优化。它包含基于插件的目标函数,可针对各种行为和行为属性进行定制和扩展。

更多细节请参阅 README.md 和 configuring_mppic 页面。

PR #3324 新增了三个新的条件节点,用于检查包含错误码的动作 BT 节点在黑板上设置的错误码。

AreErrorCodesPresent 条件节点允许用户指定服务器产生的错误码以及要匹配的错误码。 WouldAControllerRecoveryHelp 检查活动错误码是否为 UNKNOWN、PATIENCE_EXCEEDED、FAILED_TO_MAKE_PROGRESS 或 NO_VALID_CONTROL。如果错误码匹配,条件返回 SUCCESS。这些错误码有可能通过控制器恢复来清除。

WouldAPlannerRecoveryHelp 检查活动错误码是否为 UNKNOWN、NO_VALID_CONTROL 或 TIMEOUT。如果错误码匹配,条件返回 SUCCESS。这些错误码有可能通过规划器恢复来清除。

WouldASmootherRecoveryHelp 检查活动错误码是否为 UNKNOWN、TIMEOUT、FAILED_TO_SMOOTH_PATH 或 SMOOTHED_PATH_IN_COLLISION。如果错误码匹配,条件返回 SUCCESS。这些错误码有可能通过平滑器恢复来清除。

从 RViz 的 Nav2 面板加载、保存和循环航点

Section titled “从 RViz 的 Nav2 面板加载、保存和循环航点”

PR #3165 为 RViz 中的 nav2 面板提供了三个新功能:

  • 在 YAML 文件中加载和保存航点以进行航点跟随(如果需要,也可以存储初始位姿)
  • 循环功能,用于重新访问航点
  • 暂停和恢复按钮,用于停止和继续航点

循环功能并非 RViz 中 nav2 面板独有。使用 nav2_waypoint_follower 的用户可以利用对 FollowWaypoint 动作所做的更改,在最终发送给 nav2_waypoint_follower 服务器的动作请求中指定所需的循环次数。

PR #3374 在 DWB 控制器中新增了 forward_prune_distance 参数。它取代了用于前向路径缩短的 prune_distance,通过 shorten_transformed_plan 布尔参数启用。这一更改允许为前向和反向路径缩短使用不同的值。

长前瞻距离下弯道更稳定的调节

Section titled “长前瞻距离下弯道更稳定的调节”

PR #3414 为 RPP 控制器新增了 use_fixed_curvature_lookahead 参数。这使得弯道减速不再依赖瞬时的前瞻点,而是由 curvature_lookahead_dist 参数设定的固定距离决定。

PR #3504 为 CollisionMonitor 新增了 state_topic 参数。如果指定,这个可选参数会启用状态话题发布器。该话题报告当前激活的多边形动作类型和名称。

PR #3513 将 max_points 参数更名为 min_points,并改变了其含义。以前 max_points 表示区域内不触发动作的最大点数,而 min_points 则表示触发动作所需的最少点数。换言之,现在 min_points 应设置为原 max_points + 1。

碰撞监控器中新的安全行为模型 limit

Section titled “碰撞监控器中新的安全行为模型 limit”

PR #3519 新增了一个碰撞监控器行为模型 limit:如果给定形状内有足够多的点,则限制最大线速度和角速度(linear_limit 和 angular_limit)。

速度平滑器在超时时应用减速度

Section titled “速度平滑器在超时时应用减速度”

PR #3512 使 VelocitySmoother 在输入命令超时时应用减速度。

PR #3530 新增了 nav2_controller::PoseProgressChecker 插件。它在 SimpleProgressChecker 行为的基础上增加了新参数 required_movement_angle,允许插件在 movement_time_allowance 内存在超过 required_movement_angle 的旋转运动时,即使没有平移运动也认为仍有进展。

允许多个目标检查器并更改 progress_checker_plugin(s) 参数的名称和类型

Section titled “允许多个目标检查器并更改 progress_checker_plugin(s) 参数的名称和类型”

PR #3555 采用与目标检查器和控制器插件相同的方式初始化进度检查器插件:现在它是一个字符串列表,从 progress_checker_plugin 更名为 progress_checker_plugins,类型从 string 改为 vector<string>。这允许初始化多个进度检查器,可以通过 FollowPath 动作新增的 progress_checker_id 字段进行选择。请注意,这是一个破坏性变更,配置文件需要更新。

PR #3553 新增了一个用于检查电池是否正在充电的 BT 节点。更多细节请参阅配置指南 bt_is_battery_charging_condition。

PR #3569 更新了行为服务器插件,使其在失败时提供错误码。

  • Spin:NONE: 0,UNKNOWN: 701,服务器错误码:701-709
  • BackUp:NONE: 0,UNKNOWN: 801,服务器错误码:710-719
  • DriveOnHeading:NONE: 0,UNKNOWN: 901,服务器错误码:720-729
  • AssistedTeleop:NONE: 0,UNKNOWN: 1001,服务器错误码:730-739

PR #2567 新增了用于过滤代价地图噪声的插件。

由于 Voxel Layer 或 Obstacle Layer 的测量误差,代价地图上可能会出现椒盐噪声(salt and pepper noise)。这种噪声会制造虚假障碍物,阻碍机器人在地图上找到最佳路径。新的 Denoise Layer 插件旨在滤除噪声引起的独立障碍物或小障碍物群。该插件允许你添加一个图层,对局部或全局代价地图进行过滤。有关 Denoise Layer 插件及其工作原理的更多信息,请参阅此处。

SmacPlannerHybrid 的 viz_expansions 参数

Section titled “SmacPlannerHybrid 的 viz_expansions 参数”

PR #3577 新增了一个用于可视化 SmacPlannerHybrid 扩展(expansions)的参数,用于调试目的。