mrp2_hardware.cpp
Go to the documentation of this file.
1 // ROS
2 #include <ros/ros.h>
3 
4 // ros_control
6 
8 
9 typedef boost::chrono::steady_clock time_source;
10 
11 static const double BILLION = 1000000000.0;
12 
13 int main(int argc, char **argv)
14 {
15 
16  // Settings
17  double cycle_time_error_threshold_ = 0.02;
18 
19  // Timing
20  ros::Timer non_realtime_loop_;
21  ros::Duration elapsed_time_;
22  double loop_hz_ = 50;
23  struct timespec last_time_;
24  struct timespec current_time_;
25  struct timespec read_time_, write_time_, update_time_;
26  ros::Duration elapsed_time_read_, elapsed_time_write_, elapsed_time_update_;
27 
28  ros::init(argc, argv, "mrp2_hardware");
29  ros::NodeHandle nh;
30 
31  MRP2HW robot;
32 
33 
34 
35  // Start timer
36  ros::Duration desired_update_freq_ = ros::Duration(1 / loop_hz_);
37 
39 
40  ros::Rate rate(loop_hz_);
42  spinner.start();
43 
44  // Get current time for use with first update
45  clock_gettime(CLOCK_MONOTONIC, &last_time_);
46 
47  while(ros::ok())
48  {
49 
50  clock_gettime(CLOCK_MONOTONIC, &current_time_);
51  elapsed_time_ =
52  ros::Duration(current_time_.tv_sec - last_time_.tv_sec + (current_time_.tv_nsec - last_time_.tv_nsec) / BILLION);
53 
54  elapsed_time_read_ = ros::Duration(read_time_.tv_sec - last_time_.tv_sec + (read_time_.tv_nsec - last_time_.tv_nsec) / BILLION);
55  elapsed_time_write_ = ros::Duration(write_time_.tv_sec - last_time_.tv_sec + (write_time_.tv_nsec - last_time_.tv_nsec) / BILLION);
56  elapsed_time_update_ = ros::Duration(update_time_.tv_sec - last_time_.tv_sec + (update_time_.tv_nsec - last_time_.tv_nsec) / BILLION);
57 
58  last_time_ = current_time_;
59  const double cycle_time_error = (elapsed_time_ - desired_update_freq_).toSec();
60  if (cycle_time_error > cycle_time_error_threshold_)
61  {
62  ROS_WARN_STREAM("Cycle time exceeded error threshold by: "
63  << cycle_time_error << ", cycle time: " << elapsed_time_
64  << ", threshold: " << cycle_time_error_threshold_ << ", read time: " << elapsed_time_read_
65  << ", update time: " << elapsed_time_update_
66  << ", write time: " << elapsed_time_write_);
67  }
68 
69  robot.read();
70  clock_gettime(CLOCK_MONOTONIC, &read_time_);
71  if(robot.estop_release)
72  {
73  cm.update(ros::Time::now(), elapsed_time_, true);
74  ROS_WARN_STREAM("E-stop is released.");
75  robot.estop_release = false;
76  }else{
77  cm.update(ros::Time::now(), elapsed_time_);
78  //ROS_WARN("robot time: %f", robot.getTime().toSec());
79  }
80  clock_gettime(CLOCK_MONOTONIC, &update_time_);
81  robot.write();
82  clock_gettime(CLOCK_MONOTONIC, &write_time_);
83  rate.sleep();
84  }
85  spinner.stop();
86 
87  return 0;
88 }
void read()
static const double BILLION
bool estop_release
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void spinner()
ROSCPP_DECL bool ok()
boost::chrono::steady_clock time_source
#define ROS_WARN_STREAM(args)
bool sleep()
static Time now()
void update(const ros::Time &time, const ros::Duration &period, bool reset_controllers=false)
int main(int argc, char **argv)
void write()


mrp2_hardware
Author(s): Akif Hacinecipoglu
autogenerated on Mon Feb 28 2022 22:53:03