Skip to content

Commit 5eb396b

Browse files
committed
refactor. add substats for read
1 parent dc5d6a4 commit 5eb396b

File tree

3 files changed

+125
-92
lines changed

3 files changed

+125
-92
lines changed

ur_robot_driver/include/ur_robot_driver/ros/hardware_interface.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,18 @@ class HardwareInterface : public hardware_interface::RobotHW
157157
*/
158158
bool shouldResetControllers();
159159

160+
struct readStats {
161+
std::chrono::duration<double> get_data_elapsed;
162+
std::chrono::duration<double> read_data_elapsed;
163+
std::chrono::duration<double> pub_io_elapsed;
164+
std::chrono::duration<double> pub_tool_elapsed;
165+
std::chrono::duration<double> pub_pose_elapsed;
166+
std::chrono::duration<double> pub_robot_elapsed;
167+
std::chrono::duration<double> pub_temp_elapsed;
168+
};
169+
170+
readStats get_read_stats();
171+
160172
protected:
161173
/*!
162174
* \brief Transforms force-torque measurements reported from the robot from base to tool frame.
@@ -292,6 +304,8 @@ class HardwareInterface : public hardware_interface::RobotHW
292304

293305
std::string robot_ip_;
294306
std::string tf_prefix_;
307+
308+
readStats read_stats_;
295309
};
296310

297311
} // namespace ur_driver

ur_robot_driver/src/ros/hardware_interface.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,10 +438,21 @@ void HardwareInterface::read(const ros::Time& time, const ros::Duration& period)
438438
robot_status_resource_.in_motion = TriState::UNKNOWN;
439439
robot_status_resource_.in_error = TriState::UNKNOWN;
440440
robot_status_resource_.error_code = 0;
441-
441+
read_stats_.get_data_elapsed = std::chrono::duration<double>::zero();
442+
read_stats_.read_data_elapsed = std::chrono::duration<double>::zero();
443+
read_stats_.pub_io_elapsed = std::chrono::duration<double>::zero();
444+
read_stats_.pub_tool_elapsed = std::chrono::duration<double>::zero();
445+
read_stats_.pub_pose_elapsed = std::chrono::duration<double>::zero();
446+
read_stats_.pub_robot_elapsed = std::chrono::duration<double>::zero();
447+
read_stats_.pub_temp_elapsed = std::chrono::duration<double>::zero();
448+
449+
const std::chrono::steady_clock::time_point get_data_start = std::chrono::steady_clock::now();
442450
std::unique_ptr<rtde_interface::DataPackage> data_pkg = ur_driver_->getDataPackage();
451+
read_stats_.get_data_elapsed = std::chrono::steady_clock::now() - get_data_start;
452+
443453
if (data_pkg)
444454
{
455+
const std::chrono::steady_clock::time_point read_data_start = std::chrono::steady_clock::now();
445456
packet_read_ = true;
446457
readData(data_pkg, "actual_q", joint_positions_);
447458
readData(data_pkg, "actual_qd", joint_velocities_);
@@ -472,16 +483,27 @@ void HardwareInterface::read(const ros::Time& time, const ros::Duration& period)
472483
readData(data_pkg, "joint_temperatures", joint_temperatures_);
473484

474485
extractRobotStatus();
486+
read_stats_.read_data_elapsed = std::chrono::steady_clock::now() - read_data_start;
475487

488+
const std::chrono::steady_clock::time_point pub_io_start = std::chrono::steady_clock::now();
476489
publishIOData();
490+
read_stats_.pub_io_elapsed = std::chrono::steady_clock::now() - pub_io_start;
491+
const std::chrono::steady_clock::time_point pub_tool_start = std::chrono::steady_clock::now();
477492
publishToolData();
493+
read_stats_.pub_tool_elapsed = std::chrono::steady_clock::now() - pub_tool_start;
478494

495+
const std::chrono::steady_clock::time_point pub_pose_start = std::chrono::steady_clock::now();
479496
// Transform fts measurements to tool frame
480497
extractToolPose(time);
481498
transformForceTorque();
482499
publishPose();
500+
read_stats_.pub_pose_elapsed = std::chrono::steady_clock::now() - pub_pose_start;
501+
const std::chrono::steady_clock::time_point pub_robot_start = std::chrono::steady_clock::now();
483502
publishRobotAndSafetyMode();
503+
read_stats_.pub_robot_elapsed = std::chrono::steady_clock::now() - pub_robot_start;
504+
const std::chrono::steady_clock::time_point pub_temp_start = std::chrono::steady_clock::now();
484505
publishJointTemperatures(time);
506+
read_stats_.pub_temp_elapsed = std::chrono::steady_clock::now() - pub_temp_start;
485507

486508
// pausing state follows runtime state when pausing
487509
if (runtime_state_ == static_cast<uint32_t>(rtde_interface::RUNTIME_STATE::PAUSED))
@@ -687,6 +709,11 @@ bool HardwareInterface::shouldResetControllers()
687709
}
688710
}
689711

712+
HardwareInterface::readStats HardwareInterface::get_read_stats()
713+
{
714+
return read_stats_;
715+
}
716+
690717
void HardwareInterface::extractToolPose(const ros::Time& timestamp)
691718
{
692719
double tcp_angle = std::sqrt(std::pow(tcp_pose_[3], 2) + std::pow(tcp_pose_[4], 2) + std::pow(tcp_pose_[5], 2));

ur_robot_driver/src/ros/hardware_interface_node.cpp

Lines changed: 83 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)