我有一组包含元数据的图像,包括数据集中的时间戳和里程数据。我想把这个时间序列的图像转换成一个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()
答案 0 :(得分:1)
许多标准邮件类型(如sensor_msgs/Image或nav_msgs/Odometry)都有一个属性header
,其中包含一个属性stamp
,用于表示时间戳。
创建包文件时,只需在属于一起的邮件的标题中设置相同的时间戳,然后将它们写入不同的主题:
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)
稍后订阅邮件时,您可以根据时间戳匹配来自不同主题的邮件。
根据图像和odometry的精确同步对于您的应用程序的重要程度,仅使用您在每个主题上获得的最后一条消息并假设它们组合在一起就足够了。 如果你需要更精确的东西,有一个message_filter负责同步两个主题,并在一个回调中提供两个主题的消息。