From 758344298030c8e0178ad085adb276ebbc5defc5 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Tue, 11 May 2021 12:01:25 +0200
Subject: [PATCH] fix: kinematicunit might not be available on startup and
 causes a nullptr exception.

---
 .../server/description/Segment.cpp            | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
index 011d37e33..9fb1d9f45 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -1,8 +1,10 @@
 #include "Segment.h"
 
+#include <IceUtil/Time.h>
 #include <RobotAPI/libraries/armem_robot/aron/RobotDescription.aron.generated.h>
 #include <sstream>
 
+#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
 #include "ArmarXCore/core/logging/Logging.h"
 #include <ArmarXCore/core/time/TimeUtil.h>
 
@@ -20,6 +22,7 @@
 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot/aron_conversions.h>
 #include <RobotAPI/libraries/armem_robot/robot_conversions.h>
+#include <thread>
 
 namespace armarx::armem::server::robot_state::description
 {
@@ -93,7 +96,27 @@ namespace armarx::armem::server::robot_state::description
 
     void Segment::updateRobotDescription()
     {
-        auto kinematicUnit = robotUnit->getKinematicUnit();
+        ARMARX_CHECK_NOT_NULL(robotUnit);
+
+        const auto waitForKinematicUnit = [&]()
+        {
+            while (true)
+            {
+                auto kinematicUnit = robotUnit->getKinematicUnit();
+
+                if (kinematicUnit)
+                {
+                    ARMARX_INFO << "Kinematic unit is now available.";
+                    return kinematicUnit;
+                }
+
+                ARMARX_INFO << "Waiting for kinematic unit ...";
+                std::this_thread::sleep_for(std::chrono::seconds(1));
+            }
+        };
+
+        auto kinematicUnit = waitForKinematicUnit();
+        ARMARX_CHECK_NOT_NULL(kinematicUnit);
 
         const auto robotName = kinematicUnit->getRobotName();
 
-- 
GitLab