From 3f264804fa8acf0fa563009a772a5b1d56cb5d55 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Fri, 23 Apr 2021 17:30:28 +0200
Subject: [PATCH] Add class (memory) ID to instance

---
 .../armem_objects/aron/ObjectInstance.xml     |  3 ++
 .../armem_objects/server/instance/Segment.cpp | 38 ++++++++++++++++---
 .../armem_objects/server/instance/Segment.h   |  3 ++
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_objects/aron/ObjectInstance.xml b/source/RobotAPI/libraries/armem_objects/aron/ObjectInstance.xml
index adcaa6b38..774c6e0d5 100644
--- a/source/RobotAPI/libraries/armem_objects/aron/ObjectInstance.xml
+++ b/source/RobotAPI/libraries/armem_objects/aron/ObjectInstance.xml
@@ -19,6 +19,9 @@ Core segment type of Object/Instance.
                 <armarx::objpose::arondto::ObjectPose />
             </ObjectChild>
 
+            <ObjectChild key="classID">
+                <armarx::armem::arondto::MemoryID />
+            </ObjectChild>
             <ObjectChild key="sourceID">
                 <armarx::armem::arondto::MemoryID />
             </ObjectChild>
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index fb1414b1c..d831d5dee 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -2,17 +2,19 @@
 
 #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
 
-#include <RobotAPI/libraries/core/Pose.h>
-#include <RobotAPI/libraries/core/FramedPose.h>
-#include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h>
+#include <RobotAPI/libraries/armem/core/aron_conversions.h>
+#include <RobotAPI/libraries/armem/core/Visitor.h>
+#include <RobotAPI/libraries/armem/client/Writer.h>
+#include <RobotAPI/libraries/armem/client/query/Builder.h>
+#include <RobotAPI/libraries/armem/client/query/query_fns.h>
+
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron_conversions.h>
 #include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
-#include <RobotAPI/libraries/armem/client/Writer.h>
-#include <RobotAPI/libraries/armem/core/Visitor.h>
-#include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
 
+#include <RobotAPI/libraries/core/FramedPose.h>
+#include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h>
 
 #include <ArmarXCore/core/time/TimeUtil.h>
 
@@ -181,6 +183,11 @@ namespace armarx::armem::server::obj::instance
 
                 arondto::ObjectInstance dto;
                 toAron(dto, pose);
+                // Search for object class.
+                if (auto instance = findClassInstance(pose.objectID))
+                {
+                    toAron(dto.classID, instance->id());
+                }
                 update.instancesData.push_back(dto.toAron());
             }
 
@@ -640,6 +647,25 @@ namespace armarx::armem::server::obj::instance
     }
 
 
+    std::optional<EntityInstance> Segment::findClassInstance(const ObjectID& objectID)
+    {
+        const ObjectID classID = { objectID.dataset(), objectID.className() };
+        try
+        {
+            for (const auto& [_, provSeg] : iceMemory.memory->getCoreSegment("Class"))
+            {
+                return provSeg.getEntity(classID.str()).getLatestSnapshot().getInstance(0);
+            }
+            return std::nullopt;
+        }
+        catch (const armem::error::ArMemError&)
+        {
+            // Some segment or entity did not exist.
+            return std::nullopt;
+        }
+    }
+
+
 
     void Segment::RemoteGui::setup(const Segment& data)
     {
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index 941f5a76d..4a1e69742 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -128,6 +128,9 @@ namespace armarx::armem::server::obj::instance
             bool commitAttachedPose);
 
 
+        std::optional<EntityInstance> findClassInstance(const ObjectID& objectID);
+
+
         friend struct DetachVisitor;
 
 
-- 
GitLab