(Python) 将图像时间序列转换为 ROS 包

(Python) Converting image time series to ROS bag

我有一组图像,其中包含来自数据集的时间戳和里程计数据的元数据。我想将这个时间序列的图像转换成一个 rosbag,这样我就可以很容易地将它从我将要编写的代码中插入并在测试后切换到实时数据中。通过本教程,以编程方式将数据保存到 rosbag 的过程似乎是这样工作的:

import rosbag
from std_msgs.msg import Int32, String

bag = rosbag.Bag('test.bag', 'w')

try:
    str = String()
    str.data = 'foo'

    i = Int32()
    i.data = 42

    bag.write('chatter', str)
    bag.write('numbers', i)
finally:
    bag.close()

对于图像,数据类型不同但过程相同。但是,当我有应该相互关联的数据时,例如每个图像都应与时间戳和里程计记录配对。这个示例代码似乎把 "chatter" 和 "numbers" 写得不连贯。发布数据的方式是什么,以便对于每个图像,它会自动与其他数据配对?

换句话说,我需要以下代码中注释行的帮助:

import rosbag
import cv2
from std_msgs.msg import Int32, String
from sensor_msgs.msg import Image


bag = rosbag.Bag('test.bag', 'w')
for data in data_list: 
    (imname, timestamp, speed) = data
    ts_str = String()
    ts_str.data = timestamp

    s = Float32()
    s.data = speed

    image = cv2.imread(imname)

    # convert cv2 image to rosbag format
    # write image, ts_str and s to the rosbag jointly

bag.close()

许多标准消息类型,例如 sensor_msgs/Image or nav_msgs/Odometry have an attribute header,其中包含用于时间戳的属性 stamp

创建 bag 文件时,只需在 headers 属于一起的消息中设置相同的时间戳,然后将它们写入不同的主题:

from sensor_msgs.msg import Image
from nav_msgs.msg import Odometry

...

img_msg = Image()
odo_msg = Odometry()
img_msg.header.stamp = timestamp
odo_msg.header.stamp = timestamp

# set other values of messages...

bag.write("image", img_msg)
bag.write("odometry", odo_msg)

稍后订阅消息时,您可以根据时间戳匹配来自不同主题的消息。

根据图像和里程计的精确同步对您的应用程序的重要性,仅使用您在每个主题上收到的最后一条消息并假设它们适合在一起就足够了。 如果您需要更精确的东西,有一个 message_filter 负责同步两个主题并在一个回调中同时提供两个主题的消息。