From 00692e99655c271cb9725dfe1b2d0ad5d63155d8 Mon Sep 17 00:00:00 2001
From: ARMAR-7 User <armar7a@kit.edu>
Date: Tue, 10 Oct 2023 09:09:38 +0200
Subject: [PATCH] RobotUnitModuleSelfCollisionChecker: using metronome. adding
 warning

---
 .../RobotUnitModuleSelfCollisionChecker.cpp    | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp
index 2423d3b13..cea59a108 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp
@@ -31,6 +31,7 @@
 #include <VirtualRobot/RobotNodeSet.h>
 
 #include "ArmarXCore/core/logging/Logging.h"
+#include "ArmarXCore/core/time/Metronome.h"
 #include <ArmarXCore/core/util/OnScopeExit.h>
 
 #include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointControllerBase.h>
@@ -363,13 +364,15 @@ namespace armarx::RobotUnitModule
         };
         while (true)
         {
-            const auto startT = std::chrono::high_resolution_clock::now();
+            const auto freq = checkFrequency.load();
+
+            core::time::Metronome metronome(Frequency::Hertz(freq));
+
             //done
             if (isShuttingDown())
             {
                 return;
             }
-            const auto freq = checkFrequency.load();
             const bool inEmergencyStop =
                 _module<ControlThread>().getEmergencyStopState() == eEmergencyStopActive;
             if (inEmergencyStop || freq == 0)
@@ -435,9 +438,16 @@ namespace armarx::RobotUnitModule
                                    << nodePairsToCheck.size() << " pairs";
                 }
             }
+
             //sleep remaining
-            std::this_thread::sleep_until(
-                startT + std::chrono::microseconds{static_cast<int64_t>(1000000 / freq)});
+            const auto duration = metronome.waitForNextTick();
+
+            if(not duration.isPositive())
+            {
+                ARMARX_WARNING << deactivateSpam(10) << 
+                    "Self collision checking took too long. "
+                    "Exceeding time budget by " << duration.toMilliSecondsDouble() << "ms.";
+            }
         }
     }
 
-- 
GitLab