13 from tf2_msgs.srv
import FrameGraph
21 rospy.wait_for_service(
"~tf2_frames")
22 self.
get_frames = rospy.ServiceProxy(
"~tf2_frames", FrameGraph)
26 while len(self.
graph) == 0:
28 if trial_count > 1200:
31 except Exception
as e:
32 rospy.logerr_throttle(
33 60.0,
'Failed to get graph: {}'.format(e))
35 trial_count = trial_count + 1
37 host = rospy.get_param(
'~host',
'localhost')
38 port = rospy.get_param(
'~port', 8086)
39 database = rospy.get_param(
'~database',
'test')
40 self.
client = influxdb.InfluxDBClient(
41 host=host, port=port, database=database)
42 self.
client.create_database(database)
44 self.
lock = threading.Lock()
52 self.
duration = rospy.get_param(
'~duration', 3.0)
56 graph_duration = rospy.get_param(
'~graph_duration', 60.0)
58 rospy.Duration(graph_duration), self.
_graph_cb)
65 timestamp = event.current_real
77 graph = copy.deepcopy(self.
graph)
79 for child_frame_id, _
in graph.items():
81 transform_stamped = self.
tf_buffer.lookup_transform(
82 self.frame_id, child_frame_id, rospy.Time(0))
83 except tf2_ros.ExtrapolationException
as e:
84 rospy.logerr_throttle(
85 60.0,
'tf2_ros.ExtrapolationException: {}'.format(e))
87 except tf2_ros.ConnectivityException
as e:
88 rospy.logerr_throttle(
89 60.0,
'tf2_ros.ConnectivityException: {}'.format(e))
91 except tf2_ros.LookupException
as e:
92 rospy.logerr_throttle(
93 60.0,
'tf2_ros.LookupException: {}'.format(e))
95 translation = transform_stamped.transform.translation
96 rotation = transform_stamped.transform.rotation
97 theta = 2 * np.arctan(
99 [rotation.x, rotation.y, rotation.z]) / rotation.w)
101 trans_x_fields[child_frame_id] = translation.x
102 trans_y_fields[child_frame_id] = translation.y
103 trans_z_fields[child_frame_id] = translation.z
104 rot_x_fields[child_frame_id] = rotation.x
105 rot_y_fields[child_frame_id] = rotation.y
106 rot_z_fields[child_frame_id] = rotation.z
107 rot_w_fields[child_frame_id] = rotation.w
108 rot_theta_fields[child_frame_id] = theta
111 if len(trans_x_fields) > 0:
113 "measurement": self.measurement_name,
115 "type":
"translation",
117 "frame_id": self.frame_id
120 "fields": trans_x_fields
123 if len(trans_y_fields) > 0:
125 "measurement": self.measurement_name,
127 "type":
"translation",
129 "frame_id": self.frame_id
132 "fields": trans_y_fields
135 if len(trans_z_fields) > 0:
137 "measurement": self.measurement_name,
139 "type":
"translation",
141 "frame_id": self.frame_id
144 "fields": trans_z_fields
147 if len(rot_x_fields) > 0:
149 "measurement": self.measurement_name,
153 "frame_id": self.frame_id
156 "fields": rot_x_fields
159 if len(rot_y_fields) > 0:
161 "measurement": self.measurement_name,
165 "frame_id": self.frame_id
168 "fields": rot_y_fields
171 if len(rot_z_fields) > 0:
173 "measurement": self.measurement_name,
177 "frame_id": self.frame_id
180 "fields": rot_z_fields
183 if len(rot_w_fields) > 0:
185 "measurement": self.measurement_name,
189 "frame_id": self.frame_id
192 "fields": rot_w_fields
195 if len(rot_theta_fields) > 0:
197 "measurement": self.measurement_name,
201 "frame_id": self.frame_id
204 "fields": rot_theta_fields
208 start_time = time.time() * 1000
210 if len(self.
query) == 0:
212 query = copy.deepcopy(self.
query)
214 end_time = time.time() * 1000
215 rospy.logdebug(
"copy time: {}ms".format(end_time - start_time))
216 rospy.logdebug(
"data length: {}".format(len(query)))
218 self.
client.write_points(query, time_precision=
'ms')
219 except influxdb.exceptions.InfluxDBServerError
as e:
220 rospy.logerr(
"InfluxDB error: {}".format(e))
221 end_time = time.time() * 1000
222 rospy.logdebug(
"timer cb time: {}ms".format(end_time - start_time))
223 if ((end_time - start_time) > (self.
duration * 1000)):
224 rospy.logerr(
"timer cb time exceeds: {} > {}".format(
225 end_time - start_time, self.
duration * 1000))
230 graph = yaml.load(self.
get_frames().frame_yaml)
231 except Exception
as e:
def timestamp_to_influxdb_time(timestamp)