From e89f9e16cd00e4ae9392d0b12833b41d59bdd19d Mon Sep 17 00:00:00 2001 From: Fabian Peller <fabian.peller-konrad@kit.edu> Date: Mon, 13 Mar 2023 15:15:05 +0000 Subject: [PATCH] Fix error in aron paths in ltm export. Add vector conversion methods --- .../armem/core/wm/aron_conversions.cpp | 10 +-- .../armem/server/MemoryToIceAdapter.cpp | 5 +- .../server/ltm/base/converter/Converter.h | 2 +- .../ltm/base/converter/image/Converter.cpp | 4 +- .../ltm/base/converter/image/Converter.h | 4 +- .../base/converter/image/exr/ExrConverter.cpp | 4 +- .../base/converter/image/exr/ExrConverter.h | 2 +- .../base/converter/image/png/PngConverter.cpp | 8 +- .../base/converter/image/png/PngConverter.h | 2 +- .../ltm/base/converter/object/Converter.cpp | 4 +- .../ltm/base/converter/object/Converter.h | 4 +- .../converter/object/bson/BsonConverter.cpp | 4 +- .../converter/object/bson/BsonConverter.h | 2 +- .../converter/object/json/JsonConverter.cpp | 4 +- .../converter/object/json/JsonConverter.h | 2 +- .../armem/server/ltm/disk/CoreSegment.cpp | 3 +- .../armem/server/ltm/disk/Entity.cpp | 5 +- .../armem/server/ltm/disk/EntitySnapshot.cpp | 11 +-- .../armem/server/ltm/disk/Memory.cpp | 1 + .../armem/server/ltm/disk/ProviderSegment.cpp | 5 +- .../ltm/detail/EntityQueryProcessorBase.h | 2 + .../aron/converter/common/VectorConverter.h | 89 ++++++++++++++++--- .../converter/json/NLohmannJSONConverter.cpp | 9 +- .../converter/json/NLohmannJSONConverter.h | 4 +- .../aron/converter/opencv/OpenCVConverter.cpp | 4 +- .../aron/converter/opencv/OpenCVConverter.h | 2 +- 26 files changed, 134 insertions(+), 62 deletions(-) diff --git a/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp b/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp index d24ce36b5..6a23899d1 100644 --- a/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp @@ -41,24 +41,24 @@ void armarx::armem::to_aron(aron::data::DictPtr& metadata, aron::data::DictPtr& data = e.data(); metadata = std::make_shared<aron::data::Dict>(); - auto timeWrapped = std::make_shared<aron::data::Long>(); + auto timeWrapped = std::make_shared<aron::data::Long>(armarx::aron::Path(std::vector<std::string>{DATA_WRAPPER_TIME_STORED_FIELD})); timeWrapped->setValue(Time::Now().toMicroSecondsSinceEpoch()); metadata->addElement(DATA_WRAPPER_TIME_STORED_FIELD, timeWrapped); const wm::EntityInstanceMetadata& m = e.metadata(); - auto timeCreated = std::make_shared<aron::data::Long>(); + auto timeCreated = std::make_shared<aron::data::Long>(armarx::aron::Path(std::vector<std::string>{DATA_WRAPPER_TIME_CREATED_FIELD})); timeCreated->setValue(m.timeCreated.toMicroSecondsSinceEpoch()); metadata->addElement(DATA_WRAPPER_TIME_CREATED_FIELD, timeCreated); - auto timeSent = std::make_shared<aron::data::Long>(); + auto timeSent = std::make_shared<aron::data::Long>(armarx::aron::Path(std::vector<std::string>{DATA_WRAPPER_TIME_SENT_FIELD})); timeSent->setValue(m.timeSent.toMicroSecondsSinceEpoch()); metadata->addElement(DATA_WRAPPER_TIME_SENT_FIELD, timeSent); - auto timeArrived = std::make_shared<aron::data::Long>(); + auto timeArrived = std::make_shared<aron::data::Long>(armarx::aron::Path(std::vector<std::string>{DATA_WRAPPER_TIME_ARRIVED_FIELD})); timeArrived->setValue(m.timeArrived.toMicroSecondsSinceEpoch()); metadata->addElement(DATA_WRAPPER_TIME_ARRIVED_FIELD, timeArrived); - auto confidence = std::make_shared<aron::data::Double>(); + auto confidence = std::make_shared<aron::data::Double>(armarx::aron::Path(std::vector<std::string>{DATA_WRAPPER_CONFIDENCE_FIELD})); confidence->setValue(static_cast<double>(m.confidence)); metadata->addElement(DATA_WRAPPER_CONFIDENCE_FIELD, confidence); } diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 63b9bba20..06096a996 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -286,10 +286,7 @@ namespace armarx::armem::server // append result to return memory and sanity check wmResult.append(ltmResult); - if (wmResult.empty()) - { - ARMARX_ERROR << "A merged Memory has no data although at least the LTM result contains data. This indicates that something is wrong."; - } + ARMARX_CHECK(not wmResult.empty()); // Ist das wirklich notwendig? // query again to limit output size (TODO: Skip if querytype is all) diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/Converter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/Converter.h index c42e9c0d5..0ed3d9b08 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/Converter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/Converter.h @@ -26,7 +26,7 @@ namespace armarx::armem::server::ltm virtual ~Converter() = default; virtual std::pair<std::vector<unsigned char>, std::string> convert(const aron::data::VariantPtr& data) = 0; - virtual aron::data::VariantPtr convert(const std::vector<unsigned char>& data, const std::string&) = 0; + virtual aron::data::VariantPtr convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) = 0; public: const ConverterType type; diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.cpp index 39b4d94b0..30349fd4f 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.cpp @@ -9,9 +9,9 @@ namespace armarx::armem::server::ltm return _convert(d); } - aron::data::VariantPtr ImageConverter::convert(const std::vector<unsigned char>& data, const std::string& m) + aron::data::VariantPtr ImageConverter::convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string& m) { - auto d = _convert(data, m); + auto d = _convert(data, p, m); return d; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.h index 8cb070f09..440c1c6c5 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/Converter.h @@ -21,10 +21,10 @@ namespace armarx::armem::server::ltm virtual ~ImageConverter() = default; std::pair<std::vector<unsigned char>, std::string> convert(const aron::data::VariantPtr& data) final; - aron::data::VariantPtr convert(const std::vector<unsigned char>& data, const std::string&) final; + aron::data::VariantPtr convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) final; protected: virtual std::pair<std::vector<unsigned char>, std::string> _convert(const aron::data::NDArrayPtr& data) = 0; - virtual aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data, const std::string&) = 0; + virtual aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) = 0; }; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.cpp index c5eee777b..6bf18cff4 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.cpp @@ -25,9 +25,9 @@ namespace armarx::armem::server::ltm::converter::image return std::make_pair(buffer, ""); } - aron::data::NDArrayPtr ExrConverter::_convert(const std::vector<unsigned char>& data, const std::string& m) + aron::data::NDArrayPtr ExrConverter::_convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string& m) { cv::Mat img = cv::imdecode(data, cv::IMREAD_ANYDEPTH); - return aron::converter::AronOpenCVConverter::ConvertFromMat(img); + return aron::converter::AronOpenCVConverter::ConvertFromMat(img, p); } } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.h index ad4b1bfa2..07e94a5b2 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/exr/ExrConverter.h @@ -16,6 +16,6 @@ namespace armarx::armem::server::ltm::converter::image protected: std::pair<std::vector<unsigned char>, std::string> _convert(const aron::data::NDArrayPtr& data) final; - aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data, const std::string&) final; + aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) final; }; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.cpp index e8536cf64..03453e6f6 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.cpp @@ -39,23 +39,23 @@ namespace armarx::armem::server::ltm::converter::image return std::make_pair(buffer, ""); } - aron::data::NDArrayPtr PngConverter::_convert(const std::vector<unsigned char>& data, const std::string& m) + aron::data::NDArrayPtr PngConverter::_convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string& m) { if (m == ".rgb") { cv::Mat img = cv::imdecode(data, cv::IMREAD_COLOR); cv::cvtColor(img, img, CV_BGR2RGB); - return aron::converter::AronOpenCVConverter::ConvertFromMat(img); + return aron::converter::AronOpenCVConverter::ConvertFromMat(img, p); } if (m == ".gs") { cv::Mat img = cv::imdecode(data, cv::IMREAD_GRAYSCALE); - return aron::converter::AronOpenCVConverter::ConvertFromMat(img); + return aron::converter::AronOpenCVConverter::ConvertFromMat(img, p); } // try to load without conversion cv::Mat img = cv::imdecode(data, cv::IMREAD_ANYCOLOR); - return aron::converter::AronOpenCVConverter::ConvertFromMat(img); + return aron::converter::AronOpenCVConverter::ConvertFromMat(img, p); } } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.h index 5b6c80134..0c443fa79 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/image/png/PngConverter.h @@ -16,6 +16,6 @@ namespace armarx::armem::server::ltm::converter::image protected: std::pair<std::vector<unsigned char>, std::string> _convert(const aron::data::NDArrayPtr& data) final; - aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data, const std::string&) final; + aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) final; }; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.cpp index 4f0808a6f..e6c334502 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.cpp @@ -9,9 +9,9 @@ namespace armarx::armem::server::ltm return _convert(d); } - aron::data::VariantPtr ObjectConverter::convert(const std::vector<unsigned char>& data, const std::string& m) + aron::data::VariantPtr ObjectConverter::convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string& m) { - auto d = _convert(data, m); + auto d = _convert(data, p, m); return d; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.h index 35f1a9d96..113dd7a5b 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/Converter.h @@ -21,10 +21,10 @@ namespace armarx::armem::server::ltm virtual ~ObjectConverter() = default; std::pair<std::vector<unsigned char>, std::string> convert(const aron::data::VariantPtr& data) final; - aron::data::VariantPtr convert(const std::vector<unsigned char>& data, const std::string&) final; + aron::data::VariantPtr convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) final; protected: virtual std::pair<std::vector<unsigned char>, std::string> _convert(const aron::data::DictPtr& data) = 0; - virtual aron::data::DictPtr _convert(const std::vector<unsigned char>& data, const std::string&) = 0; + virtual aron::data::DictPtr _convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) = 0; }; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.cpp index 8465201f3..4155808d3 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.cpp @@ -24,13 +24,13 @@ namespace armarx::armem::server::ltm::converter::object return std::make_pair(bson, str); } - aron::data::DictPtr BsonConverter::_convert(const std::vector<unsigned char>& data, const std::string& m) + aron::data::DictPtr BsonConverter::_convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string& m) { bsoncxx::document::view view(data.data(), data.size()); nlohmann::json json = bsoncxx::to_json(view); std::string str = json.dump(2); std::vector<unsigned char> jsonVec(str.begin(), str.end()); - auto v = jsonConverter.convert(jsonVec, m); + auto v = jsonConverter.convert(jsonVec, p, m); return aron::data::Dict::DynamicCast(v); } } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.h index 6eb183be2..fddf6870f 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/bson/BsonConverter.h @@ -20,7 +20,7 @@ namespace armarx::armem::server::ltm::converter::object protected: std::pair<std::vector<unsigned char>, std::string> _convert(const aron::data::DictPtr& data) final; - aron::data::DictPtr _convert(const std::vector<unsigned char>& data, const std::string&) final; + aron::data::DictPtr _convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) final; private: JsonConverter jsonConverter; diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp index 1495b275b..c24125140 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp @@ -12,10 +12,10 @@ namespace armarx::armem::server::ltm::converter::object return std::make_pair(std::vector<unsigned char>(str.begin(), str.end()), ""); } - aron::data::DictPtr JsonConverter::_convert(const std::vector<unsigned char>& data, const std::string&) + aron::data::DictPtr JsonConverter::_convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) { std::string str(data.begin(), data.end()); nlohmann::json j = nlohmann::json::parse(str); - return aron::converter::AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject(j); + return aron::converter::AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject(j, p); } } diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.h b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.h index 1b9f86ee9..0c6d71d11 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.h @@ -19,6 +19,6 @@ namespace armarx::armem::server::ltm::converter::object protected: std::pair<std::vector<unsigned char>, std::string> _convert(const aron::data::DictPtr& data) final; - aron::data::DictPtr _convert(const std::vector<unsigned char>& data, const std::string&) final; + aron::data::DictPtr _convert(const std::vector<unsigned char>& data, const armarx::aron::Path& p, const std::string&) final; }; } diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp index cfc859a5f..a6a7aa48e 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp @@ -8,7 +8,7 @@ namespace armarx::armem::server::ltm::disk { - CoreSegment::CoreSegment(const std::filesystem::path& p, const MemoryID& id, const std::shared_ptr<Processors>& filters, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e) : + CoreSegment::CoreSegment(const std::filesystem::path& p, const MemoryID& id /* UNESCAPED */, const std::shared_ptr<Processors>& filters, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e) : CoreSegmentBase(id, filters), DiskMemoryItem(p, EscapeSegmentName(id.memoryName), std::filesystem::path(EscapeSegmentName(id.coreSegmentName))), currentMode(mode), @@ -20,6 +20,7 @@ namespace armarx::armem::server::ltm::disk { auto mPath = getMemoryBasePathForMode(currentMode, currentExport); auto relPath = getRelativePathForMode(currentMode); + if (!util::checkIfBasePathExists(mPath) || !util::checkIfFolderExists(mPath, relPath)) { return false; diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp index 8b00d8d39..ea5ad1757 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp @@ -67,6 +67,7 @@ namespace armarx::armem::server::ltm::disk continue; } + EntitySnapshot c(memoryParentPath, id().withTimestamp(timeFromStringMicroSeconds(usecName)), processors, currentMode, currentExport); func(c); } @@ -77,7 +78,7 @@ namespace armarx::armem::server::ltm::disk bool Entity::forEachSnapshotInIndexRange(long first, long last, std::function<void(EntitySnapshot&)> func) const { - ARMARX_WARNING << "PLEASE NOTE THAT QUERYING THE LTM INDEX WISE MAY BE BUGGY BECAUSE THE FILESYSTEM ITERATOR IS UNSORTED!"; + //ARMARX_WARNING << "PLEASE NOTE THAT QUERYING THE LTM INDEX WISE MAY BE BUGGY BECAUSE THE FILESYSTEM ITERATOR IS UNSORTED!"; if (first < 0 or last < 0) { @@ -96,11 +97,11 @@ namespace armarx::armem::server::ltm::disk long checked = 0; auto f = [&](EntitySnapshot& e) { - checked++; if (checked >= first && checked <= last) { func(e); } + checked++; }; return forEachSnapshot(std::move(f)); diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp index f1706a545..aea0141b6 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp @@ -12,7 +12,7 @@ namespace armarx::armem::server::ltm::disk { - EntitySnapshot::EntitySnapshot(const std::filesystem::path& p, const MemoryID& id, const std::shared_ptr<Processors>& filters, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e) : + EntitySnapshot::EntitySnapshot(const std::filesystem::path& p, const MemoryID& id /* UNESCAPED */, const std::shared_ptr<Processors>& filters, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e) : EntitySnapshotBase(id, filters), DiskMemoryItem(p, EscapeSegmentName(id.memoryName), std::filesystem::path(EscapeSegmentName(id.coreSegmentName)) @@ -29,6 +29,7 @@ namespace armarx::armem::server::ltm::disk { auto mPath = getMemoryBasePathForMode(currentMode, currentExport); auto relPath = getRelativePathForMode(currentMode); + if (!util::checkIfBasePathExists(mPath) || !util::checkIfFolderExists(mPath, relPath)) { return; @@ -82,10 +83,10 @@ namespace armarx::armem::server::ltm::disk { //ARMARX_INFO << "Convert data for entity " << id(); auto datafilecontent = util::readDataFromFile(mPath, relDataPath); - auto dataaron = dictConverter.convert(datafilecontent, ""); + auto dataaron = dictConverter.convert(datafilecontent, {}, ""); datadict = aron::data::Dict::DynamicCastAndCheck(dataaron); - // check for special members + // check for special members TODO: only allowed for direct children? for (const auto& [key, m] : datadict->getElements()) { for (auto& [t, f] : processors->converters) @@ -98,7 +99,7 @@ namespace armarx::armem::server::ltm::disk std::string mode = simox::alg::remove_suffix(simox::alg::remove_prefix(filename, key), f->suffix); auto memberfilecontent = util::readDataFromFile(mPath, relMemberPath); - auto memberaron = f->convert(memberfilecontent, mode); + auto memberaron = f->convert(memberfilecontent, armarx::aron::Path(datadict->getPath(), std::vector<std::string>{key}), mode); datadict->setElement(key, memberaron); break; } @@ -115,7 +116,7 @@ namespace armarx::armem::server::ltm::disk if (std::find(allFilesInIndexFolder.begin(), allFilesInIndexFolder.end(), metadataFilename) != allFilesInIndexFolder.end()) { auto metadatafilecontent = util::readDataFromFile(mPath, relMetadataPath); - auto metadataaron = dictConverter.convert(metadatafilecontent, ""); + auto metadataaron = dictConverter.convert(metadatafilecontent, {}, ""); metadatadict = aron::data::Dict::DynamicCastAndCheck(metadataaron); } else diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp index a2a374c6d..31f5bd810 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp @@ -71,6 +71,7 @@ namespace armarx::armem::server::ltm::disk { MemoryEncodingMode mode = i == 0 ? MemoryEncodingMode::FILESYSTEM : defaultExportEncodingMode; auto mPath = getMemoryBasePathForMode(mode, i); + if (util::checkIfBasePathExists(mPath)) { for (const auto& subdirName : util::getAllDirectories(mPath, getRelativePathForMode(mode))) diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp index 32500f7d6..631461f46 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp @@ -10,7 +10,7 @@ namespace armarx::armem::server::ltm::disk { - ProviderSegment::ProviderSegment(const std::filesystem::path& p, const MemoryID& id, const std::shared_ptr<Processors>& filters, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e) : + ProviderSegment::ProviderSegment(const std::filesystem::path& p, const MemoryID& id /* UNESCAPED */, const std::shared_ptr<Processors>& filters, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e) : ProviderSegmentBase(id, filters), DiskMemoryItem(p, EscapeSegmentName(id.memoryName), std::filesystem::path(EscapeSegmentName(id.coreSegmentName)) / EscapeSegmentName(id.providerSegmentName)), currentMode(mode), @@ -22,6 +22,7 @@ namespace armarx::armem::server::ltm::disk { auto mPath = getMemoryBasePathForMode(currentMode, currentExport); auto relPath = getRelativePathForMode(currentMode); + if (!util::checkIfBasePathExists(mPath) || !util::checkIfFolderExists(mPath, relPath)) { return false; @@ -30,7 +31,7 @@ namespace armarx::armem::server::ltm::disk for (const auto& subdirName : util::getAllDirectories(mPath, relPath)) { std::string segmentName = UnescapeSegmentName(subdirName); - Entity c(memoryParentPath, id().withEntityName(subdirName), processors, currentMode, currentExport); + Entity c(memoryParentPath, id().withEntityName(segmentName), processors, currentMode, currentExport); func(c); } return true; diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h index d9f64fc7a..70250e824 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h @@ -2,6 +2,8 @@ #include "../../base/EntityQueryProcessorBase.h" +#include <ArmarXCore/core/logging/Logging.h> + namespace armarx::armem::server::query_proc::ltm::detail { diff --git a/source/RobotAPI/libraries/aron/converter/common/VectorConverter.h b/source/RobotAPI/libraries/aron/converter/common/VectorConverter.h index 096e4830c..14b3ffc96 100644 --- a/source/RobotAPI/libraries/aron/converter/common/VectorConverter.h +++ b/source/RobotAPI/libraries/aron/converter/common/VectorConverter.h @@ -37,37 +37,97 @@ 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) + { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK(elements * sizeof(T) == size); + + std::vector<T> v(elements); + memcpy(v.data(), data, size); + + return v; + } + public: AronVectorConverter() = delete; template<typename T> - static std::vector<T> ConvertToVector(const data::NDArrayPtr& nav) + static std::vector<std::vector<T>> ConvertTo2DVector(const data::NDArray& nav) { - ARMARX_CHECK_NOT_NULL(nav); + const auto& dims = nav.getShape(); - const auto& dims = nav->getShape(); + if (dims.size() != 3) + { + throw error::AronException(__PRETTY_FUNCTION__, "The NDArray must have 3 dimensions.", nav.getPath()); + } - if (dims.size() != 2) + if (dims.at(dims.size()-1) != sizeof(T)) { - throw error::AronException(__PRETTY_FUNCTION__, "The NDArray must have two dimensions.", nav->getPath()); + throw error::AronException(__PRETTY_FUNCTION__, "Last dimension of the array has to match the element size.", nav.getPath()); } - if (dims.at(1) != sizeof(T)) + const int one_row_size = dims.at(1) * dims.at(2); + std::vector<std::vector<T>> v(dims.at(0)); + for (int i = 0; i < dims.at(0); i++) { - throw error::AronException(__PRETTY_FUNCTION__, "Dimension 1 of the array has to match the element size.", nav->getPath()); + v[i] = convert_to_1d_vector<T>(nav.getData(), dims.at(1), i * one_row_size, one_row_size); } - const int size = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<>()); + return v; + } + + template<typename T> + static std::vector<std::vector<T>> ConvertTo2DVector(const data::NDArrayPtr& nav) + { + ARMARX_CHECK_NOT_NULL(nav); - std::vector<T> v(dims.at(0)); - memcpy(v.data(), nav->getData(), size); + return ConvertTo2DVector<T>(*nav); + } + template<typename T> + static std::vector<T> ConvertTo1DVector(const data::NDArray& nav, const bool allowFlatten = false) + { + const auto& dims = nav.getShape(); + + if (!allowFlatten && dims.size() != 2) + { + throw error::AronException(__PRETTY_FUNCTION__, "The NDArray must have 2 dimensions.", nav.getPath()); + } + + 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()); + } + + ARMARX_CHECK(dims.size() >= 1); + + 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); return v; } + template<typename T> + static std::vector<T> ConvertTo1DVector(const data::NDArrayPtr& nav, const bool allowFlatten = false) + { + ARMARX_CHECK_NOT_NULL(nav); + return ConvertTo1DVector<T>(*nav, allowFlatten); + } + + // alias template<typename T> - static data::NDArrayPtr ConvertFromVector(const std::vector<T>& data) + static std::vector<T> ConvertToVector(const data::NDArrayPtr& nav, const bool allowFlatten = false) + { + return ConvertTo1DVector<T>(nav, allowFlatten); + } + + + // Attention: If a vector was flattened, the reconstruction is flattened as well! + template<typename T> + static data::NDArrayPtr ConvertFrom1DVector(const std::vector<T>& data) { data::NDArrayPtr ndArr(new data::NDArray); @@ -77,6 +137,13 @@ namespace armarx::aron::converter return ndArr; } + // alias + template<typename T> + static data::NDArrayPtr ConvertFromVector(const std::vector<T>& data) + { + return ConvertFrom1DVector<T>(data); + } + }; } // namespace armarx::aron::converter diff --git a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp index 3729e90a5..e083d4710 100644 --- a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp +++ b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp @@ -28,18 +28,19 @@ namespace armarx::aron::converter j = aron::type::readAndWrite<type::FromVariantConverter<type::writer::NlohmannJSONWriter>>(aron); } - data::DictPtr AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject(const nlohmann::json& j) + data::DictPtr AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject(const nlohmann::json& j, const armarx::aron::Path& p) { // TODO Switch case over json type and add other methods, e.g. for float, array, ... // TODO add check if json is object_t - data::VariantPtr aron = std::make_shared<aron::data::Dict>(); + data::VariantPtr aron = std::make_shared<aron::data::Dict>(p); ConvertFromNlohmannJSON(aron, j); return data::Dict::DynamicCastAndCheck(aron); } - type::ObjectPtr AronNlohmannJSONConverter::ConvertFromNlohmannJSONTypeObject(const nlohmann::json& j) + type::ObjectPtr AronNlohmannJSONConverter::ConvertFromNlohmannJSONTypeObject(const nlohmann::json& j, const armarx::aron::Path& p) { - type::VariantPtr aron = std::make_shared<aron::type::Object>("foo"); // foo is just a placeholder + type::ObjectPtr foo = std::make_shared<aron::type::Object>("foo"); // foo is just a placeholder + type::VariantPtr aron = std::make_shared<aron::type::Object>(*foo, p); ConvertFromNlohmannJSON(aron, j); return type::Object::DynamicCastAndCheck(aron); } diff --git a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h index 6cce4d7e3..0902ed0c3 100644 --- a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h +++ b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h @@ -38,10 +38,10 @@ namespace armarx::aron::converter static nlohmann::json ConvertToNlohmannJSON(const type::VariantPtr&); static void ConvertToNlohmannJSON(const type::VariantPtr&, nlohmann::json&); - static data::DictPtr ConvertFromNlohmannJSONObject(const nlohmann::json&); + static data::DictPtr ConvertFromNlohmannJSONObject(const nlohmann::json&, const armarx::aron::Path& p = {}); static void ConvertFromNlohmannJSON(data::VariantPtr&, const nlohmann::json&, const aron::type::VariantPtr& = nullptr); - static type::ObjectPtr ConvertFromNlohmannJSONTypeObject(const nlohmann::json& j); + static type::ObjectPtr ConvertFromNlohmannJSONTypeObject(const nlohmann::json& j, const armarx::aron::Path& p = {}); static void ConvertFromNlohmannJSON(aron::type::VariantPtr& a, const nlohmann::json& e); }; } diff --git a/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.cpp b/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.cpp index 6208bd9b4..d232500c2 100644 --- a/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.cpp +++ b/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.cpp @@ -45,7 +45,7 @@ namespace armarx::aron::converter return ret; } - data::NDArrayPtr AronOpenCVConverter::ConvertFromMat(const cv::Mat& mat) + data::NDArrayPtr AronOpenCVConverter::ConvertFromMat(const cv::Mat& mat, const armarx::aron::Path& p) { std::vector<int> dims; for (int i = 0; i < mat.dims; ++i) @@ -54,7 +54,7 @@ namespace armarx::aron::converter } dims.push_back(mat.elemSize()); - auto ret = std::make_shared<data::NDArray>(); + auto ret = std::make_shared<data::NDArray>(p); ret->setShape(dims); ret->setType(std::to_string(mat.type())); ret->setData(std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()), reinterpret_cast<const unsigned char*>(mat.data)); diff --git a/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.h b/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.h index 5223ce3da..fb4f21487 100644 --- a/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.h +++ b/source/RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.h @@ -41,7 +41,7 @@ namespace armarx::aron::converter public: static cv::Mat ConvertToMat(const data::NDArrayPtr&); - static data::NDArrayPtr ConvertFromMat(const cv::Mat&); + static data::NDArrayPtr ConvertFromMat(const cv::Mat&, const armarx::aron::Path& = {}); }; } -- GitLab