From 3143ce7e6161bc9dfae4cb200e7e0034013d052f Mon Sep 17 00:00:00 2001 From: alissa <alissamueller@outlook.de> Date: Fri, 9 Jul 2021 16:33:56 +0200 Subject: [PATCH] GraspReader now uses FunctionalVisitor --- .../GraspProviderExample.cpp | 4 +- .../GraspingUtility/GraspCandidateReader.cpp | 145 +++++++++++------- .../GraspingUtility/GraspCandidateReader.h | 8 +- .../workingmemory/visitor/FunctionalVisitor.h | 12 +- 4 files changed, 104 insertions(+), 65 deletions(-) diff --git a/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp b/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp index 31b7f565b..300be5e5c 100644 --- a/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp +++ b/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp @@ -79,7 +79,7 @@ namespace armarx CycleUtil c(1000); int i = 0; - grasping::GraspCandidateSeq candidates; + while (!task->isStopped() && i++ < 100) { // initialize all necessary fields of a grasp candidate and use writer to commit it to memory @@ -104,7 +104,7 @@ namespace armarx bimanualCandidate.inwardsVectorRight = Vector3BasePtr(toIce(Eigen::Vector3f())); writer.commitBimanualGraspCandidate(bimanualCandidate, armem::Time::now()); - candidates = reader.queryLatest(); + grasping::GraspCandidateSeq candidates = reader.queryLatestGraspCandidates(); for (auto ca : candidates) { diff --git a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp index 9fae422a7..8c707b853 100644 --- a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp +++ b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp @@ -4,6 +4,7 @@ #include <RobotAPI/libraries/GraspingUtility/aron_conversions.h> #include <RobotAPI/libraries/armem/core/error/mns.h> #include <RobotAPI/libraries/armem/util/util.h> +#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h> namespace armarx::armem { @@ -32,87 +33,127 @@ namespace armarx::armem } - armarx::grasping::GraspCandidateSeq asGraspCandidates(const std::map<std::string, wm::Entity>& entities) + + + armarx::grasping::GraspCandidate asGraspCandidate(const armem::wm::EntityInstance& instance) { - armarx::grasping::GraspCandidateSeq outV; + armarx::grasping::GraspCandidate candidate; - if (entities.empty()) - { - ARMARX_WARNING << "No entities!"; - } + grasping::arondto::GraspCandidate aronTransform; + aronTransform.fromAron(instance.data()); - const auto convert = [](const armarx::grasping::arondto::GraspCandidate & aronGraspCandidate, - const wm::EntityInstance & ei) -> armarx::grasping::GraspCandidate - { - armarx::grasping::GraspCandidate graspCandidate; - fromAron(aronGraspCandidate, graspCandidate); + fromAron(aronTransform, candidate); - //const auto ndArrayNavigator = aron::datanavigator::NDArrayNavigator::DynamicCast(ei.data()->getElement("scan")); + return candidate; + } - //ARMARX_CHECK_NOT_NULL(ndArrayNavigator); + armarx::grasping::BimanualGraspCandidate asBimanualGraspCandidate(const armem::wm::EntityInstance& instance) + { + armarx::grasping::BimanualGraspCandidate candidate; - //graspCandidate.data = fromAron<GraspCandidate>(ndArrayNavigator); + grasping::arondto::BimanualGraspCandidate aronTransform; + aronTransform.fromAron(instance.data()); + fromAron(aronTransform, candidate); - return graspCandidate; + return candidate; + } - }; - ARMARX_INFO << "Before for loop"; - // loop over all entities and their snapshots - for (const auto &[s, entity] : entities) + grasping::GraspCandidateSeq GraspCandidateReader::queryLatestGraspCandidates(std::string provider) const + { + + armem::client::query::Builder qb; + + ARMARX_INFO << "Query for memory name: " << properties.memoryName; + + + if (provider != "") + { + qb + .coreSegments().withName(properties.graspCandidateMemoryName) + .providerSegments().withName(provider) + .entities().all() + .snapshots().latest(); + } + else + { + qb + .coreSegments().withName(properties.graspCandidateMemoryName) + .providerSegments().all() + .entities().all() + .snapshots().latest(); + } + + const armem::client::QueryResult qResult = + memoryReader.query(qb.buildQueryInput()); + + if (!qResult.success) { - if (entity.empty()) - { - ARMARX_WARNING << "Empty history for " << s; - } - - ARMARX_INFO << "History size: " << entity.size(); - - for (const auto &[ss, entitySnapshot] : entity) - { - for (const auto& entityInstance : entitySnapshot.instances()) - { - const auto o = tryCast<armarx::grasping::arondto::GraspCandidate>(entityInstance); - - if (o) - { - armarx::grasping::GraspCandidate candidate = convert(*o, entityInstance); - armarx::grasping::GraspCandidatePtr ptr = armarx::grasping::GraspCandidatePtr(&candidate); - outV.push_back(ptr); - } - } - } + // todo catch in provider + throw armem::error::QueryFailed(properties.memoryName, qResult.errorMessage); } - return outV; + + armarx::grasping::GraspCandidateSeq candidates; + + armem::wm::FunctionalVisitor visitor; + visitor.instanceConstFn = [&candidates](armem::wm::EntityInstance const & instance) + { + candidates.push_back(new grasping::GraspCandidate(asGraspCandidate(instance))); + return true; + }; + + visitor.applyTo(qResult.memory); + + + return candidates; } - grasping::GraspCandidateSeq GraspCandidateReader::queryLatest() const + grasping::BimanualGraspCandidateSeq GraspCandidateReader::queryLatestBimanualGraspCandidates(std::string provider) const { armem::client::query::Builder qb; ARMARX_INFO << "Query for memory name: " << properties.memoryName; - // clang-format off - qb - .coreSegments().withName(properties.graspCandidateMemoryName) - .providerSegments().all() - .entities().all() - .snapshots().all(); + if (provider != "") + { + qb + .coreSegments().withName(properties.bimanualGraspCandidateMemoryName) + .providerSegments().withName(provider) + .entities().all() + .snapshots().latest(); + } + else + { + qb + .coreSegments().withName(properties.bimanualGraspCandidateMemoryName) + .providerSegments().all() + .entities().all() + .snapshots().latest(); + } const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); if (!qResult.success) { + // todo catch in provider throw armem::error::QueryFailed(properties.memoryName, qResult.errorMessage); } - const auto& entities = - qResult.memory.getCoreSegment(properties.graspCandidateMemoryName).getProviderSegment("Example") - .entities(); - const auto candidates = asGraspCandidates(entities); + + armarx::grasping::BimanualGraspCandidateSeq candidates; + + armem::wm::FunctionalVisitor visitor; + visitor.instanceConstFn = [&candidates](armem::wm::EntityInstance const & instance) + { + candidates.push_back(new grasping::BimanualGraspCandidate(asBimanualGraspCandidate(instance))); + return true; + }; + + visitor.applyTo(qResult.memory); + return candidates; } diff --git a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h index d0a66f036..5204b6dd8 100644 --- a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h +++ b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h @@ -14,15 +14,13 @@ namespace armarx::armem void connect(); + grasping::GraspCandidateSeq queryLatestGraspCandidates(std::string provider = "") const; - - grasping::GraspCandidateSeq queryLatest() const; + grasping::BimanualGraspCandidateSeq queryLatestBimanualGraspCandidates(std::string provider = "") const; void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def); - //client::query::Builder buildQuery(const Query& query) const ; - private: armem::client::Reader memoryReader; @@ -30,7 +28,7 @@ namespace armarx::armem // Properties struct Properties { - std::string memoryName = "Grasp"; + std::string memoryName = "Grasp"; std::string graspCandidateMemoryName = "GraspCandidate"; std::string bimanualGraspCandidateMemoryName = "BimanualGraspCandidate"; } properties; diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h index 1c1b46e13..34390a182 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h +++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h @@ -53,28 +53,28 @@ namespace armarx::armem::wm bool visitEnter(const Memory& memory) override { - return memoryFn ? memoryConstFn(memory) : Visitor::visitEnter(memory); + return memoryConstFn ? memoryConstFn(memory) : Visitor::visitEnter(memory); } bool visitEnter(const CoreSegment& coreSegment) override { - return coreSegmentFn ? coreSegmentConstFn(coreSegment) : Visitor::visitEnter(coreSegment); + return coreSegmentConstFn ? coreSegmentConstFn(coreSegment) : Visitor::visitEnter(coreSegment); } bool visitEnter(const ProviderSegment& providerSegment) override { - return providerSegmentFn ? providerSegmentConstFn(providerSegment) : Visitor::visitEnter(providerSegment); + return providerSegmentConstFn ? providerSegmentConstFn(providerSegment) : Visitor::visitEnter(providerSegment); } bool visitEnter(const Entity& entity) override { - return entityFn ? entityConstFn(entity) : Visitor::visitEnter(entity); + return entityConstFn ? entityConstFn(entity) : Visitor::visitEnter(entity); } bool visitEnter(const EntitySnapshot& snapshot) override { - return memoryFn ? snapshotConstFn(snapshot) : Visitor::visitEnter(snapshot); + return snapshotConstFn ? snapshotConstFn(snapshot) : Visitor::visitEnter(snapshot); } bool visit(const EntityInstance& instance) override { - return instanceFn ? instanceConstFn(instance) : Visitor::visit(instance); + return instanceConstFn ? instanceConstFn(instance) : Visitor::visit(instance); } -- GitLab