Eloquent 迁移指南
从 ROS 2 Eloquent 迁移到 Foxy 时,新增了大量稳定性改进,此处不一一赘述。 但特别值得一提的是终端噪声的减少。 启动时大量 TF2 变换超时错误和警告已被移除或节流(throttle),使终端输出更加清爽。 此外,代价地图中消息过滤器(message filter)队列占满导致消息被丢弃的问题也已解决。
总体变化(General)
Section titled “总体变化(General)”生命周期管理器被拆分为两个独立的生命周期管理器:
navigation_lifecycle_manager 和 localization_lifecycle_manager。
这使得每个进程都有自己的管理器,用户可以在不影响导航的情况下在 SLAM 和定位之间切换。
这也减少了 nav2_bringup 中的冗余代码。
生命周期管理器现在还与每个生命周期服务器建立了 Bond 连接。
这意味着如果某个服务器崩溃或退出,生命周期管理器会持续检测,并出于安全考虑将其生命周期节点转换为 shutdown 状态。
这在运行时充当了看门狗(watchdog),补充了生命周期管理器在 active 状态转换方面的功能。详情请参见此 PR。
对 BT navigator 进行了修复,消除了一个罕见的、可能因异步问题而崩溃的问题。 因此,现在每次导航请求都会创建一个新的行为树,而不是重置现有树。 创建行为树会带来少量延迟。 在下一个版本发布之前,将考虑减少该延迟的方案。
服务器更新(Server Updates)
Section titled “服务器更新(Server Updates)”所有插件服务器(controller、planner、recovery)现在都支持使用多个插件。 这是通过加载一个插件映射表(map)来实现的,将插件名称映射到各自的用途。 每个服务器都定义了一个参数,用于指定要加载的插件名称列表。
| 服务器名称(Server Name) | 插件参数(Plugin Parameter) |
|---|---|
| Controller Server | progress_checker_plugin |
| Controller Server | goal_checker_plugin |
| Controller Server | controller_plugins |
| Planner Server | planner_plugins |
| Recovery Server | recovery_plugins |
| Costmap Node | 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.5FollowPath 控制器的类型为 dwb_local_planner/DWBLocalPlanner,DynamicFollowPath 的类型为 teb_local_planner/TEBLocalPlanner。
每个插件都会在各自的命名空间中加载参数,例如 FollowPath.max_vel_x,而不是在服务器命名空间中全局加载。
这样可以加载多个同类型但参数不同的插件,并减少参数名称冲突。
与 ROS 1 的更新相比,DWB 包含了一些新参数,更多信息请参阅此处。
此外,控制器和规划器接口已更新,初始化时增加了 std::string name 参数。
该参数被添加到接口中,以便插件知道它应在哪个命名空间加载其参数。
例如,控制器要查找参数 FollowPath.max_vel_x,就必须获得其名称 FollowPath 才能获取该参数。
所有插件都应在其指定名称的命名空间中查找参数。
新插件(New Plugins)
Section titled “新插件(New Plugins)”添加了许多新的行为树节点。
这些行为树节点现在是 BT 插件,可以在运行时通过 BehaviorTree.CPP v3 动态加载。
默认行为树已升级:当导航目标被抢占(preempted)时,会停止恢复行为并触发重新规划。
完整列表请参阅 nav2_behavior_tree 包,当前行为树插件及其描述请参阅插件(Plugins)。
这些插件在 nav2_bt_navigator 中被设为默认插件,但可以通过 bt_plugins 参数覆盖,以便加入自定义插件。
原始 GitHub 议题:
- DistanceController
- SpeedController
- GoalUpdatedCondition
- DistanceTraveledCondition
- TimeExpiredCondition
- UpdateGoal
- TruncatePath
- IsBatteryLowCondition
- ProgressChecker
- GoalChecker
地图服务器重构(Map Server Re-Work)
Section titled “地图服务器重构(Map Server Re-Work)”map_saver 被重新设计并分为两部分:CLI 和 server。
CLI 部分是一个命令行工具,监听传入的地图话题,将地图保存到文件后即退出。这部分几乎保持不变:CLI 可执行文件从 map_saver 改名为 map_saver_cli,功能没有变化。
server 是一个新的部分。它在后台运行,可以通过 save_map 服务持续保存地图。每次收到服务请求时,它都会尝试监听传入的地图话题,接收一条消息,并将获得的地图写入文件。
map_server 被大幅简化和清理。OccGridLoader 与 MapServer 类合并,因为在可预见的将来只需处理一种 OccupancyGrid 类型的消息。
Map Server 现在有了新的 map_io 动态库。所有保存/加载 OccupancyGrid 消息的函数都已从 map_server 和 map_saver 迁移至此。即使没有启动 Map Server 节点,也可以从任何外部 ROS 2 代码中方便地调用这些函数。
map_loader 已从 nav2_util 中完全移除。它的所有功能都已存在于 map_io 中。请在你的代码中使用 map_io。
更多信息请参阅原始 GitHub 议题和 Map Server README。
新的粒子滤波器消息(New Particle Filter Messages)
Section titled “新的粒子滤波器消息(New Particle Filter Messages)”添加了用于粒子云(particle cloud)的新粒子滤波器消息,在包含粒子位姿的同时还包含粒子权重。
nav2_msgs/Particle 定义粒子云中的单个粒子,包含位姿和权重。
nav2_msgs/ParticleCloud 定义一组粒子,每个粒子都包含位姿和权重。
AMCL 现在以 nav2_msgs/ParticleCloud 的形式发布其粒子云,而不是 geometry_msgs/PoseArray。
在每个导航动作中选择行为树
Section titled “在每个导航动作中选择行为树”NavigateToPose 动作现在允许在动作请求中通过 string behavior_tree 字段选择 bt_navigator 执行导航动作所使用的行为树。该字段指明用于执行动作的 XML 文件的绝对路径。如果未指定文件(将该字段留空),将使用 default_bt_xml_filename 参数中指定的默认行为树。
该功能曾在议题 #1780 中讨论,并在拉取请求 #1784 中实现。
跟随点(FollowPoint)功能
Section titled “跟随点(FollowPoint)功能”新增了一个行为树 followpoint.xml。该行为树使机器人跟随一个动态生成的点,并与目标保持一定距离。这可用于移动目标跟踪等机动任务。
该功能曾在议题 #1660 中讨论,并在拉取请求 #1859 中实现。
新的代价地图图层(New Costmap Layer)
Section titled “新的代价地图图层(New Costmap Layer)”范围传感器代价地图尚未作为 nav2_costmap_2d::RangeSensorLayer 移植到 navigation2。它使用了与 ROS 1 的 range_sensor_layer 层相同的概率模型,以及大部分相同的接口。参数文档已添加到 docs/parameters,以及 docs.nav2.org 的「配置指南(Configuration Guide)」下。