Eloquent Elusor(eloquent

*Eloquent Elusor*是ROS 2的第五个版本。

支持的平台

Eloquent Elusor 主要支持以下平台:

一级平台:

  • Ubuntu 18.04(Bionic):amd64``和``arm64

  • Mac macOS 10.14 (Mojave)

  • Windows 10(Visual Studio 2019)

二级平台:

  • Ubuntu 18.04(Bionic):arm32

Tier 3 平台:

  • Debian Stretch(9):amd64arm64arm32

  • OpenEmbedded Thud(2.6)/ webOS OSE:arm32x86

有关 RMW 实现、编译器/解释器版本和系统依赖版本的更多信息,请参阅 REP 2000

这个ROS 2版本的新功能有:

我们想要强调一些功能和改进:

在开发过程中,GitHub 上的 Eloquent meta ticket 包含进行中的高级任务的最新状态,以及涉及更多细节的特定票据的引用。

自 Dashing 发布以来的变化

geometry_msgs

现在``geometry_msgs/msg/Quaternion.msg``接口的默认初始化为一个有效的四元数,具有以下值:

\[\begin{split}x = 0 \\ y = 0 \\ z = 0 \\ w = 1\end{split}\]

这是有关更多细节的拉取请求: https://github.com/ros2/common_interfaces/pull/74

静态变换广播器和监听器现在在``/tf_static``话题上使用QoS持久性``transient_local``。类似于ROS 1中的latched设置,静态变换只需要发布一次。新的监听器将从所有存活且在之前发布的静态广播器接收变换。所有发布者必须更新使用此持久性设置,否则它们的消息将不会被变换监听器接收。有关更多细节,请参阅此拉取请求: https://github.com/ros2/geometry2/pull/160

rclcpp

与``get_actual_qos()``的API中断

在Dashing中引入的``get_actual_qos()``方法在``PublisherBase``和``SubscriptionBase``上以前返回了一个rmw类型``rmw_qos_profile_t``,但这使得在创建其他实体时难以重用。因此,它已更新为返回一个``rclcpp::QoS``。

现有的代码如果仍需要rmw配置文件,则需要使用``rclcpp::QoS::get_rmw_qos_profile()``方法。例如:

void my_func(const rmw_qos_profile_t & rmw_qos);

/* Previously: */
// my_func(some_pub->get_actual_qos());
/* Now: */
my_func(some_pub->get_actual_qos()->get_rmw_qos_profile());

这种直接进行更改而不是进行逐步迁移的原因是,这是一个新的函数,预计用户很少使用。此外,由于只有返回类型发生变化,添加一个具有不同返回类型的新函数是进行废弃周期和``get_actual_qos()``是最合适的名称的唯一方法,因此我们将被迫选择一个不太明显的方法名称。

与发布者和订阅者类的API变更

为了简化发布者和订阅者的构建过程,构造函数的API已进行了更改。

不可能支持废弃周期,因为旧的签名接受rcl类型,而新的签名接受``NodeBaseInterface``类型,以便获得现在所需的附加信息,并且无法仅通过rcl类型获取所需的附加信息。如果这有助于贡献者,新的签名可能会被回溯,但由于发布者和订阅者几乎总是使用工厂函数或其他更高级别的API创建,我们不认为这对大多数用户会构成问题。

请查看原始的PR了解更多详细信息,并在那里进行评论,如果这引起了问题:

[https://github.com/ros2/rclcpp/pull/867](https://github.com/ros2/rclcpp/pull/867)

编译器警告,关于未使用``add_on_set_parameters_callback``的结果

自Eloquent Patch Release 2(2020-12-04)开始

用户应该保留 rclcpp::Node::add_on_set_parameters_callback 返回的句柄,否则他们的回调可能会被取消注册。已添加警告以帮助识别未使用返回句柄的错误。

https://github.com/ros2/rclcpp/pull/1243

rmw

由于新增发布者和订阅者选项而导致的API变更。

rmw_create_publisher() 方法新增了一个类型为 const rmw_publisher_options_t * 的参数。这个新结构包含了用于新发布者的选项(除了类型支持、主题名称和QoS之外)。

方法``rmw_create_subscription()``的一个参数被删除,即``bool ignore_local_publications``,并被新的类型为``const rmw_subscription_options_t *``的选项所取代。``ignore_local_publications``选项被移入新的``rmw_subscription_options_t``类型中。

在这两种情况下,这些新的参数(指针类型)不能为null,因此rmw实现应该检查选项是否为null。另外,应将选项复制到相应的rmw结构中。

请参阅此pull request和相关的pull requests获取更多详细信息:

https://github.com/ros2/rmw/pull/187

ros2cli

ros2msg和ros2srv已弃用

CLI工具``ros2msg``和``ros2srv``已被弃用。它们已被工具``ros2interface``替代,该工具还支持action和IDL接口。您可以运行``ros2 interface --help``获取用法信息。

ros2node

Service客户端已添加到ros2node info。作为该更改的一部分,Python函数``ros2node.api.get_service_info``已更名为``ros2node.api.get_service_server_info``。

rviz

重命名为'2D Nav Goal'工具

该工具已更名为'2D Goal Pose',默认话题从``/move_base_simple/goal``更改为``/goal_pose``。

这是相关的pull请求:

https://github.com/ros2/rviz/pull/455

TF2 缓冲区

现在必须为 TF2 缓冲区提供定时器接口。

如果未提供定时器接口,将抛出异常。

例如:

tf = std::make_shared<tf2_ros::Buffer>(get_clock());
// The next two lines are new in Eloquent
auto timer_interface = std::make_shared<tf2_ros::CreateTimerROS>(
  this->get_node_base_interface(),
  this->get_node_timers_interface());
tf->setCreateTimerInterface(timer_interface);
// Pass the Buffer to the TransformListener as before
transform_listener = std::make_shared<tf2_ros::TransformListener>(*tf);

rcl

ROS命令行参数更改

为了应对日益复杂的接口,现在扩展了一组配置选项,ROS CLI的语法已经发生了变化。例如,使用Dashing语法的命令行如下:

ros2 run some_package some_node foo:=bar __params:=/path/to/params.yaml __log_level:=WARN --user-flag

使用Eloquent(及更高版本)的语法编写如下:

ros2 run some_package some_node --ros-args --remap foo:=bar --params-file /path/to/params.yaml --log-level WARN -- --user-flag

这种显式的语法提供了新功能,例如单参数赋值 --param name:=value。如需更多参考和解释,请查看 ROS命令行参数设计文档

警告

旧的语法已被弃用,并将在下一个版本中移除。

已知问题

  • [ros2/rosidl#402] find_package(PCL) 干扰了ROS接口生成。解决方法:在 rosidl_generate_interfaces() 之后调用 find_package(PCL)

  • [ros2/rclcpp#893] rclcpp::Context 由于与 rclcpp::GraphListener 存在引用循环而无法销毁。这导致内存泄漏。由于破坏ABI的风险,修复尚未进行回溯。

发布前的时间线

发布前的一些关键节点:

周一,9月30日(α版)

核心软件包的首次发布可用。从现在开始可以进行测试(某些功能可能尚未完全实现)。

周五,10月18日

核心包API和功能冻结,此后只能进行错误修复发布。新包可以独立发布。

周四,10月24日(β版)

可用的核心包更新版本。对最新功能进行额外测试。

周三,11月13日(正式版本候选人)

可用的核心软件包更新版本。

周二,11月19日

冻结 rosdistro。rosdistro 仓库上关于 Eloquent 的 PR 不会被合并(发布公告后重新开放)。