Iron 到 Jazzy

从 ROS 2 Iron 迁移到 Jazzy 时,增加了许多稳定性改进,我们不会在此具体介绍。

BehaviorTree.CPP 升级到版本 4.5+

由于我们从版本 3.8 迁移到 4.5,用户必须相应地升级其 XML 和源代码。

您可以参考 [此页面](https://www.behaviortree.dev/docs/migration) 了解更多详细信息,但主要变化是:

为命令添加了 TwistStamped 选项

已向 cmd_vel 和相关主题的所有发布者和订阅者添加了新参数 enable_stamped_cmd_vel。这允许您设置 TwistStamped 消息在 Twist 消息上的发布和订阅,以包含设置命令的帧和时间戳信息。目前,默认为 false 以不更改当前行为,但计划将 TwistStamped 与 Gazebo、ROS 2 Control 和相关项目一起设为默认行为。

在碰撞监视器中添加 VelocityPolygon

PR #3708 在碰撞监视器中添加 VelocityPolgon 类型。这允许用户设置多个多边形以覆盖机器人速度限制的范围。例如,用户可以配置不同的多边形进行旋转、向前移动或向后移动。碰撞监视器将根据每个子多边形检查机器人的速度,以确定用于碰撞检查的适当多边形。该教程可在 使用 VelocityPolygon 配置碰撞监视器 部分中找到。

在碰撞监视器中更改多边形点参数格式

PR #4020 将多边形点参数的格式从 vector<double> 更改为 string。这使得多边形描述在碰撞监视器和 Costmap_2D 中更加统一。 现在我们可以在字符串中定义一个多边形的点,该字符串具有 vector<vector<double>> 结构,例如 "[[p1.x, p1.y], [p2.x, p2.y], [p3.x, p3.y],...]",其中至少描述了 4 个点。正方形多边形的示例将如下所示。

PolygonFront:
  type: "polygon"
  points: "[[0.3, 0.3], [0.3, -0.3], [0.0, -0.3], [0.0, 0.3]]"
  action_type: "none"
  min_points: 4
  visualize: True
  polygon_pub_topic: "polygon_front"

软实时操作服务器简介

PR #3914 为控制器服务器添加了软实时优先级,以更好地确保资源用于代码库的时间敏感部分。简单操作服务器现在有一个通过参数 use_realtime_priority 在控制器服务器中公开的 realtime 输入字段,它将控制器的执行线程设置为比系统其余部分更高的优先级,以满足调度期限。要使用此功能,您可以在 /etc/security/limits.conf 中设置以下内容,以授予用户空间访问提升的优先级权限。此功能目前仅在控制器服务器中启用,其执行线程对调度优先级敏感,但如果有必要,将来可以与其他线程一起设置。

<username> soft rtprio 99
<username> hard rtprio 99

碰撞监视器和速度平滑器也添加了“use_realtime_priority”!

“opennav_coverage”项目

https://github.com/open-navigation/opennav_coverage 中有一个新的元包,其中包含完整的覆盖导航器插件、BT 节点、行为树演示和基于“Fields2Cover”的覆盖规划服务器。有关更多信息,请参阅该项目。它长期计划纳入“Nav2”,但在我们将其集成到主项目之前,Fields2Cover 中仍缺少一些功能,以便满足用户对覆盖规划系统所期望的所有主要功能和能力。

如果您想直接在 Nav2 中看到覆盖规划,请考虑为此处描述的目前尚需要的功能做出贡献 <https://github.com/Fields2Cover/Fields2Cover/issues/73>`_。

opennav_docking 项目

一个新的元包位于:https://github.com/open-navigation/opennav_docking,其中包含完整的自动充电底座框架、BT 节点、插件和演示。 这允许以可重复和通用的方式将任何类型的机器人与任何类型的充电底座对接。 它将很快直接集成到 Nav2 中(2024 年 6 月更新:在 Nav2 堆栈中直接``nav2_docking``!)

有关使用此新功能的教程,请参阅:ref:docking_tutorial!感谢 NVIDIA 赞助此包!

引入新的多机器人启动

PR #3572 引入了一种启动 tb3 多机器人的新方法,该方法名为 cloned_tb3_simulation_launch.py​​ 以进行模拟。cloned_tb3_simulation_launch.py​​ 能够使用与 nav2_multirobot_param_all.yaml 中描述的相同参数启动多个机器人。多个机器人由作为启动参数给出的命名空间分隔。 之前使用的现有“multi_tb3_simulation_launch.py​​”被“unique_tb3_simulation_launch.py​​”取代,允许使用“nav2_multirobot_params_<N>.yaml”配置文件实现多个唯一机器人实例。

体素和障碍物层的新选项

PR #3612 为体素和障碍物层的combination_method参数添加了一个新的MaxWithoutUnknownOverwrite选项。这可用于确保静态地图是主要信息来源,并

轻松防止机器人穿过静态地图中不存在的地方。

use_interpolation RPP 参数已弃用

经过许多用户的测试,我们已弃用 use_interpolation 参数,现在它始终处于默认开启状态,无法禁用。它在所有情况下都能提高速度平滑度和整体跟踪质量。

对 MPPI 目标评论家的更改

MPPI 目标评论家的公式已更改,以便更好地跟上接近目标的速度,而不是先发制人地大幅减速。它还允许您更好地使用权重来调整更自然减速的程度。此更改涉及调整“threshold_to_consider”以与您的预测范围相同(例如样本 * dt * 最大速度),以便目标评论家和路径跟随者评论家之间能够很好地交接而不会减速。

MPPI 路径角度评价器的变化

MPPI 的路径角度评价器现在具有“模式”设置,可根据机器人所需的行为特征调整行为。以前,它会惩罚偏离机器人前向方向的路径方向,以使机器人转向路径的急剧变化。这仍然是默认设置(“模式:0”),但现在也存在其他模式。

“模式:1”设置路径相对方向的惩罚,无论是前向方向还是反向方向,以允许真正的双向运动,当对称机器人不喜欢这样或那样的方向时。这仅使用路径相对于机器人的相对点来决定激励哪个方向。

当从 Smac Planners 或 Smoother 服务器的算法给出可行路径时,“模式:2”改为使用路径的方向。这样,就会遵循全局规划的方向,而不是仅仅基于路径的相对点。这对于高度受限环境中的非圆形机器人非常有用,因为在这些环境中,改变方向的机会可能受到限制,因此需要遵循全局路径的方向才能以所需的方向结束。

MPPI 路径处理的方向性变化

MPPI 的路径对齐评论家和路径处理程序对象现在可以选择利用路径的方向信息来强制控制器在可行规划器请求时改变方向。当“enforce_path_inversion”为“true”时,路径处理程序将修剪路径到方向第一次改变时,以强制控制器规划到反转点,然后在容差范围内设置路径的其余部分。路径对齐评论家还包含一个参数“use_path_orientations”,可以与其配对以激励对齐包含方向信息的路径,以便在请求时更好地尝试实现路径反转**并且**在未请求时不执行它们。

有关完整信息,请参阅 MPPI 的配置指南。

添加新的 MPPI 成本评论器

与“ObstacleCritic”类似,如果“ObstacleCritic”对您不起作用,则“CostCritic”是另一种避免障碍物的评论器替代方案。 此评论器使用成本图中膨胀的成本来评分,而不是像“ObstaclesCritic”那样使用到障碍物的距离。 有关更多信息,请参阅配置指南。

MPPI 加速

作为 Jazzy 的新功能,MPPI 速度提高了 45%,这要归功于长达数周的优化活动。尽情享受吧!

移动错误代码枚举

PR #3693 将枚举代码从目标移动到结果部分。

参数文件中的替换

启用参数文件中的替换。例如,您可以编写以下内容

bt_navigator:
  ros__parameters:
    default_nav_to_pose_bt_xml: $(find-pkg-share my_package)/behavior_tree/my_nav_to_pose_bt.xml

有关替换语法的更多信息,请参阅`此处 <https://docs.ros.org/en/rolling/How-To-Guides/Launch-files-migration-guide.html#substitutions>`_

允许行为服务器插件访问操作结果

PR #3704 允许行为服务器插件访问和修改操作结果。

Smac Planner 调试参数名称更改

debug_visualizations 替换了 Hybrid-A* 中的 viz_expansions 参数,以反映新发布的足迹调试信息。

Smac Planner 接近目标捷径解决方案

PR #3962 在 Humble 中“analytic_expansion_max_length”的扩展中添加了新参数“analytic_expansion_max_cost”和“analytic_expansion_max_cost_override”,以进一步限制靠近目标的障碍物附近路径的潜在捷径。 它使用最大成本参数(默认值“200”)来判断扩展是否比用户希望的更接近障碍物。如果扩展非常接近目标,那么如果“analytic_expansion_max_cost_override”为“false”,它可能会覆盖此约束 - 允许覆盖约束以找到成功的路径解决方案,因为这可能是必需的。 此 PR 还引入了额外的分析扩展评分逻辑和边缘案例处理,以通过模拟启发式函数提高路径质量。

添加了 GPS 航点跟随器服务器

此 PR 2814nav2_waypoint_follower 中添加了 follow_gps_waypoints 操作服务器。此服务器接受一组 GPS 目标而不是笛卡尔目标,并提供 nav2_waypoint_follower 上可用的所有其他功能。还在 PR 70 on navigation2_tutorials 上添加了一个演示其功能的新教程,可在此网站的常规教程目录中找到。

Smac Planner Hybrid-A* 新功能

添加了新功能 allow_primitive_interpolation,允许在搜索集中使用更多基元,use_quadratic_cost_penalty,用于影响遍历和启发式函数中的成本惩罚顺序,以及 downsample_obstacle_heuristic,可选择不下采样障碍物启发式的成本图。默认行为将保持不变。如果您想使用这些新功能,请查看 Smac Planner Hybrid-A* 配置指南。

在碰撞监视器/检测器中动态启用/禁用源/多边形

在此“PR #3825 <https://github.com/ros-planning/navigation2/pull/3825>”中,我们添加了在碰撞监视器/检测器中动态启用/禁用源和多边形的功能。

公开操作服务器的结果超时

在此 PR #3787 中,操作服务器结果的超时在所有具有操作服务器的节点中公开。 这是因为在此 PR #1012 中,rcl 中引入了一项更改,如果结果未在 10 秒内产生,则操作服务器会丢弃目标句柄,而之前默认设置为 15 分钟。 由于 Nav2 中的某些操作可能需要超过 10 秒才能完成,因此用户现在可以通过 action_server_result_timeout 参数设置此值,该参数在 bt_navigatorswaypoint_follower 中默认为 15 分钟,在所有其他节点中默认为 10 秒。

RewrittenYaml 可以向 YAML 添加新参数

现在,RewrittenYaml 广泛用于 Nav2 启动脚本,不仅可以替换原始 YAML 中现有的 ROS 参数,还可以添加 YAML 中不存在的新参数。当然,这些参数应该为目标 ROS 节点声明,否则它们将不会在运行时被处理。在这种功能中,它们应该以绝对值表示,并用点分隔。例如,FollowPath 节点的 prune_distance 参数的重写将看起来像 'controller_server.ros__parameters.FollowPath.prune_distance': '1.0'RewrittenYaml() 参数的 param_rewrites 字典中。 该更改是在 PR #3785 修复范围内引入的。

简单指挥官 API 允许多机器人命名空间

简单导航器 API 现在通过在构造函数中公开 namespace 字段来允许多机器人命名空间,以允许您为机器人或系统指定 Nav2 堆栈的命名空间。请参阅 ``此 PR 了解详情 <https://github.com/ros-planning/navigation2/pull/3803/files>`_。

更改 wait_action 节点中的持续时间类型

在此 PR #3871 中,wait_action 节点中的持续时间变量的类型从 int 更改为 double,这允许您对 wait_action 使用浮点值。

当所需的转换不可用时,costmap 激活会失败

在此 PR #3866 中,将参数 initial_transform_timeout 添加到 costmap。如果在此超时期间无法从机器人基础框架转换为全局框架,则 costmap 的激活现在会失败。

子树获得共享资源

PR #3911 为 BT.CPP 中的所有子树提供与主树相同的共享资源(节点、共享超时等)。

碰撞监视器:添加了基于 source_timeout 参数的看门狗机制,具有默认阻止行为

PR #3880 添加了一种看门狗机制,如果源数据尚未发布,或者在 source_timeout` 参数内未收到新数据,或者无法将数据转换为基准框架,则该机制会停止机器人。现在可以为每个源设置 source_timeout 参数:如果未为源设置 source_timeout,则使用节点 source_timeout 参数的值。

此外,可以通过设置 source_timeout: 0.0 来禁用此看门狗机制。

BtActionServer:使用本机库 haltTree()

PR #3950BehaviorTreeEngine::haltAllActions 用于停止 BT 节点的方法更改为 bt.cpp 本机方法 haltTree()

在此更改之前,只有活动的 BT 节点在完成操作时才会停止。 在此更改之后,将调用所有 BT 节点 halt() 方法。 这对于在 halt() 中处理清洁操作(离开时关闭灯)非常方便。

还更新了 nav2_behavior_tree::BtActionServer::haltTree() 以使用相同的功能。它在 nav2 中没有用到,但对于想要在抢占时停止树的外部用户(比如我)很有用。

从 2 个 BT 节点中删除全局框架

RemovePassedGoalsGoalReached BT 节点中删除了全局框架,而是使用目标标头的 frame_id 进行转换。

CostmapUpdate.msg 的介绍

PR #3965 引入了一种新类型的消息 - CostmapUpdate.msg。它是与 Costmap.msg 相关的更新消息。现在,CostmapUpdate.msg 不再像 Costmap.msg 那样在每条消息中发送整个成本地图,而是仅包含自上次更新消息以来发生变化的成本地图区域。Costmap.msg 仅在开始时发送一次,然后发送 CostmapUpdate.msg 类型的消息。这个想法是模仿“OccupancyGrid.msg”和“OccupancyGridUpdate.msg”的行为。

要激活此功能,必须将 Costmap2D ROS 参数“always_send_full_costmap”设置为“false”。

要订阅“Costmap.msg”和“CostmapUpdate.msg”,建议使用“CostmapSubscriber”类。

完整堆栈使用节点时钟

堆栈不再包含挂钟或挂钟速率。它现在将使用节点时钟。当“use_sim_time”为真时,这将是用于模拟的 ROS 时间。否则,它使用稳定时钟。

新的优雅运动控制器

PR #4021 引入了一种基于姿势跟随运动控制律的新型差动机器人控制器,可生成平滑舒适的轨迹。

有关更多信息,请参阅 Graceful Controller

BT Navigator 中的插件库仅包含自定义节点

Jazzy 的新功能是 plugin_lib_names 参数自动隐式包含所有 Nav2 BT 节点。现在只需要指定要加载的其他用户生成的 BT 插件。

用于选择规划器、控制器、目标检查器、进度检查器和平滑器的新 RViz 插件

在 PR #4091 中,添加了一个新的 RViz 插件,用于动态选择规划器、控制器、目标检查器、进度检查器和平滑器。

此插件的主要目标是在将机器人部署到预期应用程序中之前,方便开发人员轻松集成测试其配置。

为了便于动态选择指定的组件,所有这些组件的 BT 选择器节点都被利用并更新为所有相关的 BT 节点。

在这里我们可以看到插件的工作演示:

../_images/selector_plugin_demo.gif

在 GIF 中,可以看到有两个 controller_id,分别是 FollowPathHighSpeedFollowPath。默认情况下,使用行为树中定义的那个。

在这种情况下,FollowPath 是默认的 controller_id。这两个 controller_id 之间的区别在于,HighSpeedFollowPath 的最大速度比 FollowPath 更高。这种差异在 GIF 中可以很好地体现出来。

Attention

If a server is unavailable, then the combo box or the drop down list of the particular component will be empty.

RPP 新增可选的“interpolate_curvature_after_goal”行为,并修复“use_rotate_to_heading”和“allow_reversing”之间的冲突

在 PR #4140 <https://github.com/ros-planning/navigation2/pull/4140>`_ 中,添加了新的可选“interpolate_curvature_after_goal”参数(默认为“false”),用于激活目标后的胡萝卜插值,以保持恒定的曲率前瞻距离。这是为了避免在生成角速度时路径末端出现不稳定性。用于线性速度计算的胡萝卜保持不变。

插值基于路径最后 2 个姿势形成的矢量的方向。因此,当“interpolate_curvature_after_goal”为“true”时,长度为 1 的路径将被拒绝。它只能在“use_fixed_curvature_lookahead: true”时使用。

../_images/rpp_goal_lookahead_interpolate.gif

此外,use_rotate_to_headingallow_reversing 之间的冲突已修复,因此 use_rotate_to_heading 现在可以向后使用。

GlobalPlanner 的取消检查器接口

PR #4148GlobalPlanner 引入了一个新接口,允许取消当前规划任务。 以前,即使目标被取消,规划人员也会继续规划,现在他们可以检查目标,如果目标被取消,则停止规划。 GlobalPlanner::createPlan 的新接口:

virtual nav_msgs::msg::Path createPlan(
  const geometry_msgs::msg::PoseStamped & start,
  const geometry_msgs::msg::PoseStamped & goal,
  std::function<bool()> cancel_checker)

这是为堆栈中的所有规划器实现的,您可以检查它们以了解“cancel_checker”函数的示例用法(只需检查“cancel_checker()”即可)。 Smac 和 Theta* 规划器有一个新的参数“terminal_checking_interval”,它是取消或超时检查的频率(以迭代次数计算)。

新的 BtActionServer/BtNavigator 参数

PR #4209 引入了一个新的布尔参数“always_reload_bt_xml”,这使得始终重新加载请求的行为树 XML 描述成为可能,而不管当前活动的 XML 如何。这允许在更改/开发 XML 描述时保持操作服务器运行。

新的碰撞监控参数

PR #4207 引入了一个新的布尔参数 ``polygon_subscribe_transient_local``(默认值为 false),用于设置多边形主题或足迹主题订阅的 QoS 持久性。

控制器的新优雅取消 API

PR #4136 引入了控制器的新优雅取消 API。以前,当目标被取消时,控制器会立即停止机器人。此 API 允许控制器以更优雅的方式停止机器人。新 API 在 RegulatedPurePursuitController 中通过添加新参数 cancel_deceleration 实现。因此,当目标被取消时,将使用恒定减速,同时继续跟踪路径以停止机器人,而不是立即停止。此 API 应该添加到所有具有加速度限制的控制器中。

使用双冒号 (::) 标准化插件命名

`PR #4220`_ 将整个 Navigation2 包中的插件命名标准化为使用双冒号 (::),取代之前混合使用斜线 (/) 和双冒号。受影响的插件包括:

  • 行为服务器:nav2_behaviors::Spinnav2_behaviors::BackUpnav2_behaviors::DriveOnHeadingnav2_behaviors::Waitnav2_behaviors::AssistedTeleop

  • 规划器服务器:nav2_navfn_planner::NavfnPlannernav2_smac_planner::SmacPlanner2Dnav2_smac_planner::SmacPlannerHybridnav2_theta_star_planner::ThetaStarPlanner

  • 控制器服务器:nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitControllernav2_dwb_controller::DWBLocalPlanner

  • BT Navigator: nav2_bt_navigator::NavigateToPoseNavigator, nav2_bt_navigator::NavigateThroughPosesNavigator

碰撞监视器:圆形多边形的动态半径

PR #4226 引入了对圆形多边形使用参数 <polygon_name>.polygon_sub_topic 的功能。若未设置参数“<polygon_name>.radius”,碰撞监测节点将订阅主题“<polygon_name>.polygon_sub_topic”(订阅类型为“std_msgs/msg/Float32”),当前圆形多边形半径将根据主题上收到的消息进行更新。

静态层:新参数“footprint_clearing_enabled”

PR #4282 引入了静态层参数“footprint_clearing_enabled”的使用。其工作原理与障碍物和体素层中的“footprint_clearing_enabled”参数类似。如果设置为“true”,静态层将清除机器人覆盖范围内的成本图单元。默认情况下为“false”,以保留以前的行为。

生命周期节点:添加了 bond_heartbeat_period 参数(并允许禁用债券机制)

PR #4342 将参数 bond_heartbeat_period 添加到生命周期节点,以自定义债券机制发布周期(在 /bond 主题上)。默认值不变,为 0.1 秒。如果小于或等于 0.0,则禁用。

旋转垫片控制器:新参数“rotate_to_goal_heading”

PR #4332 引入了旋转垫片控制器参数“rotate_to_goal_heading”的使用。它允许旋转垫片控制器在达到 XY 目标公差时重新控制,以朝着目标航向进行干净的旋转。一些控制器会在内部执行此操作,但对于其他控制器来说,这是一个有用的选项。

MPPI 控制器:增加加速度约束

PR #4352 为 MPPI 控制器添加了新参数 ax_maxax_minay_maxaz_max。这些参数将使 MPPI 控制器能够在指定的加速度约束内生成局部轨迹。

RegulatedPurePursuit 控制器 [RPP]:新参数 use_cancel_deceleration

PR #4441 为受控纯追踪控制器添加了新参数 use_cancel_deceleration。此参数使控制器能够使用恒定减速来正常停止机器人,而不是在目标取消时立即停止。