00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 """
00034 Helper functions for bag files and timestamps.
00035 """
00036
00037 PKG = 'rxbag'
00038 import roslib; roslib.load_manifest(PKG)
00039
00040 import time
00041
00042 import rospy
00043
00044 def stamp_to_str(t):
00045 """
00046 Convert a rospy.Time to a human-readable string.
00047
00048 @param t: time to convert
00049 @type t: rospy.Time
00050 """
00051 t_sec = t.to_sec()
00052 if t < rospy.Time.from_sec(60 * 60 * 24 * 365 * 5):
00053
00054 return '%.3fs' % t_sec
00055 else:
00056 return time.strftime('%b %d %Y %H:%M:%S', time.localtime(t_sec)) + '.%03d' % (t.nsecs / 1000000)
00057
00058 def get_topics(bag):
00059 """
00060 Get an alphabetical list of all the unique topics in the bag.
00061
00062 @return: sorted list of topics
00063 @rtype: list of str
00064 """
00065 return sorted(set([c.topic for c in bag._get_connections()]))
00066
00067 def get_start_stamp(bag):
00068 """
00069 Get the earliest timestamp in the bag.
00070
00071 @param bag: bag file
00072 @type bag: rosbag.Bag
00073 @return: earliest timestamp
00074 @rtype: rospy.Time
00075 """
00076 start_stamp = None
00077 for connection_start_stamp in [index[0].time for index in bag._connection_indexes.values()]:
00078 if not start_stamp or connection_start_stamp < start_stamp:
00079 start_stamp = connection_start_stamp
00080 return start_stamp
00081
00082 def get_end_stamp(bag):
00083 """
00084 Get the latest timestamp in the bag.
00085
00086 @param bag: bag file
00087 @type bag: rosbag.Bag
00088 @return: latest timestamp
00089 @rtype: rospy.Time
00090 """
00091 end_stamp = None
00092 for connection_end_stamp in [index[-1].time for index in bag._connection_indexes.values()]:
00093 if not end_stamp or connection_end_stamp > end_stamp:
00094 end_stamp = connection_end_stamp
00095
00096 return end_stamp
00097
00098 def get_topics_by_datatype(bag):
00099 """
00100 Get all the message types in the bag and their associated topics.
00101
00102 @param bag: bag file
00103 @type bag: rosbag.Bag
00104 @return: mapping from message typename to list of topics
00105 @rtype: dict of str to list of str
00106 """
00107 topics_by_datatype = {}
00108 for c in bag._get_connections():
00109 topics_by_datatype.setdefault(c.datatype, []).append(c.topic)
00110
00111 return topics_by_datatype
00112
00113 def get_datatype(bag, topic):
00114 """
00115 Get the datatype of the given topic.
00116
00117 @param bag: bag file
00118 @type bag: rosbag.Bag
00119 @return: message typename
00120 @rtype: str
00121 """
00122 for c in bag._get_connections(topic):
00123 return c.datatype
00124
00125 return None