2016-08-01 39 views
1

Ich habe eine Reihe von Bildern mit Metadaten einschließlich Zeitstempel und Odometriedaten aus einem Datensatz. Ich möchte diese Zeitreihe von Bildern in einen Rossbag umwandeln, damit ich es aus dem Code, den ich schreibe, herausstöpseln und nach dem Testen in Echtzeit umschalten kann. Durch das Tutorial, scheint der Prozess der programmatisch Daten zu einem rosbag Speicher wie zu arbeiten:(Python) Konvertieren von Bildzeitreihe in ROS-Tasche

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() 

Für Bilder, der Datentyp anders ist, aber das Verfahren ist das gleiche. Wenn ich jedoch Daten habe, die miteinander verknüpft werden sollen, z. Jedes Bild sollte mit einem Zeitstempel und einer Odometrie-Aufzeichnung gepaart werden. Dieser Beispielcode scheint "Chatter" und "Nummern" getrennt zu schreiben. Wie würden die Daten so veröffentlicht, dass sie für jedes Bild automatisch mit anderen Daten gepaart werden?

Mit anderen Worten, ich muß mit den kommentierten Zeilen im folgenden Code helfen:

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() 

Antwort

1

Viele der Standard-Nachrichtentypen wie sensor_msgs/Image oder nav_msgs/Odometry haben ein Attribut header das stamp ein Attribut enthält, das zu verstehen ist für Zeitstempel verwendet werden.

Wenn der Beutel-Datei zu erstellen, einfach den gleichen Zeitstempel in den Header der Nachrichten festgelegt, die zusammengehören und ihnen dann schreiben Themen zu trennen:

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) 

Später, wenn für die Nachrichten abonniert haben, können Sie Nachrichten anzeigen lassen aus den verschiedenen Themen basierend auf ihrem Zeitstempel.

Abhängig davon, wie wichtig die exakte Synchronisation von Bild und Odometrie für Ihre Anwendung ist, reicht es aus, die letzte Nachricht zu jedem Thema zu verwenden und anzunehmen, dass sie zusammenpassen. Falls Sie etwas genaueres benötigen, gibt es eine message_filter, die sich um die Synchronisierung von zwei Themen kümmert und die Nachrichten beider Themen zusammen in einem Callback bereitstellt.

+0

Würde die Syntax dann: h = std_msgs.msg.Header() s.Header = h bag.write ('Geschwindigkeit', s) ich bin nicht vertraut mit zu einem rosbag programmatisch veröffentlichen, so schreibt mehrere Nachrichten mit dem gleichen Namen (wie in der Schleife, die ich geschrieben habe) ok? Auch, was ist die Syntax für die Umwandlung eines numpy Array (oder opencv Bild) in ein sensor_msg.Image? Kann die passende Python-Syntax nicht finden. –

+0

@HalT Ich habe ein Beispiel hinzugefügt, wie der Zeitstempel für die Nachrichten festgelegt wird (es muss kein separates Header-Objekt erstellt werden). Informationen zum Konvertieren von OpenCV-Bildern in ROS-Nachrichten finden Sie im [ROS-Wiki für cv_bridge] (http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython). – luator