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):
amd64
、arm64
和arm32
OpenEmbedded Thud(2.6)/ webOS OSE:
arm32
和x86
有关 RMW 实现、编译器/解释器版本和系统依赖版本的更多信息,请参阅 REP 2000。
这个ROS 2版本的新功能有:
我们想要强调一些功能和改进:
每个节点的日志记录 - 所有节点的标准输出/错误输出都记录在 ~/.ros
rqt: 参数插件、tf树插件、`机器人转向插件 <https://github.com/ros-visualization/rqt_robot_steering/pull/7>`__(也已回溯到Dashing版本)
`turtlesim <https://github.com/ros/ros_tutorials/pull/53>`__(也已回溯到Dashing版本)
RMW实现:
零拷贝消息借用API,被 rmw_iceoryx 使用
新的Tier-2实现:`rmw_cyclonedds <https://github.com/ros2/rmw_cyclonedds>`__(也已回溯到Dashing版本)
环境变量 ROS_LOCALHOST_ONLY 用于限制通信仅在本地主机进行
MacOS Mojave 支持
Tracing instrumentation 用于 rcl 和 rclcpp
在开发过程中,GitHub 上的 Eloquent meta ticket 包含进行中的高级任务的最新状态,以及涉及更多细节的特定票据的引用。
自 Dashing 发布以来的变化
geometry_msgs
现在``geometry_msgs/msg/Quaternion.msg``接口的默认初始化为一个有效的四元数,具有以下值:
这是有关更多细节的拉取请求: 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
返回的句柄,否则他们的回调可能会被取消注册。已添加警告以帮助识别未使用返回句柄的错误。
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获取更多详细信息:
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``。
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的风险,修复尚未进行回溯。