From 6074af232e5f8baa4df8d3ef9367fd6a3322e093 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 21 Jul 2021 14:34:19 +0200
Subject: [PATCH] Handle missing kinematic unit

---
 .../server/description/Segment.cpp            | 48 +++++++++----------
 .../server/description/Segment.h              |  2 +-
 .../server/proprioception/Segment.cpp         | 23 +++++----
 3 files changed, 36 insertions(+), 37 deletions(-)

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 8c8d1fcac..03488c3d2 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -5,11 +5,12 @@
 
 #include <IceUtil/Time.h>
 
+#include <ArmarXCore/core/application/properties/PluginAll.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/time/TimeUtil.h>
 #include <ArmarXCore/core/system/ArmarXDataPath.h>
 #include <ArmarXCore/core/system/cmake/CMakePackageFinder.h>
+#include <ArmarXCore/core/time/TimeUtil.h>
 
 #include <RobotAPI/libraries/armem_robot/types.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
@@ -56,9 +57,7 @@ namespace armarx::armem::server::robot_state::description
         ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
 
         ARMARX_INFO << "Adding core segment '" << p.coreSegment << "'";
-
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(
-                          p.coreSegment, arondto::RobotDescription::toAronType());
+        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegment, arondto::RobotDescription::toAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
     }
 
@@ -79,7 +78,7 @@ namespace armarx::armem::server::robot_state::description
     }
 
 
-    void Segment::storeRobotDescription(const robot::RobotDescription& robotDescription)
+    void Segment::commitRobotDescription(const robot::RobotDescription& robotDescription)
     {
         const Time now = TimeUtil::GetTime();
 
@@ -99,11 +98,7 @@ namespace armarx::armem::server::robot_state::description
 
         Commit commit;
         commit.updates.push_back(update);
-
-        {
-            // std::lock_guard g{memoryMutex};
-            iceMemory.commit(commit);
-        }
+        iceMemory.commitLocking(commit);
     }
 
 
@@ -111,23 +106,29 @@ namespace armarx::armem::server::robot_state::description
     {
         ARMARX_CHECK_NOT_NULL(robotUnit);
         KinematicUnitInterfacePrx kinematicUnit = robotUnit->getKinematicUnit();
-        ARMARX_CHECK_NOT_NULL(kinematicUnit);
+        if (kinematicUnit)
+        {
+            const std::string robotName = kinematicUnit->getRobotName();
+            const std::string robotFilename = kinematicUnit->getRobotFilename();
 
-        const std::string robotName = kinematicUnit->getRobotName();
-        const std::string robotFilename = kinematicUnit->getRobotFilename();
+            const std::vector<std::string> packages = armarx::CMakePackageFinder::FindAllArmarXSourcePackages();
+            const std::string package = armarx::ArmarXDataPath::getProject(packages, robotFilename);
 
-        const std::vector<std::string> packages = armarx::CMakePackageFinder::FindAllArmarXSourcePackages();
-        const std::string package = armarx::ArmarXDataPath::getProject(packages, robotFilename);
+            ARMARX_INFO << "Robot description '" << robotFilename << "' found in package " << package;
 
-        ARMARX_INFO << "Robot description '" << robotFilename << "' found in package " << package;
+            const robot::RobotDescription robotDescription
+            {
+                .name = kinematicUnit->getRobotName(),
+                .xml  = {package, kinematicUnit->getRobotFilename()}
+            }; // FIXME
 
-        const robot::RobotDescription robotDescription
+            commitRobotDescription(robotDescription);
+        }
+        else
         {
-            .name = kinematicUnit->getRobotName(),
-            .xml  = {package, kinematicUnit->getRobotFilename()}
-        }; // FIXME
-
-        storeRobotDescription(robotDescription);
+            ARMARX_WARNING << "Robot unit '" << robotUnit->ice_getIdentity().name << "' does not have a kinematic unit."
+                           << "\n Cannot commit robot description.";
+        }
     }
 
 
@@ -159,8 +160,7 @@ namespace armarx::armem::server::robot_state::description
                     }
                     else
                     {
-                        ARMARX_WARNING << "Could not convert entity instance to "
-                                       "'RobotDescription'";
+                        ARMARX_WARNING << "Could not convert entity instance to 'RobotDescription'";
                     }
                 }
             }
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.h b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.h
index 2411180a3..2a51250f7 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.h
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.h
@@ -72,7 +72,7 @@ namespace armarx::armem::server::robot_state::description
 
     private:
 
-        void storeRobotDescription(const robot::RobotDescription& robotDescription);
+        void commitRobotDescription(const robot::RobotDescription& robotDescription);
         void updateRobotDescription();
 
         server::MemoryToIceAdapter& iceMemory;
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
index 8c5a777bd..c84460fc7 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
@@ -5,6 +5,7 @@
 #include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
+#include <ArmarXCore/libraries/DebugObserverHelper/DebugObserverHelper.h>
 
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
 #include <RobotAPI/libraries/armem_robot_state/types.h>
@@ -59,20 +60,18 @@ namespace armarx::armem::server::robot_state::proprioception
     {
         this->robotUnit = robotUnitPrx;
 
+        std::string providerSegmentName = "Robot";
         KinematicUnitInterfacePrx kinematicUnit = robotUnit->getKinematicUnit();
-        const std::string providerSegmentName = kinematicUnit->getRobotName();
+        if (kinematicUnit)
+        {
+            providerSegmentName = kinematicUnit->getRobotName();
+        }
+        else
+        {
+            ARMARX_WARNING << "Robot unit '" << robotUnit->ice_getIdentity().name << "' does not have a kinematic unit."
+                           << "\n Falling back to provider segment name '" << providerSegmentName << "'.";
+        }
         this->robotUnitProviderID = coreSegment->id().withProviderSegmentName(providerSegmentName);
-
-#if 0
-        // TODO what is the purpose?
-        auto encoderEntryType = std::make_shared<aron::typenavigator::ObjectNavigator>("RobotUnitEncoderEntry");
-        auto encoderNameType = std::make_shared<aron::typenavigator::StringNavigator>();
-        auto encoderIterationIDType = std::make_shared<aron::typenavigator::LongNavigator>();
-        encoderEntryType->addMemberType("EncoderGroupName", encoderNameType);
-        encoderEntryType->addMemberType("IterationId", encoderIterationIDType);
-        //auto encoderValueType = std::make_shared<aron::typenavigator::AnyType>();
-        //encoderEntryType->addMemberType("value", encoderValueType);
-#endif
     }
 
 
-- 
GitLab