From ad6e248fcf70ea7174d3d4e35bef93ffee010086 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Tue, 11 May 2021 08:20:48 +0200
Subject: [PATCH] standard query functions for segments

---
 .../server/description/Segment.cpp            | 35 +++++++++++-------
 .../server/localization/Segment.cpp           | 36 ++++++++++++++++---
 2 files changed, 54 insertions(+), 17 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 b8f2d7ffa..f00a970c1 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -84,7 +84,11 @@ namespace armarx::armem::server::robot_state::description
         Commit commit;
         commit.updates.push_back(update);
 
-        iceMemory.commit(commit);
+        {
+            // std::lock_guard g{memoryMutex};
+            iceMemory.commit(commit);
+        }
+
     }
 
     void Segment::updateRobotDescription()
@@ -103,25 +107,30 @@ namespace armarx::armem::server::robot_state::description
 
     Segment::RobotDescriptionMap Segment::getRobotDescriptions() const
     {
+
         RobotDescriptionMap robotDescriptions;
 
-        for (const auto &[_, provSeg] : iceMemory.workingMemory->getCoreSegment(p.coreSegment))
         {
-            for (const auto &[name, entity] : provSeg.entities())
-            {
-                const auto& entityInstance = entity.getLatestSnapshot().getInstance(0);
-                const auto description     = robot::convertRobotDescription(entityInstance);
+            // std::lock_guard g{memoryMutex};
 
-                if (not description)
+            for (const auto &[_, provSeg] : iceMemory.workingMemory->getCoreSegment(p.coreSegment))
+            {
+                for (const auto &[name, entity] : provSeg.entities())
                 {
-                    ARMARX_WARNING << "Could not convert entity instance to "
-                                   "'RobotDescription'";
-                    continue;
-                }
+                    const auto& entityInstance = entity.getLatestSnapshot().getInstance(0);
+                    const auto description     = robot::convertRobotDescription(entityInstance);
 
-                ARMARX_DEBUG << "Key is " << armem::MemoryID(entity.id());
+                    if (not description)
+                    {
+                        ARMARX_WARNING << "Could not convert entity instance to "
+                                       "'RobotDescription'";
+                        continue;
+                    }
 
-                robotDescriptions.emplace(description->name, *description);
+                    ARMARX_DEBUG << "Key is " << armem::MemoryID(entity.id());
+
+                    robotDescriptions.emplace(description->name, *description);
+                }
             }
         }
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
index d245d2c87..18d01e592 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
@@ -1,5 +1,6 @@
 #include "Segment.h"
 
+#include <Eigen/src/Geometry/Transform.h>
 #include <IceUtil/Time.h>
 #include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h>
 #include <iterator>
@@ -13,6 +14,7 @@
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
 #include <RobotAPI/libraries/armem/core/workingmemory/Visitor.h>
 #include "RobotAPI/libraries/armem/core/MemoryID.h"
+#include "RobotAPI/libraries/armem_robot/robot_conversions.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>
@@ -50,8 +52,6 @@ namespace armarx::armem::server::robot_state::localization
 
         coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegment, arondto::Transform::toInitialAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
-
-
     }
 
     void Segment::connect(viz::Client arviz)
@@ -63,14 +63,42 @@ namespace armarx::armem::server::robot_state::localization
     {
         std::unordered_map<std::string, Eigen::Affine3f> robotGlobalPoses;
 
-        // TODO(fabian.reister): implement
+        for (const auto& [robotName, provSeg] : iceMemory.workingMemory->getCoreSegment(p.coreSegment))
+        {
+            for (const auto& [name, entity] :  provSeg.entities())
+            {
+                const auto& entityInstance = entity.getLatestSnapshot().getInstance(0);
+
+                // arondto::Transform aronTransform;
+                // aronTransform.fromAron(entityInstance);
+
+
+
+                // // Assemble trafo
+
+                // if (not robotState)
+                // {
+                //     ARMARX_WARNING << "Could not convert entity instance to 'RobotState'";
+                //     continue;
+                // }
+
+                // ARMARX_DEBUG << "Key is " << armem::MemoryID(entity.id());
+
+                // TODO
+
+            }
+
+            robotGlobalPoses.emplace(robotName, Eigen::Affine3f::Identity());
+
+        }
+
+        ARMARX_INFO << deactivateSpam(10) <<  "Number of known robot poses: " << robotGlobalPoses.size();
 
         return robotGlobalPoses;
     }
 
     bool Segment::storeTransform(const armarx::armem::robot_state::Transform& transform)
     {
-
         const auto timestamp = IceUtil::Time::microSeconds(transform.header.timestamp);
 
         const MemoryID providerID = coreSegment->id().withProviderSegmentName(transform.header.agent);
-- 
GitLab