从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_server
和 map_saver
移动的所有保存/加载 OccupancyGrid
消息的函数都放在这里。即使没有启动地图服务器节点,这些函数也可以从外部 ROS 2 代码的任何部分轻松调用。
map_loader
已经从 nav2_util
中完全移除。所有功能已经在 map_io
中存在。请在您的代码中使用它。
有关更多信息,请参阅 原始 GitHub 提交 和 地图服务器自述文件。
新的粒子滤波器消息
为粒子云添加了新的粒子滤波器消息,包括粒子权重和姿态。nav2_msgs/Particle
定义了一个带有姿态和权重的单个粒子。nav2_msgs/ParticleCloud
定义了一组具有姿态和权重的粒子。
AMCL
现在将其粒子云发布为 nav2_msgs/ParticleCloud
而不是 geometry_msgs/PoseArray
。
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的``配置指南``下。