Memutar Ulang Data LiDAR ROS2 dengan RTI Recording Service dan DDS

Pengujian di dunia nyata tidak dapat digantikan untuk sistem terdistribusi dan otonom, namun dapat sangat mahal. Dengan menangkap dan memutar ulang data sensor, tim dapat menghasilkan nilai bertahan dari setiap sesi pengujian.
Bayangkan kendaraan semi-otonom yang dilengkapi GPS, kamera, LiDAR, RADAR, sensor inersial, dan serangkaian sinyal kontrol lengkap. Volume data yang dihasilkan selama satu lari sangat besar, dan biaya uji coba berulang di jalan raya tinggi. Merekam data tersebut untuk diputar ulang nanti—esensialnya menciptakan perpustakaan digital dari sesi pengujian—akan secara dramatis meningkatkan repeatabilitas dan fleksibilitas pengujian.
Selama bertahun-tahun, pengguna DDS telah memiliki akses ke perekaman dan pemutaran bandwidth tinggi melalui RTI Recording Service. Ini mendukung tangkapan berkelanjutan, 24/7 dari semua data sistem selama penerapan yang diperpanjang, seperti uji coba di laut dari kapal angkatan laut. Berkat arsitektur terdistribusi DDS, beberapa instance Recording Service dapat diluncurkan untuk mengikuti aliran data masif.
ROS2, yang bergantung pada DDS untuk komunikasi antar-proses, dapat memanfaatkan Recording Service yang telah teruji lapangan ini untuk menangkap topik ROS2 bandwidth tinggi seperti titik awan LiDAR. Dalam contoh berikut, kami akan menyiapkan topik bandwidth sedang (data LiDAR ROS2) dan memutarnya ulang ke dalam ROS2 menggunakan alat DDS saja.
Konfigurasi Rekaman
RTI Recording Service dikendalikan oleh file konfigurasi XML yang menentukan topik mana yang akan direkam, pengaturan QoS yang diinginkan, dan opsi penyimpanan. Dalam pengaturan ini, kami menginstruksikan perekam untuk memperlakukan data ROS2 PointCloud2 sebagai satu kolom, menghindari deserialisasi yang mahal untuk tipe data besar ini.
Berikut adalah file XML yang kami gunakan, bernama ros2_record.xml:
<dds xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://community.rti.com/schema/5.3.1/rti_record.xsd">
<recorder name="simple_example">
<!-- Enable remote access to RTI Recorder. The Recorder creates one
DataReader and one DataWriter in the specified domain. -->
<remote_access>
<enabled>true</enabled>
<remote_access_domain>0</remote_access_domain>
</remote_access>
<!-- Base name for the set of files that will store recorded data -->
<recorder_database>
<database_name>ros2_replay_example.dat</database_name>
<overwrite>true</overwrite>
</recorder_database>
<!-- Record data from one domain -->
<domain name="domain0">
<domain_id>0</domain_id>
<!-- Turn off deserialization for ROS2 ‘PointCloud2’ data type (over 5k elements) -->
<deserialize_mode>RTIDDS_DESERIALIZEMODE_NEVER</deserialize_mode>
</domain>
<!-- Create a TopicGroup that only records rt/velodyne_points topics -->
<topic_group name="ros-rt">
<topics><topic_expr>rt/velodyne_points</topic_expr></topics>
<field_expr>*</field_expr>
</topic_group>
<!-- Create a RecordGroup -->
<record_group name="RecordAll">
<!-- Specify which domains to record from -->
<domain_ref><element>domain0</element></domain_ref>
<!-- Specify which TopicGroups to record -->
<topic_ref><element>ros-rt</element></topic_ref>
</record_group>
<!-- Add domain and typecode info to record ROS2 ‘PointCloud2’ type -->
<domain_type_config>
<domain_group>
<element>
<domain_filter>
<element>domain0</element>
</domain_filter>
<type_config>
<xml>
<file_group>
<element>
<file_name>
<element>PointCloud2.xml</element>
</file_name>
<type>
<element>
<register_top_level>false</register_top_level>
<type_name>sensor_msgs::msg::dds_::PointCloud2_</type_name>
<registered_type_name>
<element>sensor_msgs::msg::dds_::PointCloud2_</element>
</registered_type_name>
<topics><element>rt/velodyne_points</element></topics>
</element>
</type>
<max_sequence>2147483647</max_sequence>
</element>
</file_group>
<path>
<element>.</element>
</path>
</xml>
</type_config>
</element>
</domain_group>
</domain_type_config>
</recorder>
</dds>
Untuk memulai Recording Service dengan konfigurasi ini, jalankan perintah berikut dari direktori yang berisi ros2_record.xml:
rtirecord -cfgFile ros2_record.xml -cfgName simple_example
Layanan ini berlangganan ke topik LiDAR dan merekam secara berkelanjutan sampai Anda menghentikannya. Outputnya adalah database SQLite bernama ros2_replay_example.dat_0_0. Sesi perekaman berikutnya menambahkan awalan angka ke nama file, memastikan setiap file tetap dalam batas ukuran yang ditentukan pengguna.
Konfigurasi Pemutaran Ulang
Dengan data yang direkam, kami sekarang dapat memutarnya ulang ke dalam lingkungan ROS2. Posting blog sebelumnya menyoroti bahwa ROS2 membutuhkan beberapa penyesuaian QoS untuk interoperabilitas yang mulus. Dalam contoh ini, kami menekan transmisi type-code agar cocok dengan konfigurasi default ROS2 “Bouncy Bolson” (atau rilis ROS2 apa pun yang menggunakan rmw_connext_cpp).
File XML berikut, ros2_replay.xml, menggerakkan RTI Replay Service:
<?xml version="1.0"?>
<dds xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://community.rti.com/schema/5.3.1/rti_replay.xsd">
<!-- Example configuration for RTI Replay Service 2.0, tailored for ROS2 rt/* topics (PointCloud2) -->
<replay_service name="simple_example">
<annotation>
<documentation>Replay service example</documentation>
</annotation>
<time_control>
<rate>1</rate> <!-- Optional rate multiplier -->
<start_mode>AUTO</start_mode>
<start_offset><sec>5</sec></start_offset>
</time_control>
<!-- Source Database, Required -->
<replay_database name="simple_config">
<filename>ros2_replay_example.dat_0_0</filename>
<readonly>false</readonly>
<!-- Participant configuration. Suppress sending typeCode info (for ROS2) -->
<participant>
<domain_id>0</domain_id>
<participant_qos>
<resource_limits>
<type_code_max_serialized_length>0</type_code_max_serialized_length>
<type_object_max_serialized_length>0</type_object_max_serialized_length>
</resource_limits>
</participant_qos>
</participant>
<!-- Get typeCode info for playback (PointCloud2 type) -->
<type_config>
<xml>
<file_group>
<element>
<file_name>
<element>PointCloud2.xml</element>
</file_name>
<type>
<element>
<register_top_level>false</register_top_level>
<type_name>sensor_msgs::msg::dds_::PointCloud2_</type_name>
<registered_type_name>
<element>sensor_msgs::msg::dds_::PointCloud2_</element>
</registered_type_name>
<topics><element>rt/velodyne_points</element></topics>
</element>
<max_sequence>2147483647</max_sequence>
</type>
</element>
</file_group>
<path><element>.</element></path>
</xml>
</type_config>
<session name="A_Session">
<!-- Default values for <time_control> * -->
<replay_topic name="All_Topic">
<input>
<topic_name>*</topic_name>
<type_name>*</type_name>
<record_group_name>*</record_group_name>
<domain_name>*</domain_name>
</input>
</replay_topic>
</session>
</replay_database>
</replay_service>
</dds>
Untuk memutar ulang data yang direkam ke dalam ROS2, jalankan:
rtireplay -cfgFile ros2_replay.xml -cfgName simple_example
Hasil
Setelah merekam serangkaian sesi LiDAR ROS2, data dapat diputar ulang sesuai permintaan. Tangkapan layar berikut menunjukkan titik awan yang diputar ulang di dalam lingkungan ROS2:

[1] [2] >