0
$\begingroup$

Rosanswers logo

TL;DR: How can write a node that subscribes to topics under customized messages that's published from a bag when I don't have access to the definition of the customized messages (the .msg files)?

I have a bag file containing topics in customized messages, for example dbw_mkz_msgs/SteeringReport. While I don't have access to the dbw_mkz_msgs or the definition of dbw_mkz_msgs/SteeringReport, I can use tools such as rqt_bag or rostopic echo -b to view them (their fields and values to be more specific). I can even use the rosbag python api to edit them and write to another bag.

However, what I cannot do is write a node that subscribes to one of these topics in dbw_mkz_msgs/SteeringReport since I cannot from dbw_mkz_msgs.msgs import SteeringReport. Is there a way to extract the definition of a customized message from a bag file?


Originally posted by shihyuan on ROS Answers with karma: 43 on 2016-03-24

Post score: 4


Original comments

Comment by ahendrix on 2016-03-25:
In python, have a look at the get_type_and_topic_info() function on the bag, http://wiki.ros.org/rosbag/Cookbook#Get_lists_of_topics_and_types_from_a_bag and http://docs.ros.org/jade/api/rosbag/html/python/

Comment by shihyuan on 2016-03-25:
Thanks for you response, @ahendrix. However, it seems like get_type_and_topic_info() will give me the type of the message (a string dbw_mkz_msg/SteeringReport), and its md5hash. It still doesn't give me the SteeringReport() class that I would get if I had access to the dbw_mkz_msgs package.

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

So, the full message definitions are captured in the bag file, but there doesn't appear to be a direct API for extracting them.

This kind of does the trick:

#!/usr/bin/env python

import rosbag
import sys

types = {}

for bagname in sys.argv[1:]:
    bag = rosbag.Bag(bagname)
    for topic, msg, t in bag.read_messages():
        if not msg._type in types:
            types[msg._type] = msg._full_text


for t in types:
    print "Message type:", t
    print "Message text:"
    print types[t]
    print

Originally posted by ahendrix with karma: 47576 on 2016-03-25

This answer was ACCEPTED on the original site

Post score: 4


Original comments

Comment by shihyuan on 2016-03-30:
Awesome! With the definition I can recreate a mock dbw_mkz_msgs pkg! Thanks a lot.

Comment by vschmidt on 2021-09-21:
This should totally be in the ros_bag utility. Awesome!

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.