diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp index b80a0a07c82ac6ee452b7cab489cee1f12e11b3b..d11b7421313e4586e4347b31c9f8c79c09f169f5 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp @@ -6,14 +6,13 @@ #include "ArmarXCore/core/logging/Logging.h" #include <ArmarXCore/core/PackagePath.h> -#include "RobotAPI/libraries/armem/core/Time.h" #include "RobotAPI/libraries/armem/client/query/Builder.h" +#include "RobotAPI/libraries/armem/core/Time.h" #include "RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h" -#include "RobotAPI/libraries/armem_robot/robot_conversions.h" #include "RobotAPI/libraries/armem_robot/aron_conversions.h" +#include "RobotAPI/libraries/armem_robot/robot_conversions.h" #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h> - namespace fs = ::std::filesystem; namespace armarx::armem::articulated_object @@ -38,7 +37,6 @@ namespace armarx::armem::articulated_object def->optional(properties.providerName, prefix + "ProviderName"); } - void Reader::connect() { // Wait for the memory to become available and add it as dependency. @@ -55,7 +53,7 @@ namespace armarx::armem::articulated_object memoryReader.setReadingMemory(result.proxy); armem::MemoryID id = armem::MemoryID(); - id.memoryName = properties.memoryName; + id.memoryName = properties.memoryName; id.coreSegmentName = properties.coreClassSegmentName; // listen to all provider segments! @@ -72,7 +70,8 @@ namespace armarx::armem::articulated_object // TODO(fabian.reister): implement } - void Reader::updateKnownObjects(const armem::MemoryID& subscriptionID, const std::vector<armem::MemoryID>& snapshotIDs) + void Reader::updateKnownObjects(const armem::MemoryID& subscriptionID, + const std::vector<armem::MemoryID>& snapshotIDs) { ARMARX_INFO << "New objects available!"; @@ -89,15 +88,14 @@ namespace armarx::armem::articulated_object // const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); - // std::for_each(snapshotIDs.begin(), snapshotIDs.end(), [&](const auto & snapshotID) // { // updateKnownObject(snapshotID); // }); } - - std::optional<ArticulatedObject> Reader::get(const std::string& name, const armem::Time& timestamp) + std::optional<ArticulatedObject> Reader::get(const std::string& name, + const armem::Time& timestamp) { const auto description = queryDescription(name, timestamp); @@ -110,17 +108,13 @@ namespace armarx::armem::articulated_object return get(*description, timestamp); } - ArticulatedObject Reader::get(const ArticulatedObjectDescription& description, const armem::Time& timestamp) { - ArticulatedObject obj - { - .description = description, - .instance = "", // TODO(fabian.reister): - .config = {}, // will be populated by synchronize - .timestamp = timestamp - }; + ArticulatedObject obj{.description = description, + .instance = "", // TODO(fabian.reister): + .config = {}, // will be populated by synchronize + .timestamp = timestamp}; synchronize(obj, timestamp); @@ -165,7 +159,8 @@ namespace armarx::armem::articulated_object return getRobotDescriptions(qResult.memory); } - std::optional<robot::RobotDescription> Reader::queryDescription(const std::string& name, const armem::Time& timestamp) + std::optional<robot::RobotDescription> Reader::queryDescription(const std::string& name, + const armem::Time& timestamp) { // Query all entities from provider. armem::client::query::Builder qb; @@ -174,8 +169,8 @@ namespace armarx::armem::articulated_object qb .coreSegments().withName(properties.coreClassSegmentName) .providerSegments().all() // TODO(fabian.reister): think about this: which authority is trustworthy? - .entities().withName(name) - .snapshots().atTime(timestamp); + .entities().all() // withName(name) + .snapshots().latest(); // clang-format on const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); @@ -184,13 +179,15 @@ namespace armarx::armem::articulated_object if (not qResult.success) /* c++20 [[unlikely]] */ { + ARMARX_WARNING << qResult.errorMessage; return std::nullopt; } return getRobotDescription(qResult.memory); } - std::optional<robot::RobotState> Reader::queryState(const robot::RobotDescription& description, const armem::Time& timestamp) + std::optional<robot::RobotState> Reader::queryState(const robot::RobotDescription& description, + const armem::Time& timestamp) { // TODO(fabian.reister): how to deal with multiple providers? @@ -200,9 +197,9 @@ namespace armarx::armem::articulated_object // clang-format off qb .coreSegments().withName(properties.coreInstanceSegmentName) - .providerSegments().withName(properties.providerName) // agent + .providerSegments().all() // withName(properties.providerName) // agent .entities().withName(description.name) - .snapshots().atTime(timestamp); + .snapshots().latest(); // clang-format on const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); @@ -217,76 +214,91 @@ namespace armarx::armem::articulated_object return getRobotState(qResult.memory); } - - std::optional<robot::RobotState> Reader::getRobotState(const armarx::armem::wm::Memory& memory) const + std::optional<robot::RobotState> + Reader::getRobotState(const armarx::armem::wm::Memory& memory) const { // clang-format off - const armem::wm::ProviderSegment& providerSegment = memory - .getCoreSegment(properties.coreInstanceSegmentName) - .getProviderSegment(properties.providerName); + const armem::wm::CoreSegment& coreSegment = memory + .getCoreSegment(properties.coreInstanceSegmentName); // clang-format on - const auto entities = simox::alg::get_values(providerSegment.entities()); - if (entities.empty()) + for (const auto &[_, providerSegment] : coreSegment.providerSegments()) { - ARMARX_WARNING << "No entity found"; - return std::nullopt; - } - const auto entitySnapshots = simox::alg::get_values(entities.front().history()); + const auto entities = simox::alg::get_values(providerSegment.entities()); - if (entitySnapshots.empty()) - { - ARMARX_WARNING << "No entity snapshots found"; - return std::nullopt; - } + if (entities.empty()) + { + ARMARX_WARNING << "No entity found"; + continue; + } - // TODO(fabian.reister): check if 0 available - const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0); + const auto entitySnapshots = simox::alg::get_values(entities.front().history()); - return robot::convertRobotState(instance); - } + if (entitySnapshots.empty()) + { + ARMARX_WARNING << "No entity snapshots found"; + continue; + } + // TODO(fabian.reister): check if 0 available + const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0); + return robot::convertRobotState(instance); + } + + return std::nullopt; + } - std::optional<robot::RobotDescription> Reader::getRobotDescription(const armarx::armem::wm::Memory& memory) const + std::optional<robot::RobotDescription> + Reader::getRobotDescription(const armarx::armem::wm::Memory& memory) const { // clang-format off - const armem::wm::ProviderSegment& providerSegment = memory - .getCoreSegment(properties.coreClassSegmentName) - .getProviderSegment(properties.providerName); // TODO(fabian.reister): all + const armem::wm::CoreSegment& coreSegment = memory + .getCoreSegment(properties.coreClassSegmentName); + // .getProviderSegment(properties.providerName); // TODO(fabian.reister): all // clang-format on - const auto entities = simox::alg::get_values(providerSegment.entities()); - if (entities.empty()) + for (const auto &[_, providerSegment] : coreSegment.providerSegments()) { - ARMARX_WARNING << "No entity found"; - return std::nullopt; - } + const auto entities = simox::alg::get_values(providerSegment.entities()); + + if (entities.empty()) + { + ARMARX_WARNING << "No entity found"; + continue; + // return std::nullopt; + } - const auto entitySnapshots = simox::alg::get_values(entities.front().history()); + const auto entitySnapshots = simox::alg::get_values(entities.front().history()); - if (entitySnapshots.empty()) - { - ARMARX_WARNING << "No entity snapshots found"; - return std::nullopt; - } + if (entitySnapshots.empty()) + { + ARMARX_WARNING << "No entity snapshots found"; + continue; + // return std::nullopt; + } + + // TODO(fabian.reister): check if 0 available + const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0); - // TODO(fabian.reister): check if 0 available - const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0); + return robot::convertRobotDescription(instance); + } - return robot::convertRobotDescription(instance); + return std::nullopt; } - std::vector<robot::RobotDescription> Reader::getRobotDescriptions(const armarx::armem::wm::Memory& memory) const + std::vector<robot::RobotDescription> + Reader::getRobotDescriptions(const armarx::armem::wm::Memory& memory) const { std::vector<robot::RobotDescription> descriptions; - const armem::wm::CoreSegment& coreSegment = memory.getCoreSegment(properties.coreClassSegmentName); + const armem::wm::CoreSegment& coreSegment = + memory.getCoreSegment(properties.coreClassSegmentName); - for (const auto& [providerName, providerSegment] : coreSegment.providerSegments()) + for (const auto &[providerName, providerSegment] : coreSegment.providerSegments()) { - for (const auto& [name, entity] : providerSegment.entities()) + for (const auto &[name, entity] : providerSegment.entities()) { if (entity.empty()) { @@ -309,5 +321,4 @@ namespace armarx::armem::articulated_object return descriptions; } - } // namespace armarx::armem::articulated_object \ No newline at end of file