ROS2 + DDS:再玩一次
实际测试是必要的——而且经常昂贵 - 创建分布式和自治系统的一部分。测试旨在让系统经历许多不同的场景,实时数据收集可以从这些测试中创造持久的价值。
考虑对包括 GPS、摄像头、激光雷达、雷达、加速度计、陀螺仪、指南针、速度计、控制信号以及地图和环境的(半)自动驾驶汽车进行道路测试数据。那是*大量*的数据……而且获取成本非常高。如果所有这些数据都可以记录以供按需重播,就像在运行实际测试一样,那不是很好吗?如果您可以为每个测试会话构建一个数字库并能够在播放时对其进行修改,从而创建更多可重复的测试场景,那会怎样?
您是否知道,多年来,DDS 用户都可以使用 RTI Recording Service 进行高带宽/大容量录制和播放? RTI 记录服务的一个示例用例是在扩展的现场部署期间连续(24/7)记录所有系统数据,例如海军舰艇的海上试验。由于 DDS 的分布式特性,记录带宽和容量几乎不受限制 - 可以启动多个记录服务实例以跟上数据洪流的步伐。
ROS 生态系统有自己的录音服务,称为 Rosbag,但在撰写本文时,Rosbag 仅在最近才针对 ROS2 发布。幸运的是,ROS2 使用 DDS 作为其底层连接框架,因此使用经过现场验证的 RTI Recording Service 来记录来自 ROS2 的高带宽数据以便随时重播应该很简单。
让我们实现它...
记录器配置
RTI 记录服务可以通过 XML 文件进行配置,以记录所有或选定的主题,以及需要的任何 QoS 设置。在这个例子中,我将设置记录一个中等带宽的主题(ROS2 LiDAR 数据),然后将其重放回 ROS2 - 全部来自纯 DDS 工具集。
RTI Recording Service 通常会反序列化数据以记录到传统数据库的列中。 ROS2 LiDAR 数据每个样本有大量点,因此在本例中,我将指示记录器不要反序列化数据并将其记录为数据库中的单个列。 XML 文件的其余部分告诉记录器要记录的主题和数据类型,以及存储数据的位置。
这包含在我创建的名为“ros2_record.xml”的 XML 文件中:
xsi:noNamespaceSchemaLocation="http://community.rti.com/schema/5.3.1/rti_record.xsd">
<远程访问>
<已启用>真已启用>
0
远程访问>
<记录器_数据库>
ros2_replay_example.dat
真
<域名=“域0”>
0
RTIDDS_DESERIALIZEMODE_NEVER
域>
rt/velodyne_points
*
domain0
ros-rt
<域类型配置>
<域_组>
<元素>
<域_过滤器>
<元素>域0元素>
<类型配置>
<文件组>
<元素>
<文件名>
PointCloud2.xml
文件名>
<类型>
<元素>
false
sensor_msgs::msg::dds_::PointCloud2_
<注册类型名称>
sensor_msgs::msg::dds_::PointCloud2_
<主题>
rt/velodyne_points
主题>
元素>
类型>
2147483647
元素>
<路径>
<元素>.元素>
路径>
元素>
录音>
要使用上述 XML 文件启动 RTI Recording Service,我使用以下命令(从与上述 XML 文件相同的目录中执行):
rtirecord -cfgFile ros2_record.xml -cfgName simple_example
这将启动记录服务,该服务将订阅 LiDAR 数据并持续记录直到我关闭程序。最终结果是一个名为“ros2_replay_example.dat_0_0”的SQLite数据库文件
将数字附加到文件名以区分记录会话(第一个数字)和序列中的哪个数据库文件(文件自动限制为用户可选择的大小;一旦它们变得太大,它们就会被关闭并打开另一个文件来保存下一个时期的数据。这样可以防止数据库文件变得太大)。
播放器配置
现在我已经记录了 ROS2 LiDAR 数据,让我们看看它是否可以回放到 ROS2 中。
正如之前的博客文章(互操作性和生态系统合并时的现场指南)中提到的,ROS2 需要一些设置来确保兼容性。在本例中,发现期间发送类型代码信息已被抑制以与 ROS2“Bouncy Bolson”版本的默认配置兼容,但如果运行 rmw_connext_cpp
也可以在 ROS2 中进行此调整 作为RMW层。
这些设置——连同主题、域和文件信息——被放置在另一个 XML 文件中:
xsi:noNamespaceSchemaLocation="http://community.rti.com/schema/5.3.1/rti_replay.xsd">
注释>
重放服务示例
注释>
<时间控制>
1
自动
5
ros2_replay_example.dat_0_0
假
<参与者>
0
<参与者_qos>
<资源限制>
0
0
参与者>
<类型配置>
<文件组>
<元素>
<文件名>
PointCloud2.xml
文件名>
<类型>
<元素>
false
sensor_msgs::msg::dds_::PointCloud2_
<注册类型名称>
sensor_msgs::msg::dds_::PointCloud2_
rt/velodyne_points
元素>
类型>
2147483647
元素>
.
<会话名称="A_Session">
<输入>
*
<类型名称>*类型名称>
*
<域名>*域名>
输入>
会话>
要将记录的数据重放回ROS2:
rtireplay -cfgFile ros2_replay.xml -cfgName simple_example
结果
现在我已经收集了在一系列自动模拟器会话期间生成的 ROS2 LiDAR 数据,并且这些数据都可以按需重播,正如预期的那样:
不错!我现在可以按需重放 LiDAR 数据,而无需专用的汽车模拟器(或实际车辆)。
玩
很有趣 重放 XML 文件中的变量,以加速 LiDAR 数据的重放。就像坐在一辆*非常*快的车里一样!
有关 ROS2 和 DDS 的更多信息,请查看之前的 RTI 博客文章:
互操作性和生态系统何时合并的现场指南
物联网技术