From 770b4d3ee4e49bdd5a419e62da988201b024834b Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Thu, 24 Oct 2019 14:38:06 +0200
Subject: [PATCH] Use ros::Rate and ROS logs.

---
 src/geometric_simu.cpp | 10 +++++--
 src/sot_loader.cpp     | 60 +++++++++++++++++++++++++-----------------
 2 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/src/geometric_simu.cpp b/src/geometric_simu.cpp
index 4d91369..e0122f8 100644
--- a/src/geometric_simu.cpp
+++ b/src/geometric_simu.cpp
@@ -16,15 +16,21 @@
  * have received a copy of the GNU Lesser General Public License along
  * with dynamic_graph_bridge.  If not, see <http://www.gnu.org/licenses/>.
  */
-#include <iostream>
+#include <ros/console.h>
 
 #define ENABLE_RT_LOG
 #include <dynamic-graph/real-time-logger.h>
 
 #include <dynamic_graph_bridge/sot_loader.hh>
 
+class LoggerROSStream : public ::dynamicgraph::LoggerStream {
+public:
+  void write(const char *c) { ROS_ERROR(c); }
+};
+
 int main(int argc, char *argv[]) {
-  dgADD_OSTREAM_TO_RTLOG(std::cerr);
+  ::dynamicgraph::RealTimeLogger::instance()
+    .addOutputStream(::dynamicgraph::LoggerStreamPtr_t(new LoggerROSStream()));
 
   ros::init(argc, argv, "sot_ros_encapsulator");
   SotLoader aSotLoader;
diff --git a/src/sot_loader.cpp b/src/sot_loader.cpp
index f67a80d..422d233 100644
--- a/src/sot_loader.cpp
+++ b/src/sot_loader.cpp
@@ -20,6 +20,7 @@
 /* --- INCLUDES ------------------------------------------------------------- */
 /* -------------------------------------------------------------------------- */
 
+#include <ros/rate.h>
 #include <dynamic_graph_bridge/sot_loader.hh>
 #include "dynamic_graph_bridge/ros_init.hh"
 
@@ -36,15 +37,27 @@ namespace po = boost::program_options;
 
 struct DataToLog {
   const std::size_t N;
-  std::size_t idx;
+  std::size_t idx, iter;
 
+  std::vector<std::size_t> iters;
   std::vector<double> times;
-
-  DataToLog(std::size_t N_) : N(N_), idx(0), times(N, 0) {}
-
-  void record(const double t) {
-    times[idx] = t;
+  std::vector<double> ittimes;
+
+  DataToLog(std::size_t N_)
+    : N(N_)
+    , idx(0)
+    , iter(0)
+    , iters(N, 0)
+    , times(N, 0)
+    , ittimes(N, 0)
+  {}
+
+  void record(const double t, const double itt) {
+    iters  [idx] = iter;
+    times  [idx] = t;
+    ittimes[idx] = itt;
     ++idx;
+    ++iter;
     if (idx == N) idx = 0;
   }
 
@@ -55,7 +68,10 @@ struct DataToLog {
     std::ofstream aof(oss.str().c_str());
     if (aof.is_open()) {
       for (std::size_t k = 0; k < N; ++k) {
-        aof << times[(idx + k) % N] << '\n';
+        aof
+          << iters  [(idx + k) % N] << ' '
+          << times  [(idx + k) % N] << ' '
+          << ittimes[(idx + k) % N] << '\n';
       }
     }
     aof.close();
@@ -63,38 +79,34 @@ struct DataToLog {
 };
 
 void workThreadLoader(SotLoader *aSotLoader) {
-  unsigned period = 1000;  // micro seconds
+  ros::Rate rate(1000); // 1 kHz
   if (ros::param::has("/sot_controller/dt")) {
     double periodd;
     ros::param::get("/sot_controller/dt", periodd);
-    period = unsigned(1e6 * periodd);
+    rate = ros::Rate(1/periodd);
   }
   DataToLog dataToLog(5000);
 
-  while (aSotLoader->isDynamicGraphStopped()) {
-    usleep(period);
+  rate.reset();
+  while (ros::ok() && aSotLoader->isDynamicGraphStopped()) {
+    rate.sleep();
   }
 
-  struct timeval start, stop;
   ros::NodeHandle nh("/geometric_simu");
   bool paused;
-  unsigned long long dt;
-  while (!aSotLoader->isDynamicGraphStopped()) {
+  ros::Time timeOrigin = ros::Time::now();
+  ros::Time time;
+  while (ros::ok() && !aSotLoader->isDynamicGraphStopped()) {
     nh.param<bool>("paused", paused, false);
 
     if (!paused) {
-      gettimeofday(&start, 0);
+      time = ros::Time::now();
       aSotLoader->oneIteration();
-      gettimeofday(&stop, 0);
-
-      dt = 1000000 * (stop.tv_sec - start.tv_sec) +
-           (stop.tv_usec - start.tv_usec);
-      dataToLog.record((double)dt * 1e-6);
-    } else
-      dt = 0;
-    if (period > dt) {
-      usleep(period - (unsigned)dt);
+
+      ros::Duration d = ros::Time::now() - time;
+      dataToLog.record((time - timeOrigin).toSec(), d.toSec());
     }
+    rate.sleep();
   }
   dataToLog.save("/tmp/geometric_simu");
   cond.notify_all();
-- 
GitLab