@@ -47,24 +47,43 @@ void signalHandler(int signum)
47
47
exit (signum);
48
48
}
49
49
50
- void update_msg_stats (diagnostic_msgs::DiagnosticStatus &stat,
51
- std::string stat_name,
52
- std::chrono::duration<double > min_stat,
53
- std::chrono::duration<double > max_stat,
54
- std::chrono::duration<double > total_stat,
55
- long num_loops)
50
+ struct msgStats {
51
+ std::chrono::duration<double > min_stat;
52
+ std::chrono::duration<double > max_stat;
53
+ std::chrono::duration<double > total_stat;
54
+ };
55
+
56
+ void reset_msg_stats (msgStats &stats)
57
+ {
58
+ stats.min_stat = std::chrono::duration<double >::zero ();
59
+ stats.max_stat = std::chrono::duration<double >::zero ();
60
+ stats.total_stat = std::chrono::duration<double >::zero ();
61
+ }
62
+
63
+ void update_msg_stats (std::chrono::duration<double > stat_elapsed,
64
+ msgStats &stats)
65
+ {
66
+ if (stats.min_stat == std::chrono::duration<double >::zero () || stat_elapsed < stats.min_stat ) stats.min_stat = stat_elapsed;
67
+ if (stats.max_stat == std::chrono::duration<double >::zero () || stat_elapsed > stats.max_stat ) stats.max_stat = stat_elapsed;
68
+ stats.total_stat += stat_elapsed;
69
+ }
70
+
71
+ void push_msg_stats (diagnostic_msgs::DiagnosticStatus &stat,
72
+ std::string stat_name,
73
+ msgStats msg_stats,
74
+ long num_loops)
56
75
{
57
76
diagnostic_msgs::KeyValue min_stat_kv;
58
77
min_stat_kv.key = " min " + stat_name + " (s)" ;
59
- min_stat_kv.value = std::to_string (min_stat.count ());
78
+ min_stat_kv.value = std::to_string (msg_stats. min_stat .count ());
60
79
stat.values .push_back (min_stat_kv);
61
80
diagnostic_msgs::KeyValue max_stat_kv;
62
81
max_stat_kv.key = " max " + stat_name + " (s)" ;
63
- max_stat_kv.value = std::to_string (max_stat.count ());
82
+ max_stat_kv.value = std::to_string (msg_stats. max_stat .count ());
64
83
stat.values .push_back (max_stat_kv);
65
84
diagnostic_msgs::KeyValue avg_stat_kv;
66
85
avg_stat_kv.key = " avg " + stat_name + " (s)" ;
67
- avg_stat_kv.value = std::to_string (total_stat.count () / num_loops);
86
+ avg_stat_kv.value = std::to_string (msg_stats. total_stat .count () / num_loops);
68
87
stat.values .push_back (avg_stat_kv);
69
88
}
70
89
@@ -160,15 +179,29 @@ int main(int argc, char** argv)
160
179
ros::Duration max_period = ros::Duration (0 );
161
180
ros::Duration period_totals = ros::Duration (0 );
162
181
163
- std::chrono::duration<double > min_read = std::chrono::duration<double >::zero ();
164
- std::chrono::duration<double > max_read = std::chrono::duration<double >::zero ();
165
- std::chrono::duration<double > read_totals = std::chrono::duration<double >::zero ();
166
- std::chrono::duration<double > min_cm_update = std::chrono::duration<double >::zero ();
167
- std::chrono::duration<double > max_cm_update = std::chrono::duration<double >::zero ();
168
- std::chrono::duration<double > cm_update_totals = std::chrono::duration<double >::zero ();
169
- std::chrono::duration<double > min_write = std::chrono::duration<double >::zero ();
170
- std::chrono::duration<double > max_write = std::chrono::duration<double >::zero ();
171
- std::chrono::duration<double > write_totals = std::chrono::duration<double >::zero ();
182
+ msgStats read_stats;
183
+ reset_msg_stats (read_stats);
184
+ msgStats cm_update_stats;
185
+ reset_msg_stats (cm_update_stats);
186
+ msgStats write_stats;
187
+ reset_msg_stats (write_stats);
188
+
189
+ // sub-stats of the read method
190
+ msgStats get_data_stats;
191
+ reset_msg_stats (get_data_stats);
192
+ msgStats read_data_stats;
193
+ reset_msg_stats (read_data_stats);
194
+ msgStats pub_io_stats;
195
+ reset_msg_stats (pub_io_stats);
196
+ msgStats pub_tool_stats;
197
+ reset_msg_stats (pub_tool_stats);
198
+ msgStats pub_pose_stats;
199
+ reset_msg_stats (pub_pose_stats);
200
+ msgStats pub_robot_stats;
201
+ reset_msg_stats (pub_robot_stats);
202
+ msgStats pub_temp_stats;
203
+ reset_msg_stats (pub_temp_stats);
204
+
172
205
long debug_loops = 0 ;
173
206
174
207
// Debug timing printout every 5 seconds
@@ -182,9 +215,16 @@ int main(int argc, char** argv)
182
215
const std::chrono::steady_clock::time_point read_start = std::chrono::steady_clock::now ();
183
216
g_hw_interface->read (timestamp, period);
184
217
const std::chrono::duration<double > read_elapsed = std::chrono::steady_clock::now () - read_start;
185
- if (min_read == std::chrono::duration<double >::zero () || read_elapsed < min_read) min_read = read_elapsed;
186
- if (max_read == std::chrono::duration<double >::zero () || read_elapsed > max_read) max_read = read_elapsed;
187
- read_totals += read_elapsed;
218
+ update_msg_stats (read_elapsed, read_stats);
219
+ ur_driver::HardwareInterface::readStats read_substats = g_hw_interface->get_read_stats ();
220
+ update_msg_stats (read_substats.get_data_elapsed , get_data_stats);
221
+ update_msg_stats (read_substats.read_data_elapsed , read_data_stats);
222
+ update_msg_stats (read_substats.pub_io_elapsed , pub_io_stats);
223
+ update_msg_stats (read_substats.pub_tool_elapsed , pub_tool_stats);
224
+ update_msg_stats (read_substats.pub_pose_elapsed , pub_pose_stats);
225
+ update_msg_stats (read_substats.pub_robot_elapsed , pub_robot_stats);
226
+ update_msg_stats (read_substats.pub_temp_elapsed , pub_temp_stats);
227
+
188
228
189
229
// Get current time and elapsed time since last read
190
230
timestamp = ros::Time::now ();
@@ -195,19 +235,12 @@ int main(int argc, char** argv)
195
235
const std::chrono::steady_clock::time_point cm_update_start = std::chrono::steady_clock::now ();
196
236
cm.update (timestamp, period, g_hw_interface->shouldResetControllers ());
197
237
const std::chrono::duration<double > cm_update_elapsed = std::chrono::steady_clock::now () - cm_update_start;
198
- if (min_cm_update == std::chrono::duration<double >::zero () || cm_update_elapsed < min_cm_update) min_cm_update = cm_update_elapsed;
199
- if (max_cm_update == std::chrono::duration<double >::zero () || cm_update_elapsed > max_cm_update) max_cm_update = cm_update_elapsed;
200
- cm_update_totals += cm_update_elapsed;
238
+ update_msg_stats (cm_update_elapsed, cm_update_stats);
201
239
202
240
const std::chrono::steady_clock::time_point write_start = std::chrono::steady_clock::now ();
203
241
g_hw_interface->write (timestamp, period);
204
242
const std::chrono::duration<double > write_elapsed = std::chrono::steady_clock::now () - write_start;
205
- if (min_write == std::chrono::duration<double >::zero () || write_elapsed < min_write) min_write = write_elapsed;
206
- if (max_write == std::chrono::duration<double >::zero () || write_elapsed > max_write) max_write = write_elapsed;
207
- write_totals += write_elapsed;
208
-
209
-
210
-
243
+ update_msg_stats (write_elapsed, write_stats);
211
244
212
245
if (min_period.isZero () || period < min_period) min_period = period;
213
246
if (max_period.isZero () || period > max_period) max_period = period;
@@ -246,74 +279,33 @@ int main(int argc, char** argv)
246
279
avg_period_kv.value = std::to_string (period_totals.toSec () / debug_loops);
247
280
robot_status.values .push_back (avg_period_kv);
248
281
249
-
250
-
251
- update_msg_stats (robot_status, " read" , min_read, max_read, read_totals, debug_loops);
252
- update_msg_stats (robot_status, " cm_update" , min_cm_update, max_cm_update, cm_update_totals, debug_loops);
253
- update_msg_stats (robot_status, " write" , min_write, max_write, write_totals, debug_loops);
254
-
255
- // diagnostic_msgs::KeyValue min_read_kv;
256
- // min_read_kv.key = "min read (s)";
257
- // min_read_kv.value = std::to_string(min_read.count());
258
- // robot_status.values.push_back(min_read_kv);
259
- // diagnostic_msgs::KeyValue max_read_kv;
260
- // max_read_kv.key = "max read (s)";
261
- // max_read_kv.value = std::to_string(max_read.count());
262
- // robot_status.values.push_back(max_read_kv);
263
- // diagnostic_msgs::KeyValue avg_read_kv;
264
- // avg_read_kv.key = "avg read (s)";
265
- // avg_read_kv.value = std::to_string(read_totals.count() / debug_loops);
266
- // robot_status.values.push_back(avg_read_kv);
267
-
268
- // diagnostic_msgs::KeyValue min_cm_update_kv;
269
- // min_cm_update_kv.key = "min cm_update (s)";
270
- // min_cm_update_kv.value = std::to_string(min_cm_update.count());
271
- // robot_status.values.push_back(min_cm_update_kv);
272
- // diagnostic_msgs::KeyValue max_cm_update_kv;
273
- // max_cm_update_kv.key = "max cm_update (s)";
274
- // max_cm_update_kv.value = std::to_string(max_cm_update.count());
275
- // robot_status.values.push_back(max_cm_update_kv);
276
- // diagnostic_msgs::KeyValue avg_cm_update_kv;
277
- // avg_cm_update_kv.key = "avg cm_update (s)";
278
- // avg_cm_update_kv.value = std::to_string(cm_update_totals.count() / debug_loops);
279
- // robot_status.values.push_back(avg_cm_update_kv);
280
-
281
- // diagnostic_msgs::KeyValue min_write_kv;
282
- // min_write_kv.key = "min write (s)";
283
- // min_write_kv.value = std::to_string(min_write.count());
284
- // robot_status.values.push_back(min_write_kv);
285
- // diagnostic_msgs::KeyValue max_write_kv;
286
- // max_write_kv.key = "max write (s)";
287
- // max_write_kv.value = std::to_string(max_write.count());
288
- // robot_status.values.push_back(max_write_kv);
289
- // diagnostic_msgs::KeyValue avg_write_kv;
290
- // avg_write_kv.key = "avg write (s)";
291
- // avg_write_kv.value = std::to_string(write_totals.count() / debug_loops);
292
- // robot_status.values.push_back(avg_write_kv);
282
+ push_msg_stats (robot_status, " read" , read_stats, debug_loops);
283
+ push_msg_stats (robot_status, " cm_update" , cm_update_stats, debug_loops);
284
+ push_msg_stats (robot_status, " write" , write_stats, debug_loops);
285
+ push_msg_stats (robot_status, " read: get_data" , get_data_stats, debug_loops);
286
+ push_msg_stats (robot_status, " read: read_data" , read_data_stats, debug_loops);
287
+ push_msg_stats (robot_status, " read: pub_io" , pub_io_stats, debug_loops);
288
+ push_msg_stats (robot_status, " read: pub_tool" , pub_tool_stats, debug_loops);
289
+ push_msg_stats (robot_status, " read: pub_pose" , pub_pose_stats, debug_loops);
290
+ push_msg_stats (robot_status, " read: pub_robot" , pub_robot_stats, debug_loops);
291
+ push_msg_stats (robot_status, " read: pub_temp" , pub_temp_stats, debug_loops);
293
292
294
293
dia_array.status .push_back (robot_status);
295
294
diagnostic_pub.publish (dia_array);
296
295
297
-
298
- // ROS_INFO_STREAM(
299
- // "Loop durations last " << total_elapsed.count() << "s: "
300
- // "min=" << min_period.toSec() * 1000.0 << "ms, "
301
- // "max=" << max_period.toSec() * 1000.0 << "ms, "
302
- // "avg=" << period_totals.toSec() * 1000.0 / debug_loops << "ms, "
303
- // "avgchrono=" << total_elapsed.count() * 1000.0 / debug_loops << "ms"
304
- // );
305
296
min_period = ros::Duration (0 );
306
297
max_period = ros::Duration (0 );
307
298
period_totals = ros::Duration (0 );
308
- min_read = std::chrono::duration<double >::zero ();
309
- max_read = std::chrono::duration<double >::zero ();
310
- read_totals = std::chrono::duration<double >::zero ();
311
- min_cm_update = std::chrono::duration<double >::zero ();
312
- max_cm_update = std::chrono::duration<double >::zero ();
313
- cm_update_totals = std::chrono::duration<double >::zero ();
314
- min_write = std::chrono::duration<double >::zero ();
315
- max_write = std::chrono::duration<double >::zero ();
316
- write_totals = std::chrono::duration<double >::zero ();
299
+ reset_msg_stats (read_stats);
300
+ reset_msg_stats (cm_update_stats);
301
+ reset_msg_stats (write_stats);
302
+ reset_msg_stats (get_data_stats);
303
+ reset_msg_stats (read_data_stats);
304
+ reset_msg_stats (pub_io_stats);
305
+ reset_msg_stats (pub_tool_stats);
306
+ reset_msg_stats (pub_pose_stats);
307
+ reset_msg_stats (pub_robot_stats);
308
+ reset_msg_stats (pub_temp_stats);
317
309
debug_loops = 0 ;
318
310
debug_timing_start = debug_timing_now;
319
311
}
0 commit comments