From 9a472af9c6163dc565dda7411e9b0afc4705617d Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Mon, 12 Apr 2021 21:18:21 +0200 Subject: [PATCH] fixing query --- source/RobotAPI/libraries/armem/util/util.h | 40 ++++++++----- .../armem_robot_mapping/MappingDataReader.cpp | 56 +++++++++++-------- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/source/RobotAPI/libraries/armem/util/util.h b/source/RobotAPI/libraries/armem/util/util.h index 8dcb4b997..4fa457ab6 100644 --- a/source/RobotAPI/libraries/armem/util/util.h +++ b/source/RobotAPI/libraries/armem/util/util.h @@ -22,6 +22,7 @@ #pragma once +#include "ArmarXCore/core/logging/Logging.h" #include <vector> #include <optional> @@ -29,14 +30,15 @@ #include <RobotAPI/libraries/armem/core/EntityInstance.h> #include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h> -namespace armarx::armem { +namespace armarx::armem +{ /** * @brief Tries to cast a armem::EntityInstance to AronClass - * + * * @tparam AronClass class name. Needs to be derived from armarx::aron::cppcodegenerator::AronCppClass - * @param item - * @return std::optional<AronClass> + * @param item + * @return std::optional<AronClass> */ template <typename AronClass> std::optional<AronClass> tryCast(const EntityInstance& item) @@ -58,10 +60,10 @@ namespace armarx::armem { /** * @brief Returns all entities that can be cast to AronClass - * + * * @tparam AronClass class name. Needs to be derived from armarx::aron::cppcodegenerator::AronCppClass * @param entities collection of entities - * @return std::vector<AronClass> + * @return std::vector<AronClass> */ template <typename AronClass> std::vector<AronClass> @@ -93,8 +95,8 @@ namespace armarx::armem { } /** - * @brief filter + transform for entities. - * + * @brief filter + transform for entities. + * * Can be used instead of * * std::vector<Bar> ret; @@ -102,26 +104,38 @@ namespace armarx::armem { * const auto allOf = allOfType<Foo>(entities); * std::transform(allOf.begin(), allOf.end(), std::back_inserter(ret), pred) * - * This function has the benefit that the transform function will be applied directly. - * No intermediate vector has to be created (e.g. "allOf" in the example above). - * + * This function has the benefit that the transform function will be applied directly. + * No intermediate vector has to be created (e.g. "allOf" in the example above). + * * @tparam AronClass class name. Needs to be derived from armarx::aron::cppcodegenerator::AronCppClass * @param entities collection of entities * @param pred binary predicate function, applied to all entity instances - * @return vector of "pred"-transformed elements that can be cast to AronClass + * @return vector of "pred"-transformed elements that can be cast to AronClass */ template <typename AronClass> auto transformAllOfType(const std::map<std::string, Entity>& entities, - auto pred) -> std::vector<decltype(pred(AronClass()))> + auto pred) -> std::vector<decltype(pred(AronClass()))> { static_assert(std::is_base_of<armarx::aron::cppcodegenerator::AronCppClass, AronClass>::value); std::vector<decltype(pred(AronClass()))> outV; + if (entities.empty()) + { + ARMARX_WARNING << "No entities!"; + } + // loop over all entities and their snapshots for (const auto &[s, entity] : entities) { + if (entity.history.empty()) + { + ARMARX_WARNING << "Empty history for " << s; + } + + ARMARX_INFO << "History size: " << entity.history.size(); + for (const auto &[ss, entitySnapshot] : entity.history) { for (const auto& entityInstance : entitySnapshot.instances) diff --git a/source/RobotAPI/libraries/armem_robot_mapping/MappingDataReader.cpp b/source/RobotAPI/libraries/armem_robot_mapping/MappingDataReader.cpp index 126c6b003..01250bbb4 100644 --- a/source/RobotAPI/libraries/armem_robot_mapping/MappingDataReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_mapping/MappingDataReader.cpp @@ -10,19 +10,19 @@ #include <RobotAPI/libraries/armem/core/EntityInstance.h> #include <RobotAPI/libraries/armem/core/EntitySnapshot.h> #include <RobotAPI/libraries/armem/util/util.h> +#include <RobotAPI/libraries/armem_robot_mapping/aron/LaserScan.aron.generated.h> #include <RobotAPI/libraries/armem_robot_mapping/aron_conversions.h> #include <RobotAPI/libraries/armem_robot_mapping/types.h> #include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h> -#include <RobotAPI/libraries/armem_robot_mapping/aron/LaserScan.aron.generated.h> namespace armarx::armem { - MappingDataReader::MappingDataReader(ManagedIceObject& component) : armarx::armem::MemoryConnector(component) {} + MappingDataReader::MappingDataReader(ManagedIceObject& component) + : armarx::armem::MemoryConnector(component) {} MappingDataReader::~MappingDataReader() = default; - void MappingDataReader::registerPropertyDefinitions( armarx::PropertyDefinitionsPtr& def) { @@ -60,34 +60,42 @@ namespace armarx::armem { armem::client::query::Builder qb; - // clang-format off - auto qbProviderSegments = qb - .coreSegments().withName(properties.mappingMemoryName) - .providerSegments().withName(query.agent); - // clang-format on + ARMARX_INFO << "Query for agent: " << query.agent + << " memory name: " << properties.mappingMemoryName; - auto& qbEntities = [&]() -> armarx::armem::client::query::EntitySelector & + if (query.sensorList.empty()) // all sensors { - if (query.sensorList.empty()) - { - return qbProviderSegments.entities().all(); - } - - return qbProviderSegments.entities().withNames(query.sensorList); - }(); - - qbEntities.snapshots().timeRange( - IceUtil::Time::microSeconds(query.timeRange.min), - IceUtil::Time::microSeconds(query.timeRange.max)); + // clang-format off + qb + .coreSegments().withName(properties.mappingMemoryName) + .providerSegments().withName(query.agent) + .entities().all() + .snapshots().timeRange( + IceUtil::Time::microSeconds(query.timeRange.min), + IceUtil::Time::microSeconds(query.timeRange.max)); + // clang-format on + } + else + { + // clang-format off + qb + .coreSegments().withName(properties.mappingMemoryName) + .providerSegments().withName(query.agent) + .entities().withNames(query.sensorList) + .snapshots().timeRange( + IceUtil::Time::microSeconds(query.timeRange.min), + IceUtil::Time::microSeconds(query.timeRange.max)); + // clang-format on + } return qb; - } + } MappingDataReader::Result MappingDataReader::queryData(const Query& query) const { - auto qb = buildQuery(query); + const auto qb = buildQuery(query); ARMARX_IMPORTANT << "[MappingDataReader] query ... "; @@ -98,6 +106,8 @@ namespace armarx::armem if (not qResult.success) { + ARMARX_WARNING << "Failed to query data from memory: " + << qResult.errorMessage; return {.laserScans = {}, .status = Result::Status::Error, .errorMessage = qResult.errorMessage}; @@ -123,4 +133,4 @@ namespace armarx::armem .errorMessage = ""}; } -} // namespace armarx::armem \ No newline at end of file +} // namespace armarx::armem -- GitLab