从Eloquent升级到Foxy

从ROS 2 Eloquent迁移到Foxy版本,增加了许多稳定性改进,我们不会在此具体说明。但值得一提的是终端噪音的减少。大部分启动时的TF2变换超时错误和警告已经被大大减少或限制,使其更易处理。此外,解决了costmap 2d中消息过滤器充满导致消息丢失的问题。

常规

生命周期管理器被分成了两个独立的生命周期管理器,它们分别是``navigation_lifecycle_manager``和``localization_lifecycle_manager``。这样每个进程都有自己的管理器,允许用户在SLAM和定位之间切换而不影响导航。它还减少了``nav2_bringup``中的冗余代码。

生命周期管理器现在还包含与每个生命周期服务器的``Bond``连接。这意味着如果一个服务器崩溃或退出,生命周期管理器将不断检查并将其生命周期节点过渡到安全状态。这在运行时充当看门狗,以补充生命周期管理器从活动状态向上和向下过渡的功能。有关详细信息,请参阅`此PR <https://github.com/ros-planning/navigation2/pull/1894>`_。

修复了BT导航器的一个问题,该问题可能由于异步问题而导致导航器崩溃。因此,每次导航请求都会创建一个行为树,而不是重置现有的树。创建该树会增加一小段延迟。在下一个版本发布之前,将考虑减少这种延迟的建议。

服务器更新

现在,所有插件服务器(控制器、规划器、恢复器)都支持使用多个插件。可以通过加载插件映射表,将插件的名称映射到其预期的用例来实现。每个服务器都定义了一个参数,可以在其中定义要加载的插件名称列表。

服务器名称

插件参数

控制器服务器

progress_checker_plugin

控制器服务器

goal_checker_plugin

控制器服务器

controller_plugins

规划器服务器

规划器插件

恢复服务器

recovery_plugins

成本地图节点

plugins

将特定名称映射到特定插件的类型必须在每个服务器插件列表的插件命名空间中使用“plugin”参数进行定义。预期插件参数列表中的每个名称都应该有“plugin”参数定义。

一个例子:controller_server 定义了参数``controller_plugins``,可以在其中定义插件名称的列表:

controller_server:
  ros__parameters:
    controller_plugins: ["FollowPath", "DynamicFollowPath"]
    FollowPath:
      plugin: "dwb_core/DWBLocalPlanner"
      max_vel_x: 0.26
    DynamicFollowPath:
      plugin: "teb_local_planner/TEBLocalPlanner"
      max_vel_x: 0.5

FollowPath 控制器的类型为 dwb_local_planner/DWBLocalPlanner,而 DynamicFollowPath 的类型为 teb_local_planner/TEBLocalPlanner。每个插件都将在其命名空间中加载参数,例如 FollowPath.max_vel_x,而不是在服务器命名空间中全局加载。这将允许具有不同参数的多个相同类型的插件,并减少参数名称冲突。

DWB 相对于 ROS 1 更新,新增了一些参数,详见 这里的更多信息。此外,控制器和规划器接口在初始化时更新,包括一个 std::string name 参数。这个参数被添加到接口中,以便插件知道应该在哪个命名空间中加载其参数。例如,要查找参数 FollowPath.max_vel_x,控制器必须给出它的名称 FollowPath。所有插件都应该在其给定名称的命名空间中查找参数。

新插件

添加了许多新的行为树节点。这些行为树节点现在是行为树插件,可以在运行时使用行为树 cpp v3 进行动态加载。默认的行为树已经升级,停止了恢复行为,并在导航目标被中止时触发重新规划。请参阅 nav2_behavior_tree 获取完整列表,或者参阅 导航插件 查看当前的行为树插件列表及其描述。这些插件在 nav2_bt_navigator 中设置为默认值,但可以通过 bt_plugins 参数覆盖以包含您特定的插件。

原始的 GitHub 问题:

地图服务器重构

map_saver 被重新设计并分为两部分:CLI 和服务器。CLI 部分是一个命令行工具,它监听传入的地图主题,将地图保存到文件中并完成其工作。这部分几乎没有改动:CLI 可执行文件的名称从 map_saver 更改为 map_saver_cli,但其功能没有改变。服务器是一个新的部分。它在后台运行,可用于通过 save_map 服务连续保存地图。每次服务请求时,它会尝试监听传入的地图主题,接收来自其中的消息,并将获取到的地图写入文件。

map_server 已经大幅简化和清理。OccGridLoader 已经与 MapServer 类合并,因为在可预见的未来它只能与一种``OccupancyGrid``类型的消息一起使用。

地图服务器现在有一个新的 map_io 动态库。将从 map_servermap_saver 移动的所有保存/加载 OccupancyGrid 消息的函数都放在这里。即使没有启动地图服务器节点,这些函数也可以从外部 ROS 2 代码的任何部分轻松调用。

map_loader 已经从 nav2_util 中完全移除。所有功能已经在 map_io 中存在。请在您的代码中使用它。

有关更多信息,请参阅 原始 GitHub 提交地图服务器自述文件

新的粒子滤波器消息

为粒子云添加了新的粒子滤波器消息,包括粒子权重和姿态。nav2_msgs/Particle 定义了一个带有姿态和权重的单个粒子。nav2_msgs/ParticleCloud 定义了一组具有姿态和权重的粒子。

AMCL 现在将其粒子云发布为 nav2_msgs/ParticleCloud 而不是 geometry_msgs/PoseArray

更多信息请参见此处

每个导航动作中的行为树选择

现在``NavigateToPose``动作可以在动作请求中选择``bt_navigator``用于执行导航动作的行为树,通过``string behavior_tree``字段。该字段指示将用于执行该动作的xml文件的绝对路径。如果未指定文件,即将该字段留空,则将使用``default_bt_xml_filename``参数中指定的默认行为树。

此功能已在 ticket #1780 中讨论,并在 pull request #1784 中实施。

FollowPoint功能

添加了一个新的行为树``followpoint.xml``。该行为树使机器人跟随一个动态生成的点,并保持与目标的一定距离。这可用于移动目标跟踪操纵。

此功能已在`票号1660 <https://github.com/ros-planning/navigation2/issues/1660>`_ 中讨论,并在`拉取请求号1859 <https://github.com/ros-planning/navigation2/issues/1859>`_ 中实现。

新的Costmap图层

范围传感器代价地图在navigation2中尚未迁移为``nav2_costmap_2d::RangeSensorLayer``。它使用与`ROS1 <http://wiki.ros.org/range_sensor_layer>`_层相同的概率模型,以及大部分相同的接口。参数的文档已添加到docs/parameters和navigation.ros.org的``配置指南``下。