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

3
我有一组包含时间戳和里程数据的带元数据的图像数据集。我想将这些图像的时间序列转换为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()

对于图像,数据类型不同但过程相同。然而,当我有数据应该彼此关联时,例如每个图像应该与时间戳和里程记录配对。这个示例代码似乎是分别写入“闲聊”和“数字”的。有什么方法可以发布数据,使得每个图像都自动与其他数据配对?
换句话说,我需要帮助以下代码中的注释行:
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()
1个回答

1
许多标准消息类型,如sensor_msgs/Imagenav_msgs/Odometry,都有一个属性header,其中包含一个属性stamp,用于时间戳。
创建bag文件时,只需在属于同一组的消息的标题中设置相同的时间戳,然后将它们写入不同的主题即可。
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可以处理同步两个主题并在一个回调中提供两个主题的消息。


那么语法是这样的吗: h = std_msgs.msg.Header() s.Header = h bag.write('speed',s) 我不熟悉以编程方式发布到rosbag,因此使用相同名称(如我编写的循环中)发布多个消息是否可以?另外,将numpy数组(或opencv图像)转换为sensor_msg.Image的语法是什么? 找不到适当的Python语法。 - Hal T
@HalT 我添加了一个示例,说明如何将时间戳设置为消息(无需创建单独的Header对象)。有关将OpenCV图像转换为ROS消息,请参阅cv_bridge的ROS wiki - luator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接