From d92f0d51d378e92e86823ee7035a9bd5365942fd Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Fri, 17 Jan 2025 17:00:40 +0100
Subject: [PATCH 1/2] ArticulatedObjectWriter: adding alternative
 implementation for storeArticulatedObject which should be more efficient

---
 .../ArticulatedObjectWriter.cpp               | 33 +++++++++++++++++++
 .../ArticulatedObjectWriter.h                 |  7 ++++
 2 files changed, 40 insertions(+)

diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp
index fdb948721..28f93084c 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp
@@ -14,6 +14,8 @@
 
 namespace armarx::armem::articulated_object
 {
+   
+
     armem::articulated_object::ArticulatedObject
     convert(const VirtualRobot::Robot& obj, const armem::Time& timestamp)
     {
@@ -51,6 +53,21 @@ namespace armarx::armem::articulated_object
             .timestamp = timestamp};
     }
 
+    armem::articulated_object::ArticulatedObject
+    convert2(const VirtualRobot::Robot& obj, const armem::Time& timestamp)
+    {
+        ARMARX_DEBUG << "Filename is " << obj.getFilename();
+
+        return armem::articulated_object::ArticulatedObject{
+            .description = {.name = obj.getType(), .xml = {}, .visualization = {}, .info = {}},
+            .instance = obj.getName(),
+            .config = {.timestamp = timestamp,
+                       .globalPose = Eigen::Isometry3f(obj.getRootNode()->getGlobalPose()),
+                       .jointMap = obj.getJointValues(),
+                       .proprioception = std::nullopt},
+            .timestamp = timestamp};
+    }
+
     bool
     ArticulatedObjectWriter::storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject,
                                                     const armem::Time& timestamp,
@@ -64,4 +81,20 @@ namespace armarx::armem::articulated_object
 
         return store(armemArticulatedObject, isStatic);
     }
+
+    bool
+    ArticulatedObjectWriter::storeArticulatedObject2(
+        const VirtualRobot::RobotPtr& articulatedObject,
+        const armem::Time& timestamp,
+        const bool isStatic)
+    {
+
+        ARMARX_CHECK_NOT_NULL(articulatedObject);
+
+        armarx::armem::articulated_object::ArticulatedObject armemArticulatedObject =
+            convert2(*articulatedObject, Time::Now());
+
+        return storeInstance(armemArticulatedObject, isStatic);
+    }
+
 } // namespace armarx::armem::articulated_object
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h
index edc401b6e..4171529f5 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h
@@ -17,5 +17,12 @@ namespace armarx::armem::articulated_object
         bool storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject,
                                     const armem::Time& timestamp,
                                     bool isStatic = false);
+
+        bool storeArticulatedObject2(const VirtualRobot::RobotPtr& articulatedObject,
+                                    const armem::Time& timestamp,
+                                    bool isStatic = false);
+
+    private:
+
     };
 } // namespace armarx::armem::articulated_object
-- 
GitLab


From 6d1f9ac39a8adc45282018ddc5fc1c131605b73f Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Fri, 24 Jan 2025 17:50:35 +0100
Subject: [PATCH 2/2] articulated object writer: implementation such that the
 default behavior is changed: by default, only the instance will be stored and
 not the class

---
 .../ArticulatedObjectWriter.cpp               | 28 ++++++++++---------
 .../ArticulatedObjectWriter.h                 | 15 +++++++---
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp
index 28f93084c..9e03b50c0 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp
@@ -14,13 +14,14 @@
 
 namespace armarx::armem::articulated_object
 {
-   
 
-    armem::articulated_object::ArticulatedObject
+    // Slow version with filesystem access. It runs CMake for each project / environment variable.
+    static armem::articulated_object::ArticulatedObject
     convert(const VirtualRobot::Robot& obj, const armem::Time& timestamp)
     {
         ARMARX_DEBUG << "Filename is " << obj.getFilename();
 
+        // this is very inefficient. It runs CMake for each project
         const std::vector<std::string> packages =
             armarx::CMakePackageFinder::FindAllArmarXSourcePackages();
         const std::string package = armarx::ArmarXDataPath::getProject(packages, obj.getFilename());
@@ -53,8 +54,9 @@ namespace armarx::armem::articulated_object
             .timestamp = timestamp};
     }
 
-    armem::articulated_object::ArticulatedObject
-    convert2(const VirtualRobot::Robot& obj, const armem::Time& timestamp)
+    // fast version without filesystem (CMake) access
+    static armem::articulated_object::ArticulatedObject
+    convertWithoutPackagePath(const VirtualRobot::Robot& obj, const armem::Time& timestamp)
     {
         ARMARX_DEBUG << "Filename is " << obj.getFilename();
 
@@ -69,30 +71,30 @@ namespace armarx::armem::articulated_object
     }
 
     bool
-    ArticulatedObjectWriter::storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject,
-                                                    const armem::Time& timestamp,
-                                                    const bool isStatic)
+    ArticulatedObjectWriter::storeArticulatedObjectWithObjectClass(
+        const VirtualRobot::RobotPtr& articulatedObject,
+        const armem::Time& timestamp,
+        const bool isStatic)
     {
 
         ARMARX_CHECK_NOT_NULL(articulatedObject);
 
         armarx::armem::articulated_object::ArticulatedObject armemArticulatedObject =
-            convert(*articulatedObject, Time::Now());
+            convert(*articulatedObject, timestamp);
 
         return store(armemArticulatedObject, isStatic);
     }
 
     bool
-    ArticulatedObjectWriter::storeArticulatedObject2(
-        const VirtualRobot::RobotPtr& articulatedObject,
-        const armem::Time& timestamp,
-        const bool isStatic)
+    ArticulatedObjectWriter::storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject,
+                                                    const armem::Time& timestamp,
+                                                    const bool isStatic)
     {
 
         ARMARX_CHECK_NOT_NULL(articulatedObject);
 
         armarx::armem::articulated_object::ArticulatedObject armemArticulatedObject =
-            convert2(*articulatedObject, Time::Now());
+            convertWithoutPackagePath(*articulatedObject, timestamp);
 
         return storeInstance(armemArticulatedObject, isStatic);
     }
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h
index 4171529f5..4d6fca627 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h
@@ -14,15 +14,22 @@ namespace armarx::armem::articulated_object
     public:
         using Writer::Writer;
 
+        /**
+         * @brief Stores the articulated object in the memory.
+         * 
+         */
         bool storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject,
                                     const armem::Time& timestamp,
                                     bool isStatic = false);
 
-        bool storeArticulatedObject2(const VirtualRobot::RobotPtr& articulatedObject,
-                                    const armem::Time& timestamp,
-                                    bool isStatic = false);
+        /**
+         * @brief Stores the articulated object. If the object class in unknown, 
+         *        it will also be stored in the corresponding class core segment.
+         */
+        bool storeArticulatedObjectWithObjectClass(const VirtualRobot::RobotPtr& articulatedObject,
+                                                   const armem::Time& timestamp,
+                                                   bool isStatic = false);
 
     private:
-
     };
 } // namespace armarx::armem::articulated_object
-- 
GitLab