2016-08-01 1 views
1

У меня есть набор изображений с метаданными, включая временные метки и данные одометрия из набора данных. Я хочу преобразовать эти временные серии изображений в розовую сумку, поэтому я могу легко подключить ее к коду, который я буду писать, и переключать данные в реальном времени после тестирования. К учебник, процесс программно сохранения данных в 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/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, который заботится о синхронизации двух тем и предоставляет сообщения обеих тем вместе в одном обратном вызове.

+0

бы синтаксис тогда: ч = std_msgs.msg.Header() s.Header = ч bag.write ('Скорость', s) Я не знаком с программным размещения в rosbag, так отправляет несколько сообщений с тем же именем (например, в том цикле, который я написал) нормально? Кроме того, что является синтаксисом для преобразования массива numpy (или opencv-изображения) в датчик_msg.Image? Не удается найти соответствующий синтаксис Python. –

+0

@HalT Я добавил пример того, как установить метку времени для сообщений (нет необходимости создавать отдельный объект заголовка). Для преобразования изображений OpenCV в сообщения ROS см. [ROS wiki для cv_bridge] (http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython). – luator