diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index ae63606b77d4a4afa13e574f43f27ad8dc0f6f70..501500e6720612b68554ea7a1bcdc296129a3548 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -105,6 +105,7 @@ set(LIB_FILES server/RemoteGuiAronDataVisitor.cpp server/segment/SpecializedSegment.cpp + server/query_proc/base/BaseQueryProcessorBase.cpp server/query_proc/base/EntityQueryProcessorBase.cpp server/query_proc/base/ProviderSegmentQueryProcessorBase.cpp @@ -227,6 +228,7 @@ set(LIB_HEADERS server/RemoteGuiAronDataVisitor.h server/segment/SpecializedSegment.h + server/query_proc.h server/query_proc/base/BaseQueryProcessorBase.h server/query_proc/base/EntityQueryProcessorBase.h diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp index a1f678d523c5db79dc163a05e013d8fc0875fa8e..22608257c1abcf39340643870b704c2dadfcd54d 100644 --- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp @@ -3,9 +3,11 @@ #include <RobotAPI/libraries/aron/core/Exception.h> #include <RobotAPI/libraries/aron/common/aron_conversions.h> #include <RobotAPI/libraries/ArmarXObjects/aron_conversions.h> +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> #include <RobotAPI/libraries/armem_objects/aron_conversions.h> +#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h> -#include <ArmarXCore/core/Component.h> +#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h> #include <ArmarXCore/core/time/TimeUtil.h> #include <SimoxUtility/color/Color.h> @@ -20,16 +22,20 @@ namespace armarx::armem::server::obj::clazz { Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) : - iceMemory(memoryToIceAdapter) + SpecializedSegment(memoryToIceAdapter, + arondto::ObjectClass::toAronType(), "Class", -1) + { + } + + + Segment::~Segment() { - Logging::setTag("ClassSegment"); } void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix) { - defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the object clazz core segment."); - defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of object poses history (-1 for infinite)."); + SpecializedSegment::defineProperties(defs, prefix); defs->optional(p.objectsPackage, prefix + "ObjectsPackage", "Name of the objects package to load from."); defs->optional(p.loadFromObjectsPackage, prefix + "LoadFromObjectsPackage", @@ -41,10 +47,7 @@ namespace armarx::armem::server::obj::clazz void Segment::init() { - ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory); - - coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::ObjectClass::toAronType()); - coreSegment->setMaxHistorySize(p.maxHistorySize); + SpecializedSegment::init(); if (p.loadFromObjectsPackage) { @@ -62,13 +65,6 @@ namespace armarx::armem::server::obj::clazz } - std::mutex& Segment::mutex() const - { - ARMARX_CHECK_NOT_NULL(coreSegment); - return coreSegment->mutex(); - } - - void Segment::loadByObjectFinder(const std::string& objectsPackage) { loadByObjectFinder(ObjectFinder(objectsPackage)); @@ -244,9 +240,9 @@ namespace armarx::armem::server::obj::clazz reloadButton.setLabel("Reload"); - maxHistorySize.setValue(std::max(1, int(segment.p.maxHistorySize))); + maxHistorySize.setValue(std::max(1, int(segment.properties.maxHistorySize))); maxHistorySize.setRange(1, 1e6); - infiniteHistory.setValue(segment.p.maxHistorySize == -1); + infiniteHistory.setValue(segment.properties.maxHistorySize == -1); GridLayout grid; int row = 0; @@ -274,10 +270,10 @@ namespace armarx::armem::server::obj::clazz if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged()) { std::scoped_lock lock(segment.mutex()); - segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue(); + segment.properties.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue(); if (segment.coreSegment) { - segment.coreSegment->setMaxHistorySize(long(segment.p.maxHistorySize)); + segment.coreSegment->setMaxHistorySize(long(segment.properties.maxHistorySize)); } } } diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h index 03dce0e9a1214060778ada2bf98ea2b872aa28cb..15c7c4f373f20c43c0febfb142675c5058c45909 100644 --- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h +++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h @@ -3,9 +3,6 @@ #include <mutex> #include <string> -#include <ArmarXCore/core/logging/Logging.h> -#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h> - #include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h> #include <RobotAPI/components/ArViz/Client/Client.h> @@ -13,26 +10,29 @@ #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h> #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h> -#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> -#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h> +#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h> #include <RobotAPI/libraries/armem_objects/server/class/FloorVis.h> +namespace armarx::armem::arondto +{ + class ObjectClass; +} namespace armarx::armem::server::obj::clazz { - class Segment : public armarx::Logging + class Segment : public segment::SpecializedSegment { public: Segment(armem::server::MemoryToIceAdapter& iceMemory); + virtual ~Segment() override; - void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = ""); - void init(); + void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override; + void init() override; void connect(viz::Client arviz); - std::mutex& mutex() const; void loadByObjectFinder(const std::string& objectsPackage); void loadByObjectFinder(const ObjectFinder& finder); @@ -46,9 +46,6 @@ namespace armarx::armem::server::obj::clazz private: - armem::server::MemoryToIceAdapter& iceMemory; - armem::wm::CoreSegment* coreSegment = nullptr; - ObjectFinder objectFinder; viz::Client arviz; @@ -57,9 +54,6 @@ namespace armarx::armem::server::obj::clazz struct Properties { - std::string coreSegmentName = "Class"; - long maxHistorySize = -1; - std::string objectsPackage = ObjectFinder::DefaultObjectsPackageName; bool loadFromObjectsPackage = true; }; diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp index 1a18f84a14dbfdd35ec97eed0d6dd152ae9793d4..09a412f4bfa40a1a6288e86dfe65fa8b50953061 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp @@ -1,6 +1,7 @@ #include "Segment.h" #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h> +#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h> #include <RobotAPI/libraries/armem_objects/aron_conversions.h> #include <RobotAPI/libraries/armem_objects/SceneSnapshot.h> @@ -10,6 +11,7 @@ #include <RobotAPI/libraries/armem/client/Writer.h> #include <RobotAPI/libraries/armem/client/query/Builder.h> #include <RobotAPI/libraries/armem/client/query/query_fns.h> +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> #include <RobotAPI/libraries/armem/util/util.h> #include <RobotAPI/libraries/aron/common/aron_conversions.h> @@ -43,10 +45,9 @@ namespace armarx::armem::server::obj::instance { Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) : - iceMemory(memoryToIceAdapter) + SpecializedSegment(memoryToIceAdapter, + arondto::ObjectInstance::toAronType(), "Instance", 64) { - Logging::setTag("InstanceSegment"); - oobbCache.setFetchFn([this](const ObjectID & id) -> std::optional<simox::OrientedBoxf> { // Try to get OOBB from repository. @@ -78,10 +79,15 @@ namespace armarx::armem::server::obj::instance } + Segment::~Segment() + { + } + + void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix) { - defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the object instance core segment."); - defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of object poses history (-1 for infinite)."); + SpecializedSegment::defineProperties(defs, prefix); + defs->optional(p.discardSnapshotsWhileAttached, prefix + "DiscardSnapshotsWhileAttached", "If true, no new snapshots are stored while an object is attached to a robot node.\n" "If false, new snapshots are stored, but the attachment is kept in the new snapshots."); @@ -101,10 +107,7 @@ namespace armarx::armem::server::obj::instance void Segment::init() { - ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory); - - coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::ObjectInstance::toAronType()); - coreSegment->setMaxHistorySize(p.maxHistorySize); + SpecializedSegment::init(); if (not p.sceneSnapshotToLoad.empty()) { @@ -113,6 +116,7 @@ namespace armarx::armem::server::obj::instance } } + void Segment::connect(viz::Client arviz) { (void) arviz; @@ -122,12 +126,6 @@ namespace armarx::armem::server::obj::instance } - std::mutex& Segment::mutex() const - { - ARMARX_CHECK_NOT_NULL(coreSegment); - return coreSegment->mutex(); - } - Segment::CommitStats Segment::commitObjectPoses( const std::string& providerName, @@ -994,9 +992,9 @@ namespace armarx::armem::server::obj::instance { using namespace armarx::RemoteGui::Client; - maxHistorySize.setValue(std::max(1, int(data.p.maxHistorySize))); + maxHistorySize.setValue(std::max(1, int(data.properties.maxHistorySize))); maxHistorySize.setRange(1, 1e6); - infiniteHistory.setValue(data.p.maxHistorySize == -1); + infiniteHistory.setValue(data.properties.maxHistorySize == -1); discardSnapshotsWhileAttached.setValue(data.p.discardSnapshotsWhileAttached); storeLoadLine.setValue("Scene_" + timestampPlaceholder); @@ -1056,10 +1054,10 @@ namespace armarx::armem::server::obj::instance if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged()) { - segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue(); + segment.properties.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue(); if (segment.coreSegment) { - segment.coreSegment->setMaxHistorySize(long(segment.p.maxHistorySize)); + segment.coreSegment->setMaxHistorySize(long(segment.properties.maxHistorySize)); } } diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h index 378cf02daac285c9998f30b7f98b42853a1ab7b4..918a4efade3c596763d90fec427b18fa78a774bf 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h +++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h @@ -10,32 +10,35 @@ #include <ArmarXCore/core/logging/Logging.h> -#include "RobotAPI/components/ArViz/Client/Client.h" #include <RobotAPI/interface/core/RobotState.h> #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h> +#include <RobotAPI/components/ArViz/Client/Client.h> + #include <RobotAPI/libraries/ArmarXObjects/ObjectID.h> #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h> #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h> #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h> -#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> -#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h> - -#include "Decay.h" +#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h> #include "ArticulatedObjectVisu.h" +#include "Decay.h" namespace armarx::armem::obj { struct SceneSnapshot; } +namespace armarx::armem::arondto +{ + class ObjectInstance; +} namespace armarx::armem::server::obj::instance { - class Segment : public armarx::Logging + class Segment : public segment::SpecializedSegment { public: @@ -51,14 +54,13 @@ namespace armarx::armem::server::obj::instance public: Segment(server::MemoryToIceAdapter& iceMemory); + virtual ~Segment() override; - void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = ""); - void init(); + void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override; + void init() override; void connect(viz::Client arviz); - std::mutex& mutex() const; - CommitStats commitObjectPoses( @@ -178,15 +180,8 @@ namespace armarx::armem::server::obj::instance private: - server::MemoryToIceAdapter& iceMemory; - wm::CoreSegment* coreSegment = nullptr; - - struct Properties { - std::string coreSegmentName = "Instance"; - // -1 would be infinite, but this can let the RAM grow quickly. - long maxHistorySize = 25; bool discardSnapshotsWhileAttached = true; /// Package containing the scene snapshots @@ -207,6 +202,7 @@ namespace armarx::armem::server::obj::instance static const std::string timestampPlaceholder; + public: struct RemoteGui @@ -225,7 +221,9 @@ namespace armarx::armem::server::obj::instance void update(Segment& data); }; + private: + std::unique_ptr<ArticulatedObjectVisu> visu; };