From 4016734d2eeb5e8a2066ee8528ec221c09e469b1 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Thu, 1 Jul 2021 09:33:59 +0200
Subject: [PATCH] visu for articulated objects

---
 .../libraries/armem_objects/CMakeLists.txt    | 12 +--
 .../ArticulatedObjectVisu.cpp}                | 65 ++++++++--------
 .../ArticulatedObjectVisu.h}                  | 32 ++++----
 .../armem_objects/server/instance/Segment.cpp | 77 +++++++++++++++++--
 .../armem_objects/server/instance/Segment.h   | 12 +++
 .../server/instance/SegmentAdapter.cpp        |  2 +
 6 files changed, 135 insertions(+), 65 deletions(-)
 rename source/RobotAPI/libraries/armem_objects/server/{articulated_object_instance/Visu.cpp => instance/ArticulatedObjectVisu.cpp} (73%)
 rename source/RobotAPI/libraries/armem_objects/server/{articulated_object_instance/Visu.h => instance/ArticulatedObjectVisu.h} (81%)

diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
index d78bddfa8..54eb919e1 100644
--- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
@@ -30,11 +30,12 @@ armarx_add_library(
         server/instance/Decay.h
         server/instance/RobotHeadMovement.h
         server/instance/Visu.h
+        server/instance/ArticulatedObjectVisu.h
 
-        server/articulated_object_class/Segment.h
-        server/articulated_object_instance/Segment.h
+        # server/articulated_object_class/Segment.h
+        # server/articulated_object_instance/Segment.h
         # server/articulated_object/SegmentAdapter.h
-        server/articulated_object_instance/Visu.h
+        # server/articulated_object_instance/Visu.h
 
         server/attachments/Segment.h
 
@@ -61,12 +62,13 @@ armarx_add_library(
         server/instance/Decay.cpp
         server/instance/RobotHeadMovement.cpp
         server/instance/Visu.cpp
+        server/instance/ArticulatedObjectVisu.cpp
 
         server/articulated_object_class/Segment.cpp
 
-        server/articulated_object_instance/Segment.cpp
+        # server/articulated_object_instance/Segment.cpp
         # server/articulated_object/SegmentAdapter.cpp
-        server/articulated_object_instance/Visu.cpp
+        # server/articulated_object_instance/Visu.cpp
 
         server/attachments/Segment.cpp
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Visu.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp
similarity index 73%
rename from source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Visu.cpp
rename to source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp
index d1ee962ac..f1b90e5da 100644
--- a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Visu.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp
@@ -1,31 +1,30 @@
-#include "Visu.h"
+#include "ArticulatedObjectVisu.h"
 
 #include <algorithm>
 
+#include <SimoxUtility/math/pose.h>
+
+#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/time/CycleUtil.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
 
-#include <SimoxUtility/math/pose.h>
-
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
-#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
 #include "Segment.h"
 
-namespace armarx::armem::server::obj::articulated_object_instance
+namespace armarx::armem::server::obj::instance
 {
 
-    void Visu::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
+    void ArticulatedObjectVisu::defineProperties(armarx::PropertyDefinitionsPtr defs,
+            const std::string& prefix)
     {
-        defs->optional(p.enabled, prefix + "enabled",
-                       "Enable or disable visualization of objects.");
-        defs->optional(p.frequencyHz, prefix + "frequenzyHz",
-                       "Frequency of visualization.");
+        defs->optional(
+            p.enabled, prefix + "enabled", "Enable or disable visualization of objects.");
+        defs->optional(p.frequencyHz, prefix + "frequenzyHz", "Frequency of visualization.");
     }
 
-
-    viz::Layer Visu::visualizeProvider(
+    viz::Layer ArticulatedObjectVisu::visualizeProvider(
         const std::string& providerName,
         const armarx::armem::articulated_object::ArticulatedObjects& objects) const
     {
@@ -36,12 +35,13 @@ namespace armarx::armem::server::obj::articulated_object_instance
         return layer;
     }
 
-
-    void Visu::visualizeObjects(viz::Layer& layer, const armarx::armem::articulated_object::ArticulatedObjects& objects) const
+    void ArticulatedObjectVisu::visualizeObjects(
+        viz::Layer& layer,
+        const armarx::armem::articulated_object::ArticulatedObjects& objects) const
     {
-        const auto visualizeObject = [&](const armarx::armem::articulated_object::ArticulatedObject & obj)
+        const auto visualizeObject =
+            [&](const armarx::armem::articulated_object::ArticulatedObject & obj)
         {
-
             const auto xmlPath = obj.description.xml.serialize();
 
             // clang-format off
@@ -58,40 +58,40 @@ namespace armarx::armem::server::obj::articulated_object_instance
         };
 
         std::for_each(objects.begin(), objects.end(), visualizeObject);
-
     }
 
-    void Visu::init()
+    void ArticulatedObjectVisu::init()
     {
-        updateTask = new PeriodicTask<Visu>(this, &Visu::visualizeRun, 1000 / p.frequencyHz);
+        updateTask = new PeriodicTask<ArticulatedObjectVisu>(this, &ArticulatedObjectVisu::visualizeRun, 1000 / p.frequencyHz);
+
+        ARMARX_INFO << "ArticulatedObjectVisu: init";
         updateTask->start();
     }
 
-
-    void Visu::visualizeRun()
+    void ArticulatedObjectVisu::visualizeRun()
     {
         // std::scoped_lock lock(visuMutex);
-        ARMARX_DEBUG << "Update task";
+        ARMARX_INFO << "Update task";
 
-        if (not p.enabled)
-        {
-            return;
-        }
+        // if (not p.enabled)
+        // {
+        //     return;
+        // }
 
         // TIMING_START(Visu);
 
         const auto articulatedObjects = segment.getArticulatedObjects();
-        ARMARX_DEBUG << "Found " << articulatedObjects.size() << " articulated objects";
+        ARMARX_INFO << "Found " << articulatedObjects.size() << " articulated objects";
 
         viz::Layer layer = arviz.layer("ArticulatedObjectInstances");
 
-        ARMARX_DEBUG << "visualizing objects";
+        ARMARX_INFO << "visualizing objects";
         visualizeObjects(layer, articulatedObjects);
 
-        ARMARX_DEBUG << "Committing objects";
+        ARMARX_INFO << "Committing objects";
         arviz.commit({layer});
 
-        ARMARX_DEBUG << "Done committing";
+        ARMARX_INFO << "Done committing";
 
         // TIMING_END_STREAM(Visu, ARMARX_VERBOSE);
 
@@ -102,7 +102,6 @@ namespace armarx::armem::server::obj::articulated_object_instance
         //         { "t Visualize [ms]", new Variant(Visu.toMilliSecondsDouble()) },
         //     });
         // }
-
     }
 
     // void Visu::RemoteGui::setup(const Visu& visu)
@@ -155,6 +154,4 @@ namespace armarx::armem::server::obj::articulated_object_instance
     //     visu.objectFramesScale = objectFramesScale.getValue();
     // }
 
-
-
-}  // namespace armarx::armem::server::obj::articulated_object_instance
+} // namespace armarx::armem::server::obj::instance
diff --git a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Visu.h b/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.h
similarity index 81%
rename from source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Visu.h
rename to source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.h
index 3590270fe..9c66fd7fb 100644
--- a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Visu.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.h
@@ -27,56 +27,53 @@
 // #include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h>
 
 #include <RobotAPI/components/ArViz/Client/Client.h>
-
 #include <RobotAPI/libraries/armem_objects/types.h>
 
-
 namespace armarx
 {
     class ObjectFinder;
 }
 
-namespace armarx::armem::server::obj::articulated_object_instance
+namespace armarx::armem::server::obj::instance
 {
     class Segment;
 
     /**
      * @brief Visualizes articulated objects
      */
-    class Visu : public armarx::Logging
+    class ArticulatedObjectVisu : public armarx::Logging
     {
     public:
+        ArticulatedObjectVisu(const viz::Client& arviz, Segment& segment) :
+            arviz(arviz), segment(segment)
+        {
+        }
 
-        Visu(const viz::Client& arviz, const Segment& segment): arviz(arviz), segment(segment) {}
-
-        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "visu.");
+        void defineProperties(armarx::PropertyDefinitionsPtr defs,
+                              const std::string& prefix = "visu.");
 
         void init();
 
     protected:
         viz::Layer visualizeProvider(
             const std::string& providerName,
-            const armarx::armem::articulated_object::ArticulatedObjects& objects
-        ) const;
+            const armarx::armem::articulated_object::ArticulatedObjects& objects) const;
 
         void visualizeObjects(
             viz::Layer& layer,
-            const armarx::armem::articulated_object::ArticulatedObjects& objects
-        ) const;
-
+            const armarx::armem::articulated_object::ArticulatedObjects& objects) const;
 
     private:
         viz::Client arviz;
-        const Segment& segment;
+        Segment& segment;
 
         struct Properties
         {
-            bool enabled = true;
+            bool enabled      = true;
             float frequencyHz = 25;
         } p;
 
-
-        PeriodicTask<Visu>::pointer_type updateTask;
+        PeriodicTask<ArticulatedObjectVisu>::pointer_type updateTask;
         void visualizeRun();
 
         // struct RemoteGui
@@ -95,7 +92,6 @@ namespace armarx::armem::server::obj::articulated_object_instance
         //     // void setup(const Visu& visu);
         //     // void update(Visu& visu);
         // };
-
     };
 
-}  // namespace armarx::armem::server::obj::articulated_object_instance
+} // namespace armarx::armem::server::obj::instance
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 31f25a68a..611ec0a8f 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -1,5 +1,6 @@
 #include "Segment.h"
 
+#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
 #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
 #include <RobotAPI/libraries/armem_objects/SceneSnapshot.h>
 
@@ -18,6 +19,8 @@
 #include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
 
+#include <RobotAPI/libraries/armem_robot/aron_conversions.h>
+
 #include <RobotAPI/libraries/core/FramedPose.h>
 #include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h>
 
@@ -30,6 +33,7 @@
 
 
 #include <Eigen/Geometry>
+#include <IceUtil/Time.h>
 
 #include <sstream>
 
@@ -111,6 +115,13 @@ namespace armarx::armem::server::obj::instance
         }
     }
 
+    void Segment::connect(viz::Client arviz)
+    {
+        ARMARX_INFO << "ArticulatedObjectVisu";
+        this->visu = std::make_unique<ArticulatedObjectVisu>(arviz, *this);
+        visu->init();
+    }
+
 
     Segment::CommitStats Segment::commitObjectPoses(
         const std::string& providerName,
@@ -216,18 +227,13 @@ namespace armarx::armem::server::obj::instance
             update.confidence = pose.confidence;
 
             arondto::ObjectInstance dto;
-            toAron(dto, pose);
             // Search for object class.
             if (auto instance = findClassInstance(pose.objectID))
             {
-                toAron(dto.classID, instance->id());
-            }
-            else
-            {
-                toAron(dto.classID, MemoryID());
+                fromAron(dto.classID,  instance->id());
+
             }
-            toAron(dto.sourceID, MemoryID());
-            update.instancesData.push_back(dto.toAron());
+
         }
         iceMemory.commit(commit);
     }
@@ -459,6 +465,61 @@ namespace armarx::armem::server::obj::instance
     }
 
 
+    ::armarx::armem::articulated_object::ArticulatedObjects Segment::getArticulatedObjects()
+    {
+        objpose::ObjectPoseMap objectPoses = getObjectPoses(IceUtil::Time::now());
+
+        ARMARX_INFO << "Found " << objectPoses.size() << " object poses";
+
+        ::armarx::armem::articulated_object::ArticulatedObjects objects;
+        for (const auto&[objectId, objectPose] : objectPoses)
+        {
+            armem::articulated_object::ArticulatedObject articulatedObject;
+            articulatedObject.config.jointMap = objectPose.objectJointValues;
+            articulatedObject.config.globalPose = objectPose.objectPoseGlobal;
+            articulatedObject.config.timestamp = objectPose.timestamp;
+            articulatedObject.instance = objectPose.objectID.instanceName();
+            articulatedObject.timestamp = objectPose.timestamp;
+
+
+            // Search for object class.
+            if (auto classInstance = findClassInstance(objectId))
+            {
+                arondto::ObjectClass dto;
+
+                try
+                {
+                    dto.fromAron(classInstance->data());
+                    robot::RobotDescription description;
+
+                    fromAron(dto, description);
+                    articulatedObject.description = description;
+
+                }
+                catch (...)
+                {
+                    ARMARX_WARNING << "Conversion failed!";
+                    continue;
+                }
+            }
+            else
+            {
+                ARMARX_WARNING << "Class instance not found!";
+                continue;
+            }
+
+
+
+            if (not articulatedObject.config.jointMap.empty())
+            {
+                objects.push_back(articulatedObject);
+            }
+        }
+
+        return objects;
+    }
+
+
     std::optional<simox::OrientedBoxf> Segment::getObjectOOBB(const ObjectID& id)
     {
         return oobbCache.get(id);
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index 3d7af768b..3ec6a2f22 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -10,6 +10,7 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
+#include "RobotAPI/components/ArViz/Client/Client.h"
 #include <RobotAPI/interface/core/RobotState.h>
 #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
 
@@ -23,6 +24,8 @@
 
 #include "Decay.h"
 
+#include "ArticulatedObjectVisu.h"
+
 
 namespace armarx::armem::obj
 {
@@ -55,6 +58,9 @@ namespace armarx::armem::server::obj::instance
 
         void init();
 
+        void connect(viz::Client arviz);
+
+
 
         CommitStats commitObjectPoses(
             const std::string& providerName,
@@ -104,6 +110,9 @@ namespace armarx::armem::server::obj::instance
 
         static arondto::ObjectInstance getLatestInstanceData(const wm::Entity& entity);
 
+        ::armarx::armem::articulated_object::ArticulatedObjects getArticulatedObjects();
+
+
 
     private:
 
@@ -218,6 +227,9 @@ namespace armarx::armem::server::obj::instance
             void update(Segment& data);
         };
 
+    private:
+        std::unique_ptr<ArticulatedObjectVisu> visu;
+
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
index 54b298b6c..e0577877f 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
@@ -93,6 +93,8 @@ namespace armarx::armem::server::obj::instance
             });
             visu.updateTask->start();
         }
+
+        segment.connect(arviz);
     }
 
     void SegmentAdapter::reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, const Ice::Current&)
-- 
GitLab