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