Humble 迁移指南
从 ROS 2 Humble 迁移到 Iron 时,添加了大量稳定性改进,此处不一一赘述。
新的行为树导航器插件
Section titled “新的行为树导航器插件”在 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 的「开箱即用」功能中。
从 YAML 中移除 use_sim_time
Section titled “从 YAML 中移除 use_sim_time”PR #3131 使得可以在 launch 文件中统一为多个节点设置 use_sim_time 参数,而无需在 YAML 文件中逐个设置。如果使用 Nav2 的 launch 文件,你可以选择从 YAML 文件中移除 use_sim_time 参数,并通过 launch 参数进行设置。
Smac 规划器运行时提速
Section titled “Smac 规划器运行时提速”PR 3201 将 Smac 规划器框架中图实现所用的核心数据结构替换为专用的 unordered map 实现。这在简单请求上可将规划器提速 10%,在涉及大量重哈希的复杂规划上可提速高达 30%。
Smac 与 Simple 平滑器的递归细化
Section titled “Smac 与 Simple 平滑器的递归细化”Simple 和 Smac 规划器平滑器的递归细化次数已通过 refinement_num 参数暴露出来。此前,如果 do_refinement = True,该值被硬编码为 4。现在默认值为 2,以减少开箱即用的过度平滑(过度平滑会导致路径比理想情况更接近碰撞),但将值改回 4 即可获得旧行为。
Simple Commander Python API
Section titled “Simple Commander Python API”PR 3159 及后续 PR 在 Python 3 的 Simple Commander 中加入了代价地图 API,用于接收来自 Nav2 的 OccupancyGrid 消息,并能在 Python 3 中原生处理它们,与 C++ 代价地图 API 类似。它还包含一个线段迭代器(line iterator)和碰撞检查对象,用于在 Python 3 中执行足迹或其他碰撞检查。更多细节请参阅 Simple Commander API。
Smac 规划器将起始位姿纳入路径
Section titled “Smac 规划器将起始位姿纳入路径”PR 3168 将起始位姿添加到了 Smac 规划器(此前在回溯过程中被排除)。
RPP 中可参数化的碰撞检查
Section titled “RPP 中可参数化的碰撞检查”PR 3204 使 RPP 的碰撞检查变为可选(默认为开启)。
扩展的规划器基准测试
Section titled “扩展的规划器基准测试”PR 3218 新增了 launch 文件和更新的脚本,用于在 Nav2 的各规划器上执行客观的随机规划测试,以进行基准测试和指标计算。
Smac 规划器路径容差
Section titled “Smac 规划器路径容差”PR 3219 为 Hybrid-A* 和 State Lattice 规划器添加了路径容差:如果无法找到精确路径,则在目标位姿周围的可配置容差范围内返回近似路径。
costmap_2d_node 默认构造函数
Section titled “costmap_2d_node 默认构造函数”PR #3222 更改了独立 costmap 节点所用的构造函数。新构造函数不会在内部设置名称和命名空间,因此可通过 launch 文件进行设置。
导航失败的反馈
Section titled “导航失败的反馈”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 平滑器
Section titled “Savitzky-Golay 平滑器”新增了一种平滑算法: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。
SmootherSelector BT 节点
Section titled “SmootherSelector BT 节点”PR #3283 新增了一个 BT 节点,用于基于话题或默认值设置平滑器。更多细节请参阅配置指南 configuring_simple_smoother。
发布代价地图图层
Section titled “发布代价地图图层”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 页面。
行为树使用错误码
Section titled “行为树使用错误码”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 服务器的动作请求中指定所需的循环次数。
DWB 前向与反向修剪
Section titled “DWB 前向与反向修剪”PR #3374 在 DWB 控制器中新增了 forward_prune_distance 参数。它取代了用于前向路径缩短的 prune_distance,通过 shorten_transformed_plan 布尔参数启用。这一更改允许为前向和反向路径缩短使用不同的值。
长前瞻距离下弯道更稳定的调节
Section titled “长前瞻距离下弯道更稳定的调节”PR #3414 为 RPP 控制器新增了 use_fixed_curvature_lookahead 参数。这使得弯道减速不再依赖瞬时的前瞻点,而是由 curvature_lookahead_dist 参数设定的固定距离决定。
发布碰撞监控器状态
Section titled “发布碰撞监控器状态”PR #3504 为 CollisionMonitor 新增了 state_topic 参数。如果指定,这个可选参数会启用状态话题发布器。该话题报告当前激活的多边形动作类型和名称。
碰撞监控器中 ROS 参数的更名
Section titled “碰撞监控器中 ROS 参数的更名”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 在输入命令超时时应用减速度。
PoseProgressChecker 插件
Section titled “PoseProgressChecker 插件”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 字段进行选择。请注意,这是一个破坏性变更,配置文件需要更新。
IsBatteryChargingCondition BT 节点
Section titled “IsBatteryChargingCondition BT 节点”PR #3553 新增了一个用于检查电池是否正在充电的 BT 节点。更多细节请参阅配置指南 bt_is_battery_charging_condition。
行为服务器错误码
Section titled “行为服务器错误码”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
新的去噪代价地图图层插件
Section titled “新的去噪代价地图图层插件”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)的参数,用于调试目的。