我有一组带有元数据的图像,包括数据集中的时间戳和里程计数据。我想把这个时间序列的图像转换成一个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()
对于图像,数据类型不同,但过程相同。然而,当我有应该相互关联的数据时,例如,每个图像都应该与时间戳和里程计记录配对。这个示例代码似乎把"聊天"one_answers"数字"写得不连贯。发布数据的方式是什么,以便每个图像都能自动与其他数据配对?
换句话说,我需要以下代码中注释行的帮助:
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或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)
稍后在订阅消息时,您可以根据消息的时间戳匹配来自不同主题的消息。
根据图像和里程计的精确同步对您的应用程序有多重要,只使用您收到的关于每个主题的最后一条消息并假设它们适合在一起就足够了。如果您需要更精确的消息,有一个message_filter负责同步两个主题,并在一个回调中同时提供两个主题的消息。