Go to the documentation of this file.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 import math
00038 import time
00039 import rospy
00040
00041 def stamp_to_str(t):
00042 """
00043 Convert a rospy.Time to a human-readable string.
00044
00045 @param t: time to convert
00046 @type t: rospy.Time
00047 """
00048 t_sec = t.to_sec()
00049 if t < rospy.Time.from_sec(60 * 60 * 24 * 365 * 5):
00050
00051 return '%.3fs' % t_sec
00052 else:
00053 return time.strftime('%b %d %Y %H:%M:%S', time.localtime(t_sec)) + '.%03d' % (t.nsecs / 1000000)
00054
00055
00056 def get_topics(bag):
00057 """
00058 Get an alphabetical list of all the unique topics in the bag.
00059
00060 @return: sorted list of topics
00061 @rtype: list of str
00062 """
00063 return sorted(set([c.topic for c in bag._get_connections()]))
00064
00065
00066 def get_start_stamp(bag):
00067 """
00068 Get the earliest timestamp in the bag.
00069
00070 @param bag: bag file
00071 @type bag: rosbag.Bag
00072 @return: earliest timestamp
00073 @rtype: rospy.Time
00074 """
00075 start_stamp = None
00076 for connection_start_stamp in [index[0].time for index in bag._connection_indexes.values()]:
00077 if not start_stamp or connection_start_stamp < start_stamp:
00078 start_stamp = connection_start_stamp
00079 return start_stamp
00080
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
00099 def get_topics_by_datatype(bag):
00100 """
00101 Get all the message types in the bag and their associated topics.
00102
00103 @param bag: bag file
00104 @type bag: rosbag.Bag
00105 @return: mapping from message typename to list of topics
00106 @rtype: dict of str to list of str
00107 """
00108 topics_by_datatype = {}
00109 for c in bag._get_connections():
00110 topics_by_datatype.setdefault(c.datatype, []).append(c.topic)
00111
00112 return topics_by_datatype
00113
00114
00115 def get_datatype(bag, topic):
00116 """
00117 Get the datatype of the given topic.
00118
00119 @param bag: bag file
00120 @type bag: rosbag.Bag
00121 @return: message typename
00122 @rtype: str
00123 """
00124 for c in bag._get_connections(topic):
00125 return c.datatype
00126
00127 return None
00128
00129
00130 def filesize_to_str(size):
00131 size_name = ('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB')
00132 i = int(math.floor(math.log(size, 1024)))
00133 p = math.pow(1024, i)
00134 s = round(size / p, 2)
00135 if s > 0:
00136 return '%s %s' % (s, size_name[i])
00137 return '0 B'