从Humble升级到Iron

从 ROS 2 Humble 版本升级到 Iron 版本,增加了一些稳定性改进,我们在此不会具体讨论。

新增行为树导航插件

在 PR 3345 <https://github.com/ros-planning/navigation2/pull/3345> 中新增了导航器类型,以插件形式暴露给用户,可以替换或添加新的导航器类型。导航到位姿和通过位姿的默认行为仍然是默认行为,但现在可以使用新的动作接口定义进行自定义。这些插件实现了 nav2_core::BehaviorTreeNavigator 基类,必须处理动作请求、反馈和完成消息。行为树由该基类处理,尽可能将通用逻辑从用户中抽象出来,以减少重复。

参见 编写新的导航器插件 以了解关于编写新导航插件的教程。

添加了碰撞监测器。

PR 2982 添加了一个独立于 Nav2 栈运行的新的安全层,确保机器人可以控制与近处障碍物的碰撞,这些障碍物来自不同的传感器(LaserScan、PointCloud、IR、Sonars 等)。有关详细信息,请参见 碰撞监控。它不包含在默认的 nav2_bringup 中的启动电池中。

从 yaml 文件中移除了 use_sim_time。

PR #3131 使得可以在启动文件中为多个节点设置 use_sim_time 参数,而不是通过 yaml 文件逐个设置。如果使用 Nav2 的启动文件,您可以选择从您的 yaml 文件中删除 use_sim_time 参数,并通过启动参数进行设置。

Smac 规划器的运行时加速。

PR 3201 中,Smac Planner 框架中的图实现的核心数据结构被更换为使用专门的无序映射实现。这将加快规划器在简单请求上的速度约 10%,并在涉及大量重新哈希的复杂计划上报告高达 30% 的速度提升。

对 Smac 和 Simple 平滑器进行了递归细化。

对于 Simple 和 Smac Planner Smoothers,递归细化次数已在 refinement_num 参数下公开。以前的行为是,如果 do_refinement = True,则将此参数硬编码为 4。现在,默认值为 2,以帮助减少开箱即用时的过度平滑,从而减少与碰撞较近的路径,但可以通过将其更改为 4 来实现旧的行为。

简单指挥官 Python API

PR 3159 和后续的 PR 添加了在 Python3 中的 Costmap API,以接收来自 Nav2 的 OccupancyGrid 消息,并能够在 Python3 中原生处理它们,类似于 C++ 的 Costmap API。它还包括了一个行迭代器和碰撞检测对象,用于在 Python3 中执行足迹或其他碰撞检测。有关详细信息,请参阅 Simple Commander API。

Smac 规划器路径包括起始姿态

PR 3168 在 Smac Planner 中添加了起始姿态,而以前在回溯过程中被排除在外。

可参数化的 RPP 碰撞检查

PR 3204 添加了对RPP的碰撞检查的可选项(默认开启)。

扩展规划器基准测试

PR 3218 添加了用于在Nav2中对规划器进行基准测试和度量计算的启动文件和更新的脚本,以进行目标随机规划测试。

Smac 规划器路径容差

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

costmap_2d_node 默认构造函数

PR #3222 更改了独立成本地图节点使用的构造函数。新的构造函数不会在内部设置名称和命名空间,因此可以通过启动文件进行设置。

导航失败的反馈

PR #3146 更新了全局规划器,在规划失败时抛出异常。这些异常会被报告给规划器服务器,进而在行为树导航器的黑板上放置错误代码,用于在自治应用中进行上下文错误处理。

支持以下错误代码(随着需要会有更多):Unknown(未知错误)、TF Error(TF错误)、Start or Goal Outside of Map(起点或目标点在地图外)、Start or Goal Occupied(起点或目标点被占用)、Timeout(超时)或者No Valid Path Found(未找到有效路径)。

PR #3248 更新了通过姿态计算路径的操作,以报告规划失败。这些异常会被报告给规划器服务器,进而在行为树导航器的黑板上放置错误代码,用于在自治应用中进行上下文错误处理。

支持以下错误代码(随着需要会有更多):Unknown(未知错误)、TF Error(TF错误)、Start or Goal Outside of Map(起点或目标点在地图外)、Start or Goal Occupied(起点或目标点被占用)、Timeout(超时)、No Valid Path Found(未找到有效路径)和No Waypoints given(未给定路径点)。

PR #3227 更新了控制器,在失败时抛出异常。这些异常会被报告给控制器服务器,进而在行为树导航器的黑板上放置错误代码,用于在自治应用中进行上下文错误处理。

支持以下错误代码(随着需要会有更多):Unknown(未知错误)、TF Error(TF错误)、Invalid Path(无效路径)、Patience Exceeded(耐心用尽)、Failed To Make Progress(无法取得进展)或者No Valid Control(无有效控制)。

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

为BT Navigator添加了一个名为"error_code_id_names"的新参数,以定义要比较的错误代码。在动作请求中,将返回"error_code_id_names"中最低的错误代码(导航到位姿、通过路径点进行导航),而代码枚举在软件堆栈中的位置越高,优先级越高,更低层的故障优先级更高。

从服务器产生的错误代码遵循以下准则。错误代码从 0 到 9999 保留给 nav2,而错误代码从 10000 到 65535 保留给外部服务器。每个服务器有两个“保留”错误代码。0 保留给 NONE,序列中的第一个错误代码保留给 UNKNOWN。

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

  • 控制器服务器:NONE:0,UNKNOWN:100,服务器错误代码:101-199

  • Planner Server(compute_path_to_pose):NONE:0(无),UNKNOWN:201(未知错误),服务器错误代码:201-299

  • 规划器服务器(compute_path_through_poses):NONE:0,UNKNOWN:301,服务器错误代码:301-399

  • Smoother Server:NONE:0(无),UNKNOWN:501(未知错误),服务器错误代码:501-599

  • 路径点跟随服务器:NONE:0,UNKNOWN:601,服务器错误代码:601-699

此PR还更新了航点跟随服务器,以便在失败时抛出异常。这些异常将报告给服务器,服务器会在行为树导航器的黑板上放置一个错误代码,以便在自治应用程序中进行上下文错误处理。支持以下错误代码(如有需要,将添加更多):Unknown(未知)和Task Executor Failed(任务执行器失败)。详细信息请参见::ref:`添加_nav2_task_server`和PR。

代价地图过滤器

现在成本地图过滤器可以通过调用适当过滤器的 toggle_filter 服务在运行时启用/禁用(PR #3229)。

添加了新的二进制翻转过滤器,允许在敏感区域关闭摄像头,打开前灯/LED灯/其他安全设备,或在机器人位于标记在掩码区域内时切换操作模式(PR #3228)。

Savitzky-Golay平滑器

将新的平滑算法 Savitzky-Golay 平滑器添加到平滑器服务器插件列表中。有关更多详细信息,请参阅配置指南 Savitzky-Golay平滑器

更改启动文件中map_server节点的地图yaml文件路径。

PR #3174 <https://github.com/ros-planning/navigation2/pull/3174>`_添加了一种设置map_server节点的地图yaml文件路径的方式,可以从yaml文件或使用launch配置参数``map``来设置,优先考虑launch配置参数。``yaml_filename``不再严格要求在``nav2_params.yaml``中存在。

SmootherSelector BT节点

PR #3283 <https://github.com/ros-planning/navigation2/pull/3283>`_添加了一个BT节点,根据主题或默认值来设置平滑器。有关更多详细信息,请参阅配置指南:简单平滑器

发布Costmap图层

PR #3320 <https://github.com/ros-planning/navigation2/pull/3320>`_添加了nav2_costmap_2d软件包的功能,发布与每个图层相关联的代价地图数据。

让行为服务器访问两个Costmap

PR #3255 <https://github.com/ros-planning/navigation2/pull/3255>`_添加了一个行为访问本地和全局代价地图的功能。

为了更新行为,所有对global_frame的引用必须更新为local_frame参数,以及``configuration``方法,该方法现在接受本地和全局碰撞检查器。最后,必须覆盖``getResourceInfo``以返回``CostmapInfoType::LOCAL``。其他选项包括如果行为使用全局costmap和/或足迹,则返回``GLOBAL``,如果两者都需要,则返回``BOTH``。这样我们就可以只创建和维护最少量的昂贵资源。

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

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

有关详细信息,请参阅README.md和:ref:`configuring_mppic`页面。

行为树使用错误代码

PR #3324 <https:https://github.com/ros-planning/navigation2/pull/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面板中加载、保存和循环使用路径点

`PR#3165 <https:https://github.com/ros-planning/navigation2/pull/3165>`_为RViz中的nav2面板提供了三个新功能,它们是:

  • 将路径点加载和保存到yaml文件中以进行路径点跟随(如果需要,也可以存储初始位姿)

  • 循环功能以重新访问航点

  • 用于停止和继续沿路径点前进的暂停和恢复按钮

循环功能不仅限于RViz中的nav2面板。使用nav2_waypoint_follower的用户可以利用对FollowWaypoint操作所做的更改,通过在最终发送到nav2_waypoint_follower服务器的操作请求中指定所需的循环次数。

DWB正向和反向修剪

PR #3374 <https://github.com/ros-planning/navigation2/pull/3374> 在 DWB 控制器中添加了一个新的 forward_prune_distance 参数。它替代了 prune_distance 用于前向路径缩短,通过布尔参数 shorten_transformed_plan 启用。这个改变允许使用不同的值来进行前向和后向路径缩短。

在长远的前瞻距离下对曲线进行更稳定的调节

PR #3414 <https://github.com/ros-planning/navigation2/pull/3414> 在 RPP 控制器中添加了一个新的 use_fixed_curvature_lookahead 参数。这使得在曲线上减速不再依赖于瞬时的前瞻点,而是由参数 curvature_lookahead_dist 设置的固定距离。

发布碰撞监视器状态

PR #3504 <https://github.com/ros-planning/navigation2/pull/3504> 在 CollisionMonitor 中添加了一个新的 state_topic 参数。如果指定了这个可选参数,它将启用状态主题发布器。该主题报告当前激活的多边形动作类型和名称。

碰撞监视器中的ROS参数已重命名

PR #3513 <https://github.com/ros-planning/navigation2/pull/3513> 将 max_points 参数重命名为 min_points 并改变了其含义。以前,max_points 表示区域内仍不触发动作的最大点数,而 min_points 是从动作开始计算的最小点数。换句话说,min_points 现在应该调整为 max_points + 1

碰撞监视器中新增了安全行为模型“limit”

PR #3519 <https://github.com/ros-planning/navigation2/pull/3519> 添加了一个新的碰撞监视器行为模型 limit,它限制最大线速度和角速度到特定的值 (linear_limitangular_limit),如果给定形状内有足够的点。

当超时时,速度平滑器应用减速

PR #3512 <https://github.com/ros-planning/navigation2/pull/3512> 使得 VelocitySmoother 在输入命令超时时应用减速。

PoseProgressChecker插件

PR #3530 <https://github.com/ros-planning/navigation2/pull/3530> 添加了一个新的 nav2_controller::PoseProgressChecker 插件。它在 SimpleProgressChecker 的基础上添加了一个新的参数 required_movement_angle,允许插件在没有平移运动时仍然认为有进展,只要在 movement_time_allowance 内有一个超过 required_movement_angle 的旋转运动。

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

PR #3555 初始化了进度检查器插件的方式,与目标检查器和控制器插件相同:现在它是一个字符串列表,并且从``progress_checker_plugin``更名为``progress_checker_plugins``,类型从``string``变为``vector<string>``。这允许初始化多个进度检查器,可以从``FollowPath``操作的``progress_checker_id``字段中选择。请注意,这是一个重大变更,需要更新配置文件。

IsBatteryChargingCondition BT节点

PR #3553 添加了一个行为树节点,用于检查电池是否在充电。详见配置指南 电池是否正在充电

行为服务器错误代码

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

  • 旋转:无:0,未知:701,服务器错误代码:701-709

  • BackUp: NONE: 0, UNKNOWN: 801, 服务器错误代码:710-719

  • DriveOnHeading:无:0,未知:901,服务器错误代码:720-729

  • AssistedTeleop: NONE: 0, UNKNOWN: 1001, 服务器错误代码:730-739

新的去噪代价地图层插件

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

由于``Voxel Layer``或``Obstacle Layer``测量中的错误,在:ref:costmap <configuring_cosmaps>`上可能会出现椒盐噪声。这种噪声会产生虚假障碍物,阻止机器人在地图上找到最佳路径。新的``Denoise Layer``插件旨在过滤掉由噪声引起的独立障碍物或小型障碍物组。该插件允许您添加一个层来过滤局部或全局代价地图。有关``Denoise Layer``插件及其工作原理的更多信息,请参阅:ref:`此处 <filtering_of_noise-induced_obstacles>

SmacPlannerHybrid viz_expansions 参数

``PR#3577 <https://github.com/ros-planning/navigation2/pull/3577>`_ 添加了一个用于调试目的的可视化SmacPlannerHybrid扩展的新参数。