diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp index dc7309cf18c368d85994cc06a2944b856d9832f4..87d2e61b49da4f325fe2fdfed72914c26ec8d5c2 100644 --- a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp +++ b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp @@ -26,10 +26,10 @@ #include <SimoxUtility/algorithm/string.h> +#include <RobotAPI/libraries/armem/client/query/Builder.h> #include <RobotAPI/libraries/armem/core/error.h> -#include <RobotAPI/libraries/armem/core/ice_conversions.h> -#include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h> #include <RobotAPI/libraries/armem/core/ice_conversions_templates.h> +#include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h> #include <RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.aron.generated.h> @@ -162,7 +162,7 @@ namespace armarx ExecuteActionOutputSeq output; for (const auto& [id, path] : input) { - armem::MemoryID memoryID = armem::fromIce<armem::MemoryID>(id); + auto memoryID = fromIce<armem::MemoryID>(id); if (path == ActionPath{"hi"}) { ARMARX_INFO << "Hello, " << memoryID.str() << "!"; @@ -193,7 +193,8 @@ namespace armarx update.instancesData = { instance->data() }; armem::Commit newCommit; - this->commit(armem::toIce<armem::data::Commit>(newCommit)); + newCommit.add(update); + this->commit(armarx::toIce<armem::data::Commit>(newCommit)); tab.rebuild = true; ARMARX_INFO << "Duplicated " << memoryID; @@ -209,6 +210,65 @@ namespace armarx return output; } + // PREDICTING + armem::query::data::Result + ExampleMemory::predict(const armem::data::MemoryID& memoryID, + const armem::predictions::data::PredictionSettings& predictionSettings) + { + armem::query::data::Result result; + + std::string engine = predictionSettings.predictionEngine; + if (engine.empty() || engine == "Latest") + { + auto boID = fromIce<armem::MemoryID>(memoryID); + armem::client::QueryBuilder builder; + builder.latestEntitySnapshot(boID); + auto queryResult = + query(armarx::toIce<armem::query::data::Input>(builder.buildQueryInput())); + if (queryResult.success) + { + auto readMemory = fromIce<armem::wm::Memory>(queryResult.memory); + auto* latest = readMemory.findLatestSnapshot(boID); + if (latest != nullptr) + { + armem::wm::Memory resultMemory; + armem::EntityUpdate update; + update.entityID = boID; + latest->forEachInstance([&update](const armem::wm::EntityInstance& instance) + { update.instancesData.push_back(instance.data()); }); + update.timeCreated = armem::Time::Now(); + resultMemory.update(update); + result.success = true; + result.memory = armarx::toIce<armem::data::MemoryPtr>(resultMemory); + } + else + { + result.success = false; + result.errorMessage = + "Could not find entity referenced by MemoryID " + boID.str(); + } + } + else + { + result.success = false; + result.errorMessage = "Could not find entity referenced by MemoryID " + boID.str(); + } + } + else + { + result.success = false; + result.errorMessage = "This memory does not support the prediction engine " + engine; + } + + return result; + } + + armem::predictions::data::PredictionEngineSeq + ExampleMemory::getAvailableEngines() + { + return {"Latest"}; + } + // REMOTE GUI void ExampleMemory::createRemoteGuiTab() diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h index 62ea177f496296082cac90aecc6e9e6f35d450a8..7bf37aaf15871469e890b0230b2d9b3c3ffdf9e9 100644 --- a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h +++ b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h @@ -71,6 +71,13 @@ namespace armarx armem::actions::GetActionsOutputSeq getActions(const armem::actions::GetActionsInputSeq& input) override; armem::actions::ExecuteActionOutputSeq executeActions(const armem::actions::ExecuteActionInputSeq& input) override; + // PredictingMemoryInterface interface + public: + armem::query::data::Result + predict(const armem::data::MemoryID& memoryID, + const armem::predictions::data::PredictionSettings& predictionSettings) override; + armem::predictions::data::PredictionEngineSeq getAvailableEngines() override; + protected: diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp index 4ce314f5a5409368ae41b33d0a6eb68903553077..5e413cb273156654dd6a20493576ee9e6692e5df 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp @@ -117,8 +117,10 @@ namespace armarx::armem::server::plugins return {}; } - // PREDICTIONS - armem::query::data::Result ReadWritePluginUser::predict(const data::MemoryID& /*memoryID*/, const armem::predictions::data::PredictionSettings& /*predictionSettings*/, const ::Ice::Current& /*unused*/) + armem::query::data::Result + ReadWritePluginUser::predict( + const data::MemoryID& /*memoryID*/, + const armem::predictions::data::PredictionSettings& /*predictionSettings*/) { armem::query::data::Result result; result.success = false; @@ -127,9 +129,26 @@ namespace armarx::armem::server::plugins return result; } - armem::predictions::data::PredictionEngineSeq ReadWritePluginUser::getAvailableEngines(const ::Ice::Current& /*unused*/) + armem::predictions::data::PredictionEngineSeq + ReadWritePluginUser::getAvailableEngines() { return {}; } + // PREDICTIONS + armem::query::data::Result + ReadWritePluginUser::predict( + const data::MemoryID& memoryID, + const armem::predictions::data::PredictionSettings& predictionSettings, + const ::Ice::Current& /*unused*/) + { + return predict(memoryID, predictionSettings); + } + + armem::predictions::data::PredictionEngineSeq + ReadWritePluginUser::getAvailableEngines(const ::Ice::Current& /*unused*/) + { + return getAvailableEngines(); + } + } // namespace armarx::armem::server::plugins diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h index 3ecd8915fcc67d824ab71b9b340a4dd6fbf4093c..c09da7b7b0eb1ced33e918cadb51043794db98f0 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h @@ -56,8 +56,11 @@ namespace armarx::armem::server::plugins virtual armem::actions::ExecuteActionOutputSeq executeActions(const armem::actions::ExecuteActionInputSeq& inputs, const ::Ice::Current&) override; // PredictingInterface interface - virtual armem::query::data::Result predict(const data::MemoryID& memoryID, const armem::predictions::data::PredictionSettings& predictionSettings, const ::Ice::Current& = Ice::emptyCurrent) override; - virtual armem::predictions::data::PredictionEngineSeq getAvailableEngines(const ::Ice::Current& = Ice::emptyCurrent) override; + virtual armem::query::data::Result predict(const data::MemoryID& memoryID, const armem::predictions::data::PredictionSettings& predictionSettings); + virtual armem::predictions::data::PredictionEngineSeq getAvailableEngines(); + + virtual armem::query::data::Result predict(const data::MemoryID& memoryID, const armem::predictions::data::PredictionSettings& predictionSettings, const ::Ice::Current&) override; + virtual armem::predictions::data::PredictionEngineSeq getAvailableEngines(const ::Ice::Current&) override; public: