2016-08-01 67 views
1

我有一組包含元數據的圖像,包括來自數據集的時間戳和odometry數據。我想將這個時間序列的圖像轉換成一個rosbag,這樣我就可以輕鬆地將它插入我將寫入的代碼中,並在測試後實時切換數據。在本教程中,編程數據保存到rosbag過程似乎工作,如:(Python)將圖像時間序列轉換爲ROS包

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

許多標準的消息類型,如sensor_msgs/Imagenav_msgs/Odometry的有一個包含其目的是要屬性stamp屬性header用於時間戳。

在創建包文件,只需將相同的時間戳屬於一個整體郵件的標題,然後寫他們分開主題:

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,它負責同步兩個主題並在一個回調中提供兩個主題的消息。

+0

請問語法則是: H = std_msgs.msg.Header() s.Header = H bag.write( '速度',S) 我不熟悉的編程方式張貼到rosbag,所以發佈了幾個具有相同名稱的消息(就像在我寫的那個循環中)好嗎? 此外,將numpy數組(或opencv圖像)轉換爲sensor_msg.Image的語法是什麼?找不到合適的Python語法。 –

+0

@HalT我添加了一個如何設置消息時間戳的例子(不需要創建一個單獨的Header對象)。要將OpenCV圖像轉換爲ROS消息,請參閱[ROS維基的cv_bridge](http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython)。 – luator