From ca265b72de0445c9160f187cd360673d90438127 Mon Sep 17 00:00:00 2001
From: Fabian Peller <fabian.peller-konrad@kit.edu>
Date: Tue, 25 Apr 2023 11:04:40 +0200
Subject: [PATCH] aron converter updates

---
 .../armem/core/base/EntityInstanceBase.h      |  10 ++
 .../libraries/armem/core/base/MemoryBase.h    |   5 +
 .../server/ltm/disk/detail/DiskStorage.h      |   4 +-
 .../armem_laser_scans/CMakeLists.txt          |   1 +
 .../armem_laser_scans/aron_conversions.cpp    |   1 -
 .../armem_laser_scans/aron_conversions.h      |   2 +-
 .../client/instance/ObjectReader.h            |   2 +
 .../libraries/armem_skills/CMakeLists.txt     |   4 +
 .../segment/ExecutableSkillLibrarySegment.cpp |  11 +-
 .../libraries/armem_vision/CMakeLists.txt     |   1 +
 .../armem_vision/aron_conversions.cpp         |   1 -
 .../libraries/armem_vision/aron_conversions.h |   2 +-
 source/RobotAPI/libraries/aron/CMakeLists.txt |   4 +-
 .../libraries/aron/common/aron_conversions.h  |   1 +
 .../libraries/aron/converter/CMakeLists.txt   |   6 +-
 .../converter/{common => aron}/CMakeLists.txt |  11 +-
 .../aron/DatatypeConverterVisitor.cpp         | 151 +++++++++++++++++
 .../converter/aron/DatatypeConverterVisitor.h |  62 +++++++
 .../aron/converter/common/Converter.cpp       |   1 -
 .../aron/converter/common/Converter.h         |  71 --------
 .../aron/converter/common/VectorConverter.cpp |   1 -
 .../aron/converter/stl/CMakeLists.txt         |  24 +++
 .../aron/converter/stl/StdVectorConverter.cpp |   1 +
 .../StdVectorConverter.h}                     |  60 +++----
 .../stl/StdVectorConverterVisitor.cpp         |   6 +
 .../converter/stl/StdVectorConverterVisitor.h | 154 ++++++++++++++++++
 .../libraries/aron/core/aron_conversions.h    |  41 +++++
 .../aron/core/data/variant/Variant.h          |   2 +-
 .../aron/core/data/variant/complex/NDArray.h  |   2 +-
 .../aron/core/data/variant/container/Dict.h   |   8 +-
 .../aron/core/data/variant/container/List.h   |   4 +-
 .../data/variant/detail/PrimitiveVariant.h    |   5 +-
 .../data/variant/detail/SpecializedVariant.h  |   8 +
 .../libraries/aron/filter/CMakeLists.txt      |  22 +++
 .../libraries/aron/filter/DataFilter.cpp      | 136 ++++++++++++++++
 .../libraries/aron/filter/DataFilter.h        |  82 ++++++++++
 .../aron/similarity_measure/CMakeLists.txt    |  22 +++
 .../similarity_measure/ndarray/image/MSE.cpp  |  11 ++
 .../similarity_measure/ndarray/image/MSE.h    |  39 +++++
 .../RobotAPI/libraries/skills/CMakeLists.txt  |   3 +
 40 files changed, 854 insertions(+), 128 deletions(-)
 rename source/RobotAPI/libraries/aron/converter/{common => aron}/CMakeLists.txt (54%)
 create mode 100644 source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.cpp
 create mode 100644 source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.h
 delete mode 100644 source/RobotAPI/libraries/aron/converter/common/Converter.cpp
 delete mode 100644 source/RobotAPI/libraries/aron/converter/common/Converter.h
 delete mode 100644 source/RobotAPI/libraries/aron/converter/common/VectorConverter.cpp
 create mode 100644 source/RobotAPI/libraries/aron/converter/stl/CMakeLists.txt
 create mode 100644 source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.cpp
 rename source/RobotAPI/libraries/aron/converter/{common/VectorConverter.h => stl/StdVectorConverter.h} (65%)
 create mode 100644 source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.cpp
 create mode 100644 source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.h
 create mode 100644 source/RobotAPI/libraries/aron/filter/CMakeLists.txt
 create mode 100644 source/RobotAPI/libraries/aron/filter/DataFilter.cpp
 create mode 100644 source/RobotAPI/libraries/aron/filter/DataFilter.h
 create mode 100644 source/RobotAPI/libraries/aron/similarity_measure/CMakeLists.txt
 create mode 100644 source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.cpp
 create mode 100644 source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.h

diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
index 02b2bcae4..9ec137651 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
@@ -110,6 +110,16 @@ namespace armarx::armem::base
             return _data;
         }
 
+        void setData(DataT& d)
+        {
+            _data = d;
+        }
+
+        void setMetadata(MetadataT& m)
+        {
+            _metadata = m;
+        }
+
         /**
          * @brief Get the data converted to a generated Aron DTO class.
          */
diff --git a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
index efc18d58c..a5a521c8e 100644
--- a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
@@ -218,6 +218,11 @@ namespace armarx::armem::base
 
         // MODIFICATION
 
+        void setName(const std::string& name)
+        {
+            this->id().memoryName = name;
+        }
+
         /**
          * @brief Add an empty core segment with the given name, type and prediction engines.
          * @param name The core segment name.
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/detail/DiskStorage.h b/source/RobotAPI/libraries/armem/server/ltm/disk/detail/DiskStorage.h
index e4bc43b0b..2185220ec 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/detail/DiskStorage.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/detail/DiskStorage.h
@@ -22,8 +22,8 @@ namespace armarx::armem::server::ltm::disk
         DiskMemoryItem(const std::filesystem::path& memoryParentPath, const std::string& escapedMemoryName, const std::filesystem::path relativePath);
         virtual ~DiskMemoryItem() = default;
 
-        std::filesystem::path getMemoryBasePathForMode(const MemoryEncodingMode m, const unsigned long e) const;
-        std::filesystem::path getRelativePathForMode(const MemoryEncodingMode m) const;
+        std::filesystem::path getMemoryBasePathForMode(const MemoryEncodingMode m = MemoryEncodingMode::FILESYSTEM, const unsigned long e = 0) const;
+        std::filesystem::path getRelativePathForMode(const MemoryEncodingMode m = MemoryEncodingMode::FILESYSTEM) const;
 
     protected:
         static std::string EscapeSegmentName(const std::string& segmentName);
diff --git a/source/RobotAPI/libraries/armem_laser_scans/CMakeLists.txt b/source/RobotAPI/libraries/armem_laser_scans/CMakeLists.txt
index 1d452ddcb..f40102f3b 100644
--- a/source/RobotAPI/libraries/armem_laser_scans/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_laser_scans/CMakeLists.txt
@@ -11,6 +11,7 @@ armarx_add_library(
         RobotAPI::Core
         RobotAPI::armem
         aroncommon
+        aronvectorconverter
         armem_robot_state
         armem_robot
         # System / External
diff --git a/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.cpp b/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.cpp
index aaa39472e..4cc4a87d2 100644
--- a/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.cpp
@@ -8,7 +8,6 @@
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
 #include <RobotAPI/libraries/armem_laser_scans/aron/LaserScan.aron.generated.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
-#include <RobotAPI/libraries/aron/converter/common/Converter.h>
 #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
 
 #include "types.h"
diff --git a/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.h b/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.h
index 931cda8c8..80c15c082 100644
--- a/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem_laser_scans/aron_conversions.h
@@ -24,7 +24,7 @@
 #include <RobotAPI/interface/units/LaserScannerUnit.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem_laser_scans/types.h>
-#include <RobotAPI/libraries/aron/converter/common/VectorConverter.h>
+#include <RobotAPI/libraries/aron/converter/stl/StdVectorConverter.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
 #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
 
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
index 4900004e0..0a517497c 100644
--- a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
@@ -34,6 +34,7 @@
 
 // The object pose provider. As long as the provider is not connected to armem we need the second proxy
 #include <RobotAPI/interface/objectpose/ObjectPoseProvider.h>
+#include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
 
 namespace armarx::armem::obj::instance
 {
@@ -172,6 +173,7 @@ namespace armarx::armem::obj::instance
         const std::string propertyPrefix = "mem.obj.instance.";
 
         armem::client::MemoryNameSystem& memoryNameSystem;
+        objpose::ObjectPoseStorageInterfacePrx objPoseStorage;
         objpose::ObjectPoseProviderPrx objPoseProvider;
 
         armem::client::Reader memoryReader;
diff --git a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
index 40e112f8b..dc960e9b3 100644
--- a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
@@ -13,6 +13,10 @@ armarx_add_library(
         RobotAPI::armem_server
         RobotAPI::skills
         aronjsonconverter
+<<<<<<< Updated upstream
+=======
+        aronaronconverter
+>>>>>>> Stashed changes
     SOURCES  
         ./aron_conversions.cpp
 
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
index ec84a4f91..db2a719d4 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
@@ -4,6 +4,7 @@
 #include <SimoxUtility/algorithm/string.h>
 
 #include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+#include <RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.h>
 
 #include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h>
 
@@ -43,13 +44,19 @@ namespace armarx::skills::segment
             if (desc.acceptedType)
             {
                 auto t = aron::type::Object::FromAronObjectDTO(desc.acceptedType);
-                skillDescription.acceptedType = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2);
+
+                aron::converter::DatatypeConverterVisitor c;
+                aron::type::visit(c, t);
+
+                skillDescription.acceptedType = aron::data::Dict::DynamicCastAndCheck(c.latest);
             }
 
             armem::Commit commit;
             auto& entityUpdate = commit.add();
             entityUpdate.confidence = 1.0;
-            entityUpdate.timeCreated = armem::Time::Now();
+            entityUpdate.referencedTime = armem::Time::Now();
+            entityUpdate.sentTime = armem::Time::Now();
+            entityUpdate.arrivedTime = armem::Time::Now();
             entityUpdate.instancesData = {skillDescription.toAron()};
             entityUpdate.entityID = provId.withEntityName(skillDescription.skillName);
 
diff --git a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
index 4d179ca04..eed9e12ee 100644
--- a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
@@ -11,6 +11,7 @@ armarx_add_library(
         RobotAPI::Core
         RobotAPI::armem
         aroncommon
+        aronvectorconverter
         # System / External
         Eigen3::Eigen
         armem_laser_scans
diff --git a/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp b/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp
index 814ec5463..86a6c62c0 100644
--- a/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp
@@ -9,7 +9,6 @@
 #include <RobotAPI/libraries/armem_laser_scans/aron/LaserScan.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.aron.generated.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
-#include <RobotAPI/libraries/aron/converter/common/Converter.h>
 #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
 
 #include "types.h"
diff --git a/source/RobotAPI/libraries/armem_vision/aron_conversions.h b/source/RobotAPI/libraries/armem_vision/aron_conversions.h
index bb1e52534..7da8fe4e6 100644
--- a/source/RobotAPI/libraries/armem_vision/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem_vision/aron_conversions.h
@@ -26,7 +26,7 @@
 #include <RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/aron/OccupancyGrid.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/types.h>
-#include <RobotAPI/libraries/aron/converter/common/VectorConverter.h>
+#include <RobotAPI/libraries/aron/converter/stl/StdVectorConverter.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
 #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
 
diff --git a/source/RobotAPI/libraries/aron/CMakeLists.txt b/source/RobotAPI/libraries/aron/CMakeLists.txt
index e1ccc8560..ebe331f66 100644
--- a/source/RobotAPI/libraries/aron/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/CMakeLists.txt
@@ -1,5 +1,7 @@
 add_subdirectory(core)
+add_subdirectory(common)
 add_subdirectory(converter)
+add_subdirectory(filter)
 add_subdirectory(codegeneration)
-add_subdirectory(common)
+add_subdirectory(similarity_measure)
 add_subdirectory(test)
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions.h b/source/RobotAPI/libraries/aron/common/aron_conversions.h
index 84804124d..95177ce57 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions.h
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions.h
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <RobotAPI/libraries/aron/core/aron_conversions.h>
 #include "aron_conversions/armarx.h"
 #include "aron_conversions/simox.h"
 #include "aron_conversions/eigen.h"
diff --git a/source/RobotAPI/libraries/aron/converter/CMakeLists.txt b/source/RobotAPI/libraries/aron/converter/CMakeLists.txt
index e93d191b2..9f3a28977 100644
--- a/source/RobotAPI/libraries/aron/converter/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/converter/CMakeLists.txt
@@ -1,21 +1,23 @@
-add_subdirectory(common)
 add_subdirectory(ivt)
 add_subdirectory(pcl)
 add_subdirectory(eigen)
 add_subdirectory(opencv)
 add_subdirectory(json)
+add_subdirectory(stl)
+add_subdirectory(aron)
 
 
 add_library(AronConverter INTERFACE)
 
 target_link_libraries(AronConverter
     INTERFACE
-        RobotAPI::aron::converter::common    
         RobotAPI::aron::converter::ivt    
         RobotAPI::aron::converter::pcl    
         RobotAPI::aron::converter::eigen    
         RobotAPI::aron::converter::opencv
         RobotAPI::aron::converter::json
+        RobotAPI::aron::converter::stdstl
+        RobotAPI::aron::converter::aron
 )
 
 add_library(aron::converter ALIAS AronConverter)
diff --git a/source/RobotAPI/libraries/aron/converter/common/CMakeLists.txt b/source/RobotAPI/libraries/aron/converter/aron/CMakeLists.txt
similarity index 54%
rename from source/RobotAPI/libraries/aron/converter/common/CMakeLists.txt
rename to source/RobotAPI/libraries/aron/converter/aron/CMakeLists.txt
index ad1ddc366..a29edce54 100644
--- a/source/RobotAPI/libraries/aron/converter/common/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/converter/aron/CMakeLists.txt
@@ -1,23 +1,22 @@
-set(LIB_NAME aroncommonconverter)
+set(LIB_NAME aronaronconverter)
 
 armarx_component_set_name("${LIB_NAME}")
 armarx_set_target("Library: ${LIB_NAME}")
 
 set(LIBS
     aron
+    aroncommon
 )
 
 set(LIB_FILES
-    Converter.cpp
-    VectorConverter.cpp
+    DatatypeConverterVisitor.cpp
 )
 
 set(LIB_HEADERS
-    Converter.h
-    VectorConverter.h
+    DatatypeConverterVisitor.h
 )
 
 armarx_add_library("${LIB_NAME}" "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
 
 
-add_library(RobotAPI::aron::converter::common ALIAS aroncommonconverter)
+add_library(RobotAPI::aron::converter::aron ALIAS aronaronconverter)
diff --git a/source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.cpp b/source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.cpp
new file mode 100644
index 000000000..b20cc993b
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.cpp
@@ -0,0 +1,151 @@
+#include "DatatypeConverterVisitor.h"
+
+namespace armarx::aron::converter
+{
+    void DatatypeConverterVisitor::visitAronVariant(const type::ObjectPtr& el)
+    {
+        auto dict = aron::make_dict(el->getPath());
+        auto type = aron::make_string(el->getFullName(), Path(el->getPath(), {typeMemberName}));
+        dict->addElement(typeMemberName, type);
+
+        for (const auto& [key, child] : el->getMemberTypes())
+        {
+            DatatypeConverterVisitor converter;
+            aron::type::visit(converter, child);
+
+            dict->addElement(key, converter.latest);
+        }
+
+        latest = dict;
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::DictPtr& el)
+    {
+        auto dict = aron::make_dict(el->getPath());
+        auto type = aron::make_string(el->getFullName(), Path(el->getPath(), {typeMemberName}));
+        dict->addElement(typeMemberName, type);
+
+        auto acceptedType = el->getAcceptedType();
+        DatatypeConverterVisitor converter;
+        aron::type::visit(converter, acceptedType);
+        dict->addElement(acceptedTypeMemberName, converter.latest);
+
+        latest = dict;
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::ListPtr& el)
+    {
+        auto dict = aron::make_dict(el->getPath());
+        auto type = aron::make_string(el->getFullName(), Path(el->getPath(), {typeMemberName}));
+        dict->addElement(typeMemberName, type);
+
+        auto acceptedType = el->getAcceptedType();
+        DatatypeConverterVisitor converter;
+        aron::type::visit(converter, acceptedType);
+        dict->addElement(acceptedTypeMemberName, converter.latest);
+
+        latest = dict;
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::PairPtr& el)
+    {
+        auto dict = aron::make_dict(el->getPath());
+        auto type = aron::make_string(el->getFullName(), Path(el->getPath(), {typeMemberName}));
+        dict->addElement(typeMemberName, type);
+
+        auto acceptedType1 = el->getFirstAcceptedType();
+        DatatypeConverterVisitor converter1;
+        aron::type::visit(converter1, acceptedType1);
+        dict->addElement(firstAcceptedTypeMemberName, converter1.latest);
+
+        auto acceptedType2 = el->getSecondAcceptedType();
+        DatatypeConverterVisitor converter2;
+        aron::type::visit(converter2, acceptedType2);
+        dict->addElement(secondAcceptedTypeMemberName, converter2.latest);
+
+        latest = dict;
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::TuplePtr& el)
+    {
+        auto dict = aron::make_dict(el->getPath());
+        auto type = aron::make_string(el->getFullName(), Path(el->getPath(), {typeMemberName}));
+        dict->addElement(typeMemberName, type);
+
+        int i = 0;
+        for (const auto& child : el->getAcceptedTypes())
+        {
+            DatatypeConverterVisitor converter;
+            aron::type::visit(converter, child);
+
+            dict->addElement(acceptedTypeMemberName + "_" + std::to_string(i++), converter.latest);
+        }
+
+        latest = dict;
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::MatrixPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::NDArrayPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::QuaternionPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::PointCloudPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::ImagePtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::IntEnumPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::IntPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::LongPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::FloatPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::DoublePtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::BoolPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::StringPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+
+    void DatatypeConverterVisitor::visitAronVariant(const type::AnyObjectPtr& el)
+    {
+        latest = aron::make_string(el->getFullName(), el->getPath());
+    }
+}
diff --git a/source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.h b/source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.h
new file mode 100644
index 000000000..03573997a
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/converter/aron/DatatypeConverterVisitor.h
@@ -0,0 +1,62 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Peller ( fabian dot peller at kit dot edu )
+ * @date       2023
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <algorithm>
+#include <vector>
+
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
+#include <RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h>
+
+namespace armarx::aron::converter
+{
+    class DatatypeConverterVisitor :
+        public aron::type::ConstVariantVisitor
+    {
+        const std::string typeMemberName = "_aron_type";
+        const std::string acceptedTypeMemberName = "_aron_accepted_type";
+        const std::string firstAcceptedTypeMemberName = "_aron_first_accepted_type";
+        const std::string secondAcceptedTypeMemberName = "_aron_second_accepted_type";
+
+        void visitAronVariant(const type::ObjectPtr&) override;
+        void visitAronVariant(const type::DictPtr&) override;
+        void visitAronVariant(const type::ListPtr&) override;
+        void visitAronVariant(const type::PairPtr&) override;
+        void visitAronVariant(const type::TuplePtr&) override;
+        void visitAronVariant(const type::MatrixPtr&) override;
+        void visitAronVariant(const type::NDArrayPtr&) override;
+        void visitAronVariant(const type::QuaternionPtr&) override;
+        void visitAronVariant(const type::PointCloudPtr&) override;
+        void visitAronVariant(const type::ImagePtr&) override;
+        void visitAronVariant(const type::IntEnumPtr&) override;
+        void visitAronVariant(const type::IntPtr&) override;
+        void visitAronVariant(const type::LongPtr&) override;
+        void visitAronVariant(const type::FloatPtr&) override;
+        void visitAronVariant(const type::DoublePtr&) override;
+        void visitAronVariant(const type::BoolPtr&) override;
+        void visitAronVariant(const type::StringPtr&) override;
+        void visitAronVariant(const type::AnyObjectPtr&) override;
+
+    public:
+        aron::data::VariantPtr latest;
+    };
+}
diff --git a/source/RobotAPI/libraries/aron/converter/common/Converter.cpp b/source/RobotAPI/libraries/aron/converter/common/Converter.cpp
deleted file mode 100644
index c5161e17c..000000000
--- a/source/RobotAPI/libraries/aron/converter/common/Converter.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "Converter.h"
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/aron/converter/common/Converter.h b/source/RobotAPI/libraries/aron/converter/common/Converter.h
deleted file mode 100644
index f6e9959df..000000000
--- a/source/RobotAPI/libraries/aron/converter/common/Converter.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * This file is part of ArmarX.
- *
- * ArmarX is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * ArmarX is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * @author     Fabian Reister ( fabian dot reister at kit dot edu )
- * @date       2021
- * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
- *             GNU General Public License
- */
-
-#pragma once
-
-#include <algorithm>
-#include <vector>
-
-namespace armarx::aron
-{
-
-    /**
-     * @brief Converter function for vector of aron elements to plain cpp type
-     *
-     *  You have to provide a converter function for the element with the signature
-     *
-     *      PlainCppType fromAron(const AronType&)
-     *
-     * @tparam T the aron vector element
-     * @param v the vector of elements
-     * @return the vector of aron elements
-     */
-    template <typename T>
-    auto fromAron(const std::vector<T>& v) -> std::vector<decltype(fromAron(T()))>
-    {
-        std::vector<decltype(fromAron(T()))> r;
-        r.reserve(v.size());
-
-        std::transform(v.begin(), v.end(), std::back_inserter(r),
-                       [](const T & t)
-        {
-            return fromAron(t);
-        });
-
-        return r;
-    }
-
-
-    template <typename T> auto toAron(const std::vector<T>& v)
-    {
-        std::vector<decltype(toAron(T()))> r;
-        r.reserve(v.size());
-
-        std::transform(v.begin(), v.end(), std::back_inserter(r),
-                       [](const T & t)
-        {
-            return toAron(t);
-        });
-
-        return r;
-    }
-
-} // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/aron/converter/common/VectorConverter.cpp b/source/RobotAPI/libraries/aron/converter/common/VectorConverter.cpp
deleted file mode 100644
index 5f5406cc2..000000000
--- a/source/RobotAPI/libraries/aron/converter/common/VectorConverter.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "VectorConverter.h"
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/aron/converter/stl/CMakeLists.txt b/source/RobotAPI/libraries/aron/converter/stl/CMakeLists.txt
new file mode 100644
index 000000000..efbd807ac
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/converter/stl/CMakeLists.txt
@@ -0,0 +1,24 @@
+set(LIB_NAME aronstdstlconverter)
+
+armarx_component_set_name("${LIB_NAME}")
+armarx_set_target("Library: ${LIB_NAME}")
+
+set(LIBS
+    aron
+    aroncommon
+)
+
+set(LIB_FILES
+    StdVectorConverter.cpp
+    StdVectorConverterVisitor.cpp
+)
+
+set(LIB_HEADERS
+    StdVectorConverter.h
+    StdVectorConverterVisitor.h
+)
+
+armarx_add_library("${LIB_NAME}" "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
+
+
+add_library(RobotAPI::aron::converter::stdstl ALIAS aronstdstlconverter)
diff --git a/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.cpp b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.cpp
new file mode 100644
index 000000000..e0f2ae152
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.cpp
@@ -0,0 +1 @@
+#include "StdVectorConverter.h"
diff --git a/source/RobotAPI/libraries/aron/converter/common/VectorConverter.h b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.h
similarity index 65%
rename from source/RobotAPI/libraries/aron/converter/common/VectorConverter.h
rename to source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.h
index 14b3ffc96..9d3f89acc 100644
--- a/source/RobotAPI/libraries/aron/converter/common/VectorConverter.h
+++ b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverter.h
@@ -32,20 +32,20 @@
 #include <RobotAPI/interface/aron.h>
 #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
 
-
 namespace armarx::aron::converter
 {
     class AronVectorConverter
     {
     private:
         template<typename T>
-        static std::vector<T> convert_to_1d_vector(const unsigned char* data, const int elements, const int offset, const int size)
+        static std::vector<T> convert_to_1d_vector(const unsigned char* data, const int offset, const int size)
         {
             ARMARX_CHECK_NOT_NULL(data);
-            ARMARX_CHECK(elements * sizeof(T) == size);
+            ARMARX_CHECK(size % sizeof(T) == 0);
+            int elements = size / sizeof(T);
 
             std::vector<T> v(elements);
-            memcpy(v.data(), data, size);
+            memcpy(v.data(), data + offset, size);
 
             return v;
         }
@@ -54,25 +54,33 @@ namespace armarx::aron::converter
         AronVectorConverter() = delete;
 
         template<typename T>
-        static std::vector<std::vector<T>> ConvertTo2DVector(const data::NDArray& nav)
+        static std::vector<std::vector<T>> ConvertTo2DVector(const data::NDArray& nav, int dim0size = -1)
         {
             const auto& dims = nav.getShape();
 
-            if (dims.size() != 3)
+            if (dims.size() == 0 || dim0size == 0)
             {
-                throw error::AronException(__PRETTY_FUNCTION__, "The NDArray must have 3 dimensions.", nav.getPath());
+                return {};
             }
 
-            if (dims.at(dims.size()-1) != sizeof(T))
+            if (dim0size == -1)
             {
-                throw error::AronException(__PRETTY_FUNCTION__, "Last dimension of the array has to match the element size.", nav.getPath());
+                dim0size = dims.at(0);
             }
 
-            const int one_row_size = dims.at(1) * dims.at(2);
+            const int fullDataByteSize = nav.getDataAsVector().size();
+
+            ARMARX_CHECK(fullDataByteSize % sizeof(T) == 0);
+            const int fullDataSize = fullDataByteSize / sizeof(T);
+
+            ARMARX_CHECK(fullDataSize % dim0size == 0);
+            const int dim1size = fullDataSize / dim0size;
+
+            const int oneRowByteSize = dim1size * sizeof(T);
             std::vector<std::vector<T>> v(dims.at(0));
-            for (int i = 0; i < dims.at(0); i++)
+            for (int i = 0; i < dim0size; i++)
             {
-                v[i] = convert_to_1d_vector<T>(nav.getData(), dims.at(1), i * one_row_size, one_row_size);
+                v[i] = convert_to_1d_vector<T>(nav.getData(), i * oneRowByteSize, oneRowByteSize);
             }
 
             return v;
@@ -87,41 +95,38 @@ namespace armarx::aron::converter
         }
 
         template<typename T>
-        static std::vector<T> ConvertTo1DVector(const data::NDArray& nav, const bool allowFlatten = false)
+        static std::vector<T> ConvertTo1DVector(const data::NDArray& nav)
         {
             const auto& dims = nav.getShape();
 
-            if (!allowFlatten && dims.size() != 2)
+            if (dims.size() == 0)
             {
-                throw error::AronException(__PRETTY_FUNCTION__, "The NDArray must have 2 dimensions.", nav.getPath());
+                return {};
             }
 
-            if (dims.at(dims.size()-1) != sizeof(T))
-            {
-                throw error::AronException(__PRETTY_FUNCTION__, "Last dimension of the array has to match the element size.", nav.getPath());
-            }
+            const int fullDataByteSize = nav.getDataAsVector().size();
 
-            ARMARX_CHECK(dims.size() >= 1);
+            ARMARX_CHECK(fullDataByteSize % sizeof(T) == 0);
+            const int dim0size = fullDataByteSize / sizeof(T);
 
-            const int elements = std::accumulate(std::begin(dims), std::prev(std::end(dims)), 1, std::multiplies<>());
-            const int all_size = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<>());
-            std::vector<T> v = convert_to_1d_vector<T>(nav.getData(), elements, 0, all_size);
+            const int oneRowByteSize = dim0size * sizeof(T);
+            std::vector<T> v = convert_to_1d_vector<T>(nav.getData(), 0, oneRowByteSize);
             return v;
         }
 
         template<typename T>
-        static std::vector<T> ConvertTo1DVector(const data::NDArrayPtr& nav, const bool allowFlatten = false)
+        static std::vector<T> ConvertTo1DVector(const data::NDArrayPtr& nav)
         {
             ARMARX_CHECK_NOT_NULL(nav);
 
-            return ConvertTo1DVector<T>(*nav, allowFlatten);
+            return ConvertTo1DVector<T>(*nav);
         }
 
         // alias
         template<typename T>
-        static std::vector<T> ConvertToVector(const data::NDArrayPtr& nav, const bool allowFlatten = false)
+        static std::vector<T> ConvertToVector(const data::NDArrayPtr& nav)
         {
-            return ConvertTo1DVector<T>(nav, allowFlatten);
+            return ConvertTo1DVector<T>(nav);
         }
 
 
@@ -145,5 +150,4 @@ namespace armarx::aron::converter
         }
 
     };
-
 }  // namespace armarx::aron::converter
diff --git a/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.cpp b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.cpp
new file mode 100644
index 000000000..4eed9e5fa
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.cpp
@@ -0,0 +1,6 @@
+#include "StdVectorConverterVisitor.h"
+
+namespace armarx::aron::converter
+{
+
+}
diff --git a/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.h b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.h
new file mode 100644
index 000000000..416087349
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/converter/stl/StdVectorConverterVisitor.h
@@ -0,0 +1,154 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Reister ( fabian dot reister at kit dot edu )
+ * @date       2021
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+// ArmarX
+#include "StdVectorConverter.h"
+
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
+#include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
+
+namespace armarx::aron::converter
+{
+    namespace detail
+    {
+        template<typename T, size_t D>
+        struct multidimensional_vector
+        {
+            static_assert(D > 0, "matrix dimensions must be positive");
+            typedef std::vector< typename multidimensional_vector<T, D-1>::type > type;
+        };
+
+        template <typename T>
+        struct multidimensional_vector<T, 1>
+        {
+            typedef std::vector<T> type;
+        };
+
+        template <typename T, size_t D>
+        class AronVectorConverterVisitorBase : public armarx::aron::data::RecursiveConstVariantVisitor
+        {
+        public:
+            using VectorType = typename detail::multidimensional_vector<T, D>::type;
+            using Input = armarx::aron::data::RecursiveConstVariantVisitor::Input;
+
+            VectorType data;
+            std::map<std::string, int> memberInfo;
+
+        protected:
+            int currentIndex = 0;
+        };
+    }
+
+    template <typename T, size_t D>
+    class AronVectorConverterVisitor : public detail::AronVectorConverterVisitorBase<T, D>
+    {
+
+    };
+
+    template <>
+    class AronVectorConverterVisitor<float, 1> : public detail::AronVectorConverterVisitorBase<float, 1>
+    {
+    public:
+        using T = float;
+
+        void visitNDArray(Input &aron) override
+        {
+            auto ndarray = armarx::aron::data::NDArray::DynamicCastAndCheck(aron);
+
+            auto shape = ndarray->getShape();
+            memberInfo[ndarray->getPath().toString()] = currentIndex;
+
+            VectorType vec;
+            vec = AronVectorConverter::ConvertTo1DVector<T>(ndarray);
+            shape = {shape.empty() ? 0 : std::accumulate(std::begin(shape), std::prev(std::end(shape)), 1, std::multiplies<int>())};
+            shape.push_back(sizeof(T));
+
+            data.insert(data.end(), vec.begin(), vec.end());
+            currentIndex += shape.at(0);
+        }
+
+        void visitInt(Input &aron) override
+        {
+            auto a = armarx::aron::data::Int::DynamicCastAndCheck(aron);
+            memberInfo[a->getPath().toString()] = currentIndex;
+
+            data.push_back(T(a->getValue()));
+        }
+
+        void visitLong(Input& aron) override
+        {
+            auto a = armarx::aron::data::Long::DynamicCastAndCheck(aron);
+            memberInfo[a->getPath().toString()] = currentIndex;
+
+            data.push_back(T(a->getValue()));
+        }
+
+        void visitFloat(Input& aron) override
+        {
+            auto a = armarx::aron::data::Float::DynamicCastAndCheck(aron);
+            memberInfo[a->getPath().toString()] = currentIndex;
+
+            data.push_back(T(a->getValue()));
+        }
+
+        void visitDouble(Input& aron) override
+        {
+            auto a = armarx::aron::data::Double::DynamicCastAndCheck(aron);
+            memberInfo[a->getPath().toString()] = currentIndex;
+
+            data.push_back(T(a->getValue()));
+        }
+
+        void visitBool(Input& aron) override
+        {
+            auto a = armarx::aron::data::Bool::DynamicCastAndCheck(aron);
+            memberInfo[a->getPath().toString()] = currentIndex;
+
+            data.push_back(T(a->getValue()));
+        }
+    };
+
+    template <>
+    class AronVectorConverterVisitor<char, 2> : public detail::AronVectorConverterVisitorBase<char, 2>
+    {
+    public:
+        using T = char;
+
+    public:
+        void visitNDArray(Input &aron) override
+        {
+            auto ndarray = armarx::aron::data::NDArray::DynamicCastAndCheck(aron);
+
+            auto shape = ndarray->getShape();
+            memberInfo[ndarray->getPath().toString()] = currentIndex;
+
+            VectorType vec;
+            vec = AronVectorConverter::ConvertTo2DVector<T>(ndarray);
+            shape.push_back(1);
+
+            data.insert(data.end(), vec.begin(), vec.end());
+            currentIndex += shape.at(0);
+        }
+    };
+
+}  // namespace armarx::aron::converter
diff --git a/source/RobotAPI/libraries/aron/core/aron_conversions.h b/source/RobotAPI/libraries/aron/core/aron_conversions.h
index d27d64158..95c997dcd 100644
--- a/source/RobotAPI/libraries/aron/core/aron_conversions.h
+++ b/source/RobotAPI/libraries/aron/core/aron_conversions.h
@@ -414,4 +414,45 @@ namespace armarx
     {
         armarx::aron::toAron<DtoKeyT, DtoValueT, BoKeyT, BoValueT>(boMap);
     }
+
+    /**
+     * @brief Converter function for vector of aron elements to plain cpp type
+     *
+     *  You have to provide a converter function for the element with the signature
+     *
+     *      PlainCppType fromAron(const AronType&)
+     *
+     * @tparam T the aron vector element
+     * @param v the vector of elements
+     * @return the vector of aron elements
+     */
+    template <typename T>
+    auto fromAron(const std::vector<T>& v) -> std::vector<decltype(fromAron(T()))>
+    {
+        std::vector<decltype(fromAron(T()))> r;
+        r.reserve(v.size());
+
+        std::transform(v.begin(), v.end(), std::back_inserter(r),
+                       [](const T & t)
+        {
+            return fromAron(t);
+        });
+
+        return r;
+    }
+
+
+    template <typename T> auto toAron(const std::vector<T>& v)
+    {
+        std::vector<decltype(toAron(T()))> r;
+        r.reserve(v.size());
+
+        std::transform(v.begin(), v.end(), std::back_inserter(r),
+                       [](const T & t)
+        {
+            return toAron(t);
+        });
+
+        return r;
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
index aee8c55fc..1fab338ab 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
@@ -115,7 +115,7 @@ namespace armarx::aron::data
 
         // virtual definitions
         /// get a pointer to a copy of this variant
-        virtual VariantPtr clone() const = 0;
+        virtual VariantPtr cloneAsVariant() const = 0;
 
         /// get the children of a data variant
         virtual std::vector<VariantPtr> getChildren() const = 0;
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h
index 593298a7d..068fd1a85 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h
@@ -84,7 +84,7 @@ namespace armarx::aron::data
         data::dto::NDArrayPtr toNDArrayDTO() const;
 
         // virtual implementations
-        virtual VariantPtr clone() const override
+        NDArrayPtr clone() const override
         {
             NDArrayPtr ret(new NDArray(getShape(), getType(), getDataAsVector(), getPath()));
             return ret;
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
index 498e59ee2..5006a0c97 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
@@ -64,9 +64,9 @@ namespace armarx::aron::data
         std::vector<std::string> getAllKeys() const;
         std::string getAllKeysAsString() const;
 
-        void addElement(const std::string& key, const VariantPtr&);
+        void addElement(const std::string& key, const VariantPtr& = nullptr);
         bool hasElement(const std::string&) const;
-        void setElement(const std::string&, const VariantPtr&);
+        void setElement(const std::string&, const VariantPtr& = nullptr);
         VariantPtr getElement(const std::string&) const;
         std::map<std::string, VariantPtr> getElements() const;
 
@@ -75,12 +75,12 @@ namespace armarx::aron::data
         void clear();
 
         // virtual implementations        
-        VariantPtr clone() const override
+        DictPtr clone() const override
         {
             DictPtr ret(new Dict(getPath()));
             for (const auto& [key, val] : getElements())
             {
-                ret->addElement(key, val->clone());
+                ret->addElement(key, val->cloneAsVariant());
             }
             return ret;
         }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
index 4ab656bfa..142f42ee6 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
@@ -73,12 +73,12 @@ namespace armarx::aron::data
         void clear();
 
         // virtual implementations
-        VariantPtr clone() const override
+        ListPtr clone() const override
         {
             ListPtr ret(new List(getPath()));
             for (const auto& val : getElements())
             {
-                ret->addElement(val->clone());
+                ret->addElement(val->cloneAsVariant());
             }
             return ret;
         }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
index ad4ad2eac..3b36c6310 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
@@ -41,6 +41,7 @@ namespace armarx::aron::data::detail
         public SpecializedVariantBase<AronDataT, DerivedT>
     {
     public:
+        using PointerType = std::shared_ptr<DerivedT>;
         using ValueType = ValueT;
 
     public:
@@ -80,9 +81,9 @@ namespace armarx::aron::data::detail
             throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
         }
 
-        VariantPtr clone() const override
+        PointerType clone() const override
         {
-            typename DerivedT::PointerType ret(new DerivedT(getValue(), this->getPath()));
+            PointerType ret(new DerivedT(getValue(), this->getPath()));
             return ret;
         }
 
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
index 4ac67da09..d7e6e4a55 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
@@ -77,7 +77,15 @@ namespace armarx::aron::data::detail
         virtual bool operator==(const DerivedT&) const = 0;
         virtual bool operator==(const PointerType& other) const = 0;
 
+        // new interface methods
+        virtual PointerType clone() const = 0;
+
         // virtual implementations
+        VariantPtr cloneAsVariant() const override
+        {
+            return clone();
+        }
+
         data::dto::GenericDataPtr toAronDTO() const override
         {
             return aron;
diff --git a/source/RobotAPI/libraries/aron/filter/CMakeLists.txt b/source/RobotAPI/libraries/aron/filter/CMakeLists.txt
new file mode 100644
index 000000000..46ca5c4ae
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/filter/CMakeLists.txt
@@ -0,0 +1,22 @@
+set(LIB_NAME aronfilter)
+
+armarx_component_set_name("${LIB_NAME}")
+armarx_set_target("Library: ${LIB_NAME}")
+
+set(LIBS
+    aron
+    aroncommon
+)
+
+set(LIB_FILES
+    DataFilter.cpp
+)
+
+set(LIB_HEADERS
+    DataFilter.h
+)
+
+armarx_add_library("${LIB_NAME}" "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
+
+
+add_library(RobotAPI::aron::filter ALIAS aronfilter)
diff --git a/source/RobotAPI/libraries/aron/filter/DataFilter.cpp b/source/RobotAPI/libraries/aron/filter/DataFilter.cpp
new file mode 100644
index 000000000..51cb17110
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/filter/DataFilter.cpp
@@ -0,0 +1,136 @@
+#include "DataFilter.h"
+
+#include <SimoxUtility/algorithm/string.h>
+
+namespace armarx::aron::filter
+{
+    WhitelistDataFilterWithNormalization::WhitelistDataFilterWithNormalization(const std::vector<std::string>& whitelist, const std::map<std::string, Normalization>& normalization) :
+        whitelist(whitelist),
+        normalization(normalization)
+    {
+
+    }
+
+    bool WhitelistDataFilterWithNormalization::pathInWhitelist(const aron::Path& p) const
+    {
+        for (const auto& w : whitelist)
+        {
+            if (simox::alg::starts_with(p.toString(), w))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::ListPtr& aron)
+    {
+        auto l = aron::make_list(aron->getPath());
+        for (const auto& el : aron->getElements())
+        {
+            WhitelistDataFilterWithNormalization v(whitelist, normalization);
+            aron::data::visit(v, el);
+
+            if (v.data)
+            {
+                l->addElement(v.data);
+            }
+        }
+
+        if (l->getElements().size() || pathInWhitelist(aron->getPath()))
+        {
+            data = l;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::DictPtr& aron)
+    {
+        auto l = aron::make_dict(aron->getPath());
+        for (const auto& [k, el] : aron->getElements())
+        {
+            WhitelistDataFilterWithNormalization v(whitelist, normalization);
+            aron::data::visit(v, el);
+
+            if (v.data)
+            {
+                l->addElement(k, v.data);
+            }
+        }
+
+        if (l->getElements().size() || pathInWhitelist(aron->getPath()))
+        {
+            data = l;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::NDArrayPtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            data = aron->clone();
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::IntPtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            auto e = aron->clone();
+            int v = checkForNormalization(aron->getPath(), e->getValue());
+            e->setValue(v);
+            data = e;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::LongPtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            auto e = aron->clone();
+            long v = checkForNormalization(aron->getPath(), e->getValue());
+            e->setValue(v);
+            data = e;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::FloatPtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            auto e = aron->clone();
+            float v = checkForNormalization(aron->getPath(), e->getValue());
+            e->setValue(v);
+            data = e;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::DoublePtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            auto e = aron->clone();
+            double v = checkForNormalization(aron->getPath(), e->getValue());
+            e->setValue(v);
+            data = e;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::BoolPtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            auto e = aron->clone();
+            bool v = checkForNormalization(aron->getPath(), e->getValue());
+            e->setValue(v);
+            data = e;
+        }
+    }
+
+    void WhitelistDataFilterWithNormalization::visitAronVariant(const data::StringPtr& aron)
+    {
+        if (pathInWhitelist(aron->getPath()))
+        {
+            data = aron->clone();
+        }
+    }
+}
diff --git a/source/RobotAPI/libraries/aron/filter/DataFilter.h b/source/RobotAPI/libraries/aron/filter/DataFilter.h
new file mode 100644
index 000000000..8b00b3bcc
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/filter/DataFilter.h
@@ -0,0 +1,82 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Peller ( fabian dot peller at kit dot edu )
+ * @date       2023
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <algorithm>
+#include <vector>
+#include <map>
+
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
+#include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
+
+namespace armarx::aron::filter
+{
+    class WhitelistDataFilterWithNormalization :
+            public aron::data::ConstVariantVisitor
+    {
+    public:
+        struct Normalization
+        {
+            float min;
+            float max;
+        };
+
+        WhitelistDataFilterWithNormalization(const std::vector<std::string>& whitelist, const std::map<std::string, Normalization>& normalization = {});
+
+        void visitAronVariant(const data::DictPtr&) override;
+        void visitAronVariant(const data::ListPtr&) override;
+        void visitAronVariant(const data::NDArrayPtr&) override;
+        void visitAronVariant(const data::IntPtr&) override;
+        void visitAronVariant(const data::LongPtr&) override;
+        void visitAronVariant(const data::FloatPtr&) override;
+        void visitAronVariant(const data::DoublePtr&) override;
+        void visitAronVariant(const data::BoolPtr&) override;
+        void visitAronVariant(const data::StringPtr&) override;
+
+    private:
+
+        bool pathInWhitelist(const aron::Path& p) const;
+
+        // normalization
+        template <class T>
+        T checkForNormalization(const aron::Path& p, const T& t)
+        {
+            for (const auto& [n, v] : normalization)
+            {
+                if (simox::alg::starts_with(p.toString(), n))
+                {
+                    auto diff = v.max - v.min;
+                    auto norm = (t - v.min) / diff;
+                    return norm;
+                }
+            }
+            return t;
+        }
+
+        std::vector<std::string> whitelist;
+        std::map<std::string, Normalization> normalization;
+
+    public:
+
+        aron::data::VariantPtr data;
+    };
+}
diff --git a/source/RobotAPI/libraries/aron/similarity_measure/CMakeLists.txt b/source/RobotAPI/libraries/aron/similarity_measure/CMakeLists.txt
new file mode 100644
index 000000000..fdd238143
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/similarity_measure/CMakeLists.txt
@@ -0,0 +1,22 @@
+set(LIB_NAME aronsimilaritymeasure)
+
+armarx_component_set_name("${LIB_NAME}")
+armarx_set_target("Library: ${LIB_NAME}")
+
+set(LIBS
+    aron
+    aroncommon
+)
+
+set(LIB_FILES
+    ndarray/image/MSE.cpp
+)
+
+set(LIB_HEADERS
+    ndarray/image/MSE.h
+)
+
+armarx_add_library("${LIB_NAME}" "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
+
+
+add_library(RobotAPI::aron::similarity_measure ALIAS aronsimilaritymeasure)
diff --git a/source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.cpp b/source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.cpp
new file mode 100644
index 000000000..e3e37f6dc
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.cpp
@@ -0,0 +1,11 @@
+#include "MSE.h"
+
+#include <SimoxUtility/algorithm/string.h>
+
+namespace armarx::aron::similarity_measure::ndarray::image
+{
+    size_t MSE::similarity(const aron::data::NDArrayPtr& p1, const aron::data::NDArrayPtr& p2)
+    {
+        return 0;
+    }
+}
diff --git a/source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.h b/source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.h
new file mode 100644
index 000000000..c8f9bf5d8
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/similarity_measure/ndarray/image/MSE.h
@@ -0,0 +1,39 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Peller ( fabian dot peller at kit dot edu )
+ * @date       2023
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <algorithm>
+#include <vector>
+#include <map>
+
+#include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
+
+namespace armarx::aron::similarity_measure::ndarray::image
+{
+    class MSE
+    {
+    public:
+        MSE() = delete;
+
+        static size_t similarity(const aron::data::NDArrayPtr& p1, const aron::data::NDArrayPtr& p2);
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/CMakeLists.txt b/source/RobotAPI/libraries/skills/CMakeLists.txt
index 30241deae..8f92d10a8 100644
--- a/source/RobotAPI/libraries/skills/CMakeLists.txt
+++ b/source/RobotAPI/libraries/skills/CMakeLists.txt
@@ -11,6 +11,9 @@ armarx_add_library(
 
         RobotAPI::Core
         aronjsonconverter
+        aroncommonconverter
+        aronaronconverter
+
     SOURCES  
         ./error/Exception.cpp
         ./manager/SkillManagerComponentPlugin.cpp
-- 
GitLab