diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp index 54e06283336ec526a77543d9437cef7ac4f0f49c..efb6e446ee4db76406b58fb4c7bab992b8de073b 100644 --- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp +++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp @@ -30,6 +30,7 @@ #include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/time/TimeUtil.h> +#include "RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.h" #include <RobotAPI/libraries/armem/core/error.h> #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h> #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> @@ -45,6 +46,7 @@ namespace armarx SkillManagerComponentPluginUser(), statechartListenerProviderSegment(iceAdapter()), executableSkillCoreSegment(iceAdapter()), + composedSkillCoreSegment(iceAdapter()), skillEventCoreSegment(iceAdapter()), skillExecutionRequestCoreSegment(iceAdapter()) { @@ -59,6 +61,7 @@ namespace armarx const std::string prefix = "mem."; statechartListenerProviderSegment.defineProperties(defs, prefix + "statechartlistener."); executableSkillCoreSegment.defineProperties(defs, prefix + "executableskill."); + composedSkillCoreSegment.defineProperties(defs, prefix + "composedskill."); skillExecutionRequestCoreSegment.defineProperties(defs, prefix + "executionrequest."); skillEventCoreSegment.defineProperties(defs, prefix + "event."); @@ -77,6 +80,7 @@ namespace armarx { statechartListenerProviderSegment.init(); executableSkillCoreSegment.init(); + composedSkillCoreSegment.init(); skillExecutionRequestCoreSegment.init(); skillEventCoreSegment.init(); } diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h index ead9f19122bc80266196aff40f138b4bd87c77f1..cd40868e6e69e17f7e671df30ffed2d7dc5410e5 100644 --- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h +++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h @@ -34,6 +34,7 @@ #include <RobotAPI/libraries/armem_skills/aron/Statechart.aron.generated.h> #include <RobotAPI/libraries/armem_skills/server/StatechartListenerComponentPlugin.h> #include <RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h> +#include <RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.h> #include <RobotAPI/libraries/armem_skills/server/segment/SkillEventSegment.h> #include <RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h> #include <RobotAPI/libraries/armem_skills/server/segment/StatechartListenerSegment.h> @@ -133,6 +134,7 @@ namespace armarx skills::segment::StatechartListenerProviderSegment statechartListenerProviderSegment; skills::segment::ExecutableSkillLibraryCoreSegment executableSkillCoreSegment; + skills::segment::ComposedSkillLibraryCoreSegment composedSkillCoreSegment; skills::segment::SkillEventCoreSegment skillEventCoreSegment; skills::segment::SkillExecutionRequestCoreSegment skillExecutionRequestCoreSegment; }; diff --git a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt index 5dea7fd336d310010fdd6a15be653b6c5cdeba46..967384b5855c68cc44e0825533327b349ddbe17d 100644 --- a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt @@ -21,6 +21,7 @@ armarx_add_library( ./server/segment/StatechartListenerSegment.cpp ./server/segment/ExecutableSkillLibrarySegment.cpp + ./server/segment/ComposedSkillLibrarySegment.cpp ./server/segment/SkillExecutionRequestSegment.cpp ./server/segment/SkillEventSegment.cpp HEADERS @@ -30,6 +31,7 @@ armarx_add_library( ./server/segment/StatechartListenerSegment.h ./server/segment/ExecutableSkillLibrarySegment.h + ./server/segment/ComposedSkillLibrarySegment.h ./server/segment/SkillExecutionRequestSegment.h ./server/segment/SkillEventSegment.h ) diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c652bb287d37101b2a43d9bae6a22469df3cfc8e --- /dev/null +++ b/source/RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.cpp @@ -0,0 +1,69 @@ +#include "ComposedSkillLibrarySegment.h" + +#include <SimoxUtility/algorithm/string.h> + +#include <ArmarXCore/core/time/ice_conversions.h> + +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> +#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h> +#include <RobotAPI/libraries/armem_skills/aron_conversions.h> +#include <RobotAPI/libraries/aron/converter/datatype/DatatypeConverterVisitor.h> +#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h> +#include <RobotAPI/libraries/skills/core/aron/FluxioSkill.aron.generated.h> + +namespace armarx::skills::segment +{ + ComposedSkillLibraryCoreSegment::ComposedSkillLibraryCoreSegment( + armem::server::MemoryToIceAdapter& iceMemory) : + Base(iceMemory, CoreSegmentName, skills::manager::arondto::FluxioSkill::ToAronType()) + { + } + + void + ComposedSkillLibraryCoreSegment::defineProperties(PropertyDefinitionsPtr defs, + const std::string& prefix) + { + this->setDefaultMaxHistorySize(3); + Base::defineProperties(defs, prefix); + } + + void + ComposedSkillLibraryCoreSegment::init() + { + Base::init(); + } + + void + ComposedSkillLibraryCoreSegment::addSkillProvider(const skills::ProviderInfo& info) + { + // add skills + auto skills = info.providedSkills; + auto provId = id().withProviderSegmentName(info.providerId.providerName); + + for (const auto& [s, d] : skills) + { + armarx::skills::arondto::SkillDescription skillDescription; + armem::toAron(skillDescription, d); + + armem::Commit commit; + auto& entityUpdate = commit.add(); + entityUpdate.confidence = 1.0; + entityUpdate.referencedTime = armem::Time::Now(); + entityUpdate.sentTime = armem::Time::Now(); + entityUpdate.arrivedTime = armem::Time::Now(); + entityUpdate.instancesData = {skillDescription.toAron()}; + entityUpdate.entityID = provId.withEntityName(d.skillId.skillName); + + // Commit data to memory and notify + iceMemory.commit(commit); + } + } + + void + ComposedSkillLibraryCoreSegment::removeSkillProvider(const std::string& providerName) + { + skills.erase(providerName); + + // TODO also add info about removed provider to memory? + } +} // namespace armarx::skills::segment diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.h new file mode 100644 index 0000000000000000000000000000000000000000..5e633d216e920d17170221b63f1a56786ae3f4c0 --- /dev/null +++ b/source/RobotAPI/libraries/armem_skills/server/segment/ComposedSkillLibrarySegment.h @@ -0,0 +1,38 @@ +#pragma once + +// Base Class +#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h> + +// ArmarX +#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h> +#include <ArmarXCore/interface/core/Profiler.h> +#include <ArmarXCore/observers/ObserverObjectFactories.h> + +#include <RobotAPI/interface/skills/SkillManagerInterface.h> +#include <RobotAPI/interface/skills/SkillProviderInterface.h> +#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h> +#include <RobotAPI/libraries/skills/core/ProviderInfo.h> + +namespace armarx::skills::segment +{ + class ComposedSkillLibraryCoreSegment : public armem::server::segment::SpecializedCoreSegment + { + using Base = armem::server::segment::SpecializedCoreSegment; + + public: + static constexpr const char* CoreSegmentName = "ComposedSkill"; + + ComposedSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory); + + void defineProperties(PropertyDefinitionsPtr defs, const std::string& prefix); + void init(); + + void addSkillProvider(const skills::ProviderInfo& info); + void removeSkillProvider(const std::string& providerName); + + size_t size() const; + + private: + std::map<std::string, std::map<std::string, skills::manager::dto::ProviderInfo>> skills; + }; +} // namespace armarx::skills::segment