'Display sub-fields of a ROS message

For a given ros message, is there any way I can get the sub-fields of the ros-message. I'm reading the messages from a rosbag file using a python script,

"for topic, msg, t in bag.read_messages(): "

now given the topic and the message, can I display the sub-fields of the message.

eg: The nav/Odometry.msg has the sub-fields : "header", "child_frame_id", "pose" and "twist". (Reference link)

Is there a command that gives back the sub-fields as the output? .. if I don't know sub-fields beforehand

Thanks



Solution 1:[1]

here's a simple python node (based on this) that does exactly what you are asking for :

#!/usr/bin/env python
import rospy
from nav_msgs.msg import Odometry 

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.header)
    rospy.loginfo(rospy.get_caller_id() + "child_frame_id %s", data.child_frame_id)
    rospy.loginfo(rospy.get_caller_id() + "pose %s", data.pose)
    rospy.loginfo(rospy.get_caller_id() + "twist %s", data.twist)

def listener():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # node are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber("odom_topic", Odometry, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()

Solution 2:[2]

Though this is a bit older question, I am facing a similar problem. What I do is list all the attributes in msg, and perform some post-processing to that list.

for topic, msg, t in bag.read_messages(topics=list(topic_dict.keys())):
    attributes = dir(msg)
    # attributes post-processing

Or you can check if the desired attribute is in the msg using hasattr()

if hasattr(msg, 'attribute'):
    msg.attribute

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vtik
Solution 2 DharmanBot