@@ -47,24 +47,43 @@ void signalHandler(int signum)
4747 exit (signum);
4848}
4949
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)
5675{
5776 diagnostic_msgs::KeyValue min_stat_kv;
5877 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 ());
6079 stat.values .push_back (min_stat_kv);
6180 diagnostic_msgs::KeyValue max_stat_kv;
6281 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 ());
6483 stat.values .push_back (max_stat_kv);
6584 diagnostic_msgs::KeyValue avg_stat_kv;
6685 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);
6887 stat.values .push_back (avg_stat_kv);
6988}
7089
@@ -160,15 +179,29 @@ int main(int argc, char** argv)
160179 ros::Duration max_period = ros::Duration (0 );
161180 ros::Duration period_totals = ros::Duration (0 );
162181
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+
172205 long debug_loops = 0 ;
173206
174207 // Debug timing printout every 5 seconds
@@ -182,9 +215,16 @@ int main(int argc, char** argv)
182215 const std::chrono::steady_clock::time_point read_start = std::chrono::steady_clock::now ();
183216 g_hw_interface->read (timestamp, period);
184217 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+
188228
189229 // Get current time and elapsed time since last read
190230 timestamp = ros::Time::now ();
@@ -195,19 +235,12 @@ int main(int argc, char** argv)
195235 const std::chrono::steady_clock::time_point cm_update_start = std::chrono::steady_clock::now ();
196236 cm.update (timestamp, period, g_hw_interface->shouldResetControllers ());
197237 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);
201239
202240 const std::chrono::steady_clock::time_point write_start = std::chrono::steady_clock::now ();
203241 g_hw_interface->write (timestamp, period);
204242 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);
211244
212245 if (min_period.isZero () || period < min_period) min_period = period;
213246 if (max_period.isZero () || period > max_period) max_period = period;
@@ -246,74 +279,33 @@ int main(int argc, char** argv)
246279 avg_period_kv.value = std::to_string (period_totals.toSec () / debug_loops);
247280 robot_status.values .push_back (avg_period_kv);
248281
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);
293292
294293 dia_array.status .push_back (robot_status);
295294 diagnostic_pub.publish (dia_array);
296295
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- // );
305296 min_period = ros::Duration (0 );
306297 max_period = ros::Duration (0 );
307298 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);
317309 debug_loops = 0 ;
318310 debug_timing_start = debug_timing_now;
319311 }
0 commit comments