From 5958c6a07088ab768d4fcbc3635f1351c39df266 Mon Sep 17 00:00:00 2001 From: alissa <alissamueller@outlook.de> Date: Tue, 29 Jun 2021 18:04:45 +0200 Subject: [PATCH] Adding functionality to GraspReader (WIP) --- .../GraspProviderExample.cpp | 14 +++- .../GraspProviderExample.h | 4 +- .../GraspingUtility/GraspCandidateReader.cpp | 80 +++++++------------ .../GraspingUtility/GraspCandidateReader.h | 47 +---------- 4 files changed, 46 insertions(+), 99 deletions(-) diff --git a/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp b/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp index 347069f94..31b7f565b 100644 --- a/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp +++ b/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.cpp @@ -40,7 +40,7 @@ namespace armarx return "GraspProviderExample"; } - GraspProviderExample::GraspProviderExample() : writer(*this) + GraspProviderExample::GraspProviderExample() : writer(memoryNameSystem), reader(memoryNameSystem) { } @@ -55,7 +55,7 @@ namespace armarx void GraspProviderExample::onConnectComponent() { writer.connect(); - + reader.connect(); task = new RunningTask<GraspProviderExample>(this, &GraspProviderExample::run); task->start(); } @@ -79,10 +79,11 @@ 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 + armarx::grasping::GraspCandidate candidate = armarx::grasping::GraspCandidate(); candidate.groupNr = i; //non-necessary field, but used to commit different candidates candidate.approachVector = Vector3BasePtr(toIce(Eigen::Vector3f())); @@ -90,7 +91,6 @@ namespace armarx candidate.providerName = "Example"; candidate.robotPose = PoseBasePtr(toIce(Eigen::Matrix4f())); writer.commitGraspCandidate(candidate, armem::Time::now()); - // initialize all necessary fields of a bimanual grasp candidate and use writer to commit it to memory armarx::grasping::BimanualGraspCandidate bimanualCandidate = armarx::grasping::BimanualGraspCandidate(); bimanualCandidate.groupNr = i; //non-necessary field, but used to commit different candidates @@ -104,6 +104,12 @@ namespace armarx bimanualCandidate.inwardsVectorRight = Vector3BasePtr(toIce(Eigen::Vector3f())); writer.commitBimanualGraspCandidate(bimanualCandidate, armem::Time::now()); + candidates = reader.queryLatest(); + + for (auto ca : candidates) + { + ARMARX_INFO << ca->groupNr; + } c.waitForCycleDuration(); } diff --git a/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.h b/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.h index 119918274..fea966e87 100644 --- a/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.h +++ b/source/RobotAPI/components/armem/client/GraspProviderExample/GraspProviderExample.h @@ -1,6 +1,7 @@ #include <ArmarXCore/core/Component.h> #include <ArmarXCore/interface/observers/ObserverInterface.h> #include <ArmarXCore/util/tasks.h> +#include <RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h> #include <RobotAPI/libraries/GraspingUtility/GraspCandidateWriter.h> #include <RobotAPI/libraries/armem/client/ComponentPlugin.h> @@ -22,7 +23,7 @@ namespace armarx class GraspProviderExample : virtual public armarx::Component, - virtual public armarx::armem::ClientWriterComponentPluginUser + virtual public armarx::armem::ClientComponentPluginUser { public: @@ -50,5 +51,6 @@ namespace armarx std::string memoryName = "Grasp"; armarx::armem::GraspCandidateWriter writer; + armarx::armem::GraspCandidateReader reader; }; } diff --git a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp index a726ed708..9fae422a7 100644 --- a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp +++ b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp @@ -2,12 +2,13 @@ #include <RobotAPI/libraries/GraspingUtility/aron/GraspCandidate.aron.generated.h> #include <RobotAPI/libraries/GraspingUtility/aron_conversions.h> +#include <RobotAPI/libraries/armem/core/error/mns.h> #include <RobotAPI/libraries/armem/util/util.h> namespace armarx::armem { - GraspCandidateReader::GraspCandidateReader(ClientReaderComponentPluginUser& memoryClient) - : memoryClient(memoryClient) + GraspCandidateReader::GraspCandidateReader(armem::client::MemoryNameSystem& memoryNameSystem) + : memoryNameSystem(memoryNameSystem) { } @@ -16,17 +17,19 @@ namespace armarx::armem // Wait for the memory to become available and add it as dependency. ARMARX_IMPORTANT << "GraspCandidateReader: Waiting for memory '" << properties.memoryName << "' ..."; - auto result = memoryClient.useMemory(properties.memoryName); - if (not result.success) + try { - ARMARX_ERROR << result.errorMessage; + memoryReader = memoryNameSystem.useReader(properties.memoryName); + ARMARX_IMPORTANT << "GraspCandidateReader: Connected to memory '" + << properties.memoryName; + } + catch (const armem::error::CouldNotResolveMemoryServer& e) + { + ARMARX_ERROR << e.what(); return; } - ARMARX_IMPORTANT << "GraspCandidateReader: Connected to memory '" - << properties.memoryName; - memoryReader.setReadingMemory(result.proxy); } armarx::grasping::GraspCandidateSeq asGraspCandidates(const std::map<std::string, wm::Entity>& entities) @@ -54,7 +57,7 @@ namespace armarx::armem return graspCandidate; }; - + ARMARX_INFO << "Before for loop"; // loop over all entities and their snapshots for (const auto &[s, entity] : entities) { @@ -63,7 +66,7 @@ namespace armarx::armem ARMARX_WARNING << "Empty history for " << s; } - ARMARX_DEBUG << "History size: " << entity.size(); + ARMARX_INFO << "History size: " << entity.size(); for (const auto &[ss, entitySnapshot] : entity) { @@ -84,41 +87,37 @@ namespace armarx::armem return outV; } - - GraspCandidateReader::GraspCandidateResult GraspCandidateReader::queryData( - const GraspCandidateReader::Query& query) const + grasping::GraspCandidateSeq GraspCandidateReader::queryLatest() const { - const auto qb = buildQuery(query); + armem::client::query::Builder qb; + + ARMARX_INFO << "Query for memory name: " << properties.memoryName; + - ARMARX_IMPORTANT << "[GraspCandidateReader] query ... "; + // clang-format off + qb + .coreSegments().withName(properties.graspCandidateMemoryName) + .providerSegments().all() + .entities().all() + .snapshots().all(); const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); - ARMARX_DEBUG << "[GraspCandidateReader] result: " << qResult; - - if (not qResult.success) + if (!qResult.success) { - ARMARX_WARNING << "Failed to query data from memory: " - << qResult.errorMessage; - return {.candidate = {}, - .status = GraspCandidateResult::Status::Error, - .errorMessage = qResult.errorMessage}; + throw armem::error::QueryFailed(properties.memoryName, qResult.errorMessage); } - // now create result from memory const auto& entities = - qResult.memory.getCoreSegment(properties.graspCandidateMemoryName) - .getProviderSegment(query.providerName) + qResult.memory.getCoreSegment(properties.graspCandidateMemoryName).getProviderSegment("Example") .entities(); - const auto candidates = asGraspCandidates(entities); - return {.candidate = candidates, - .status = GraspCandidateResult::Status::Success, - .errorMessage = ""}; + return candidates; } + void GraspCandidateReader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def) { ARMARX_DEBUG << "GraspCandidateReader: registerPropertyDefinitions"; @@ -133,25 +132,4 @@ namespace armarx::armem } - client::query::Builder GraspCandidateReader::buildQuery(const GraspCandidateReader::Query& query) const - { - armem::client::query::Builder qb; - - ARMARX_INFO << "Query for provider: " << query.providerName - << " memory name: " << properties.graspCandidateMemoryName; - - - // clang-format off - qb - .coreSegments().withName(properties.graspCandidateMemoryName) - .providerSegments().withName(query.providerName) - .entities().all() - .snapshots().timeRange(query.timeRange.min, query.timeRange.max); - // clang-format on - - - return qb; - } - - } diff --git a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h index 2c7d40a9b..d0a66f036 100644 --- a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h +++ b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.h @@ -6,61 +6,22 @@ namespace armarx::armem { - struct TimeRange - { - Time min; - Time max; - }; class GraspCandidateReader { public: - GraspCandidateReader(ClientReaderComponentPluginUser& memoryClient); + GraspCandidateReader(armem::client::MemoryNameSystem& memoryNameSystem); void connect(); - struct Query - { - std::string providerName; - - TimeRange timeRange; - - }; - - struct GraspCandidateResult - { - armarx::grasping::GraspCandidateSeq candidate; - - enum Status - { - Error, - Success - } status; - - std::string errorMessage; - - }; - - struct BimanualGraspCandidateResult - { - armarx::grasping::BimanualGraspCandidateSeq candidate; - - enum Status - { - Error, - Success - } status; - - std::string errorMessage; - }; - GraspCandidateResult queryData(const Query& query) const; + grasping::GraspCandidateSeq queryLatest() const; void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def); - client::query::Builder buildQuery(const Query& query) const ; + //client::query::Builder buildQuery(const Query& query) const ; private: @@ -77,7 +38,7 @@ namespace armarx::armem const std::string propertyPrefix = "mem.grasping."; - armem::ClientReaderComponentPluginUser& memoryClient; + armem::client::MemoryNameSystem& memoryNameSystem; }; -- GitLab