From 4a7f7738531d7ec500590dbc022ba8782e2aea64 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Fri, 3 Dec 2021 18:11:30 +0100
Subject: [PATCH] Add ObjectPoseClient

---
 .../libraries/ArmarXObjects/CMakeLists.txt    |  2 +
 .../ArmarXObjects/ObjectPoseClient.cpp        | 73 +++++++++++++++++++
 .../ArmarXObjects/ObjectPoseClient.h          | 49 +++++++++++++
 .../plugins/ObjectPoseClientPlugin.cpp        |  7 ++
 .../plugins/ObjectPoseClientPlugin.h          |  5 ++
 5 files changed, 136 insertions(+)
 create mode 100644 source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
 create mode 100644 source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h

diff --git a/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt b/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
index 31fd00c7e..b2e71660a 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
@@ -16,6 +16,7 @@ set(LIB_FILES
     ObjectInfo.cpp
     ObjectFinder.cpp
     ObjectPose.cpp
+    ObjectPoseClient.cpp
 
     json_conversions.cpp
     ice_conversions.cpp
@@ -33,6 +34,7 @@ set(LIB_HEADERS
     ObjectInfo.h
     ObjectFinder.h
     ObjectPose.h
+    ObjectPoseClient.h
 
     json_conversions.h
     ice_conversions.h
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
new file mode 100644
index 000000000..de740d244
--- /dev/null
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
@@ -0,0 +1,73 @@
+#include "ObjectPoseClient.h"
+
+
+namespace armarx::objpose
+{
+
+    ObjectPoseClient::ObjectPoseClient()
+    {
+    }
+
+
+    ObjectPoseClient::ObjectPoseClient(
+            const ObjectPoseStorageInterfacePrx& objectPoseStorage,
+            const ObjectFinder& finder) :
+        objectFinder(finder)
+    {
+        this->connect(objectPoseStorage);
+    }
+
+
+    void
+    ObjectPoseClient::connect(
+            const ObjectPoseStorageInterfacePrx& objectPoseStorage)
+    {
+        this->objectPoseStorage = objectPoseStorage;
+    }
+
+
+    bool
+    ObjectPoseClient::isConnected() const
+    {
+        return bool(objectPoseStorage);
+    }
+
+
+    ObjectPoseSeq
+    ObjectPoseClient::fetchObjectPoses()
+    {
+        if (not objectPoseStorage)
+        {
+            ARMARX_WARNING << "No object pose observer.";
+            return {};
+        }
+        return fromIce(objectPoseStorage->getObjectPoses());
+    }
+
+
+    ObjectPoseMap ObjectPoseClient::fetchObjectPosesAsMap()
+    {
+        ObjectPoseMap map;
+        for (auto& pose : fetchObjectPoses())
+        {
+            map.emplace(pose.objectID, std::move(pose));
+        }
+        return map;
+    }
+
+
+    const ObjectPoseStorageInterfacePrx&
+    ObjectPoseClient::getObjectPoseStorage() const
+    {
+        return objectPoseStorage;
+    }
+
+
+    const ObjectFinder&
+    ObjectPoseClient::getObjectFinder() const
+    {
+        return objectFinder;
+    }
+
+}
+
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
new file mode 100644
index 000000000..2e262cc15
--- /dev/null
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
+
+
+namespace armarx::objpose
+{
+
+    /**
+     * @brief Provides access to the `armarx::objpose::ObjectPoseStorageInterface`
+     * (aka the object memory).
+     */
+    class ObjectPoseClient
+    {
+    public:
+
+        ObjectPoseClient();
+        ObjectPoseClient(const ObjectPoseStorageInterfacePrx& objectPoseStorage,
+                         const ObjectFinder& finder = {});
+
+        void connect(const ObjectPoseStorageInterfacePrx& objectPoseStorage);
+
+        bool isConnected() const;
+
+
+        ObjectPoseSeq
+        fetchObjectPoses();
+        ObjectPoseMap
+        fetchObjectPosesAsMap();
+
+
+        const ObjectPoseStorageInterfacePrx&
+        getObjectPoseStorage() const;
+
+        const ObjectFinder&
+        getObjectFinder() const;
+
+
+    public:
+
+        ObjectPoseStorageInterfacePrx objectPoseStorage;
+
+        ObjectFinder objectFinder;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
index 9bf87346d..a2b3ef473 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
@@ -55,6 +55,13 @@ namespace armarx
         return plugin->createObjectPoseStorage();
     }
 
+
+    objpose::ObjectPoseClient ObjectPoseClientPluginUser::getClient() const
+    {
+        return objpose::ObjectPoseClient(objectPoseStorage, getObjectFinder());
+    }
+
+
     objpose::ObjectPoseSeq ObjectPoseClientPluginUser::getObjectPoses()
     {
         if (!objectPoseStorage)
diff --git a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
index 769d1176d..9f72ab1eb 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
@@ -5,6 +5,7 @@
 #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h>
 
 
 namespace armarx::plugins
@@ -73,6 +74,10 @@ namespace armarx
         objpose::ObjectPoseStorageInterfacePrx createObjectPoseStorage();
         objpose::ObjectPoseStorageInterfacePrx objectPoseStorage;
 
+
+        objpose::ObjectPoseClient getClient() const;
+
+
         objpose::ObjectPoseSeq getObjectPoses();
 
         plugins::ObjectPoseClientPlugin& getObjectPoseClientPlugin();
-- 
GitLab