From ddfb01b8b4be87a1534a258ba1b1a70629a08428 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:03:21 +0200
Subject: [PATCH 1/7] Update usages of plugins

---
 .../NavigationMemory/NavigationMemory.cpp     | 30 +++++++++-------
 .../NavigationMemory/NavigationMemory.h       |  1 -
 .../components/Navigator/Navigator.cpp        | 36 ++++++++++---------
 .../components/Navigator/Navigator.h          | 15 ++++----
 .../GraphImportExport/GraphImportExport.cpp   |  4 +--
 .../GraphImportExport/GraphImportExport.h     |  4 +--
 6 files changed, 48 insertions(+), 42 deletions(-)

diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
index e20e0a99..c16efecf 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
@@ -31,6 +31,10 @@
 #include <armarx/navigation/graph/constants.h>
 #include <armarx/navigation/graph/Graph.h>
 
+#include <RobotAPI/libraries/armem/server/ltm/disk/MemoryManager.h>
+#include <RobotAPI/libraries/armem/server/query_proc/ltm.h>
+#include <RobotAPI/libraries/armem/client/query.h>
+#include <RobotAPI/libraries/armem/core/operations.h>
 #include <ArmarXCore/core/time/CycleUtil.h>
 
 
@@ -53,6 +57,7 @@ namespace armarx::nav
         // def->component(myComponentProxy)
 
 
+        workingMemory().name() = "Navigation";
         def->optional(properties.locationGraph.visuLocations, "p.locationGraph.visuLocation",
                       "Enable visualization of locations.");
         def->optional(properties.locationGraph.visuGraphEdges, "p.locationGraph.visuGraphEdges",
@@ -73,27 +78,26 @@ namespace armarx::nav
         // (Requies the armarx::DebugObserverComponentPluginUser.)
         // setDebugObserverBatchModeEnabled(true);
 
-        setMemoryName(properties.memoryName);
+        workingMemory().addCoreSegment("Parameterization");
 
-        workingMemory.addCoreSegment("Parameterization");
-
-        workingMemory.addCoreSegment("Results_GlobalPlanner",
+        workingMemory().addCoreSegment("Results_GlobalPlanner",
                                      nav::core::arondto::Trajectory::toAronType());
-        workingMemory.addCoreSegment("Results_LocalPlanner",
+        workingMemory().addCoreSegment("Results_LocalPlanner",
                                      nav::core::arondto::Trajectory::toAronType());
-        workingMemory.addCoreSegment("Results_TrajectoryController",
+        workingMemory().addCoreSegment("Results_TrajectoryController",
                                      nav::core::arondto::Twist::toAronType());
-        workingMemory.addCoreSegment("Results_SafetyController",
+        workingMemory().addCoreSegment("Results_SafetyController",
                                      nav::core::arondto::Twist::toAronType());
 
-        workingMemory.addCoreSegment("Events"); //, armem::example::ExampleData::toAronType());
-        // workingMemory.addCoreSegment("Exceptions"); //, armem::example::ExampleData::toAronType());
+        workingMemory().addCoreSegment("Events");  //, armem::example::ExampleData::toAronType());
+        // workingMemory.addCoreSegment("Exceptions");  //, armem::example::ExampleData::toAronType());
 
 
-        workingMemory.addCoreSegment(nav::loc::coreSegmentID.coreSegmentName,
+        workingMemory().addCoreSegment(nav::loc::coreSegmentID.coreSegmentName,
                                      nav::loc::arondto::Location::toAronType());
-        workingMemory.addCoreSegment(nav::graph::coreSegmentID.coreSegmentName,
+        workingMemory().addCoreSegment(nav::graph::coreSegmentID.coreSegmentName,
                                      nav::graph::arondto::Graph::toAronType());
+
     }
 
 
@@ -202,8 +206,8 @@ namespace armarx::nav
     {
         memory::Visu visu {
             arviz,
-            workingMemory.getCoreSegment(nav::loc::coreSegmentID),
-            workingMemory.getCoreSegment(nav::graph::coreSegmentID)
+            workingMemory().getCoreSegment(nav::loc::coreSegmentID),
+            workingMemory().getCoreSegment(nav::graph::coreSegmentID)
         };
 
         Properties::LocationGraph p;
diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.h b/source/Navigation/components/NavigationMemory/NavigationMemory.h
index 444868c5..58b274bd 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.h
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.h
@@ -95,7 +95,6 @@ namespace armarx::nav
         /// Properties shown in the Scenario GUI.
         struct Properties
         {
-            std::string memoryName = "Navigation";
 
             struct LocationGraph
             {
diff --git a/source/Navigation/components/Navigator/Navigator.cpp b/source/Navigation/components/Navigator/Navigator.cpp
index 7d2562cd..2fceb296 100644
--- a/source/Navigation/components/Navigator/Navigator.cpp
+++ b/source/Navigation/components/Navigator/Navigator.cpp
@@ -37,24 +37,26 @@
 #include <VirtualRobot/MathTools.h>
 #include <VirtualRobot/Robot.h>
 
-#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
-#include "ArmarXCore/core/services/tasks/TaskUtil.h"
-#include "ArmarXCore/util/CPPUtility/trace.h"
+#include <ArmarXCore/core/services/tasks/PeriodicTask.h>
+#include <ArmarXCore/core/services/tasks/TaskUtil.h>
+#include <ArmarXCore/util/CPPUtility/trace.h>
 #include <ArmarXCore/core/exceptions/LocalException.h>
 #include <ArmarXCore/core/logging/LogSender.h>
 
-#include "ArmarXGui/libraries/RemoteGui/Client/Widgets.h"
+#include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h>
+
+#include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h>
+
+#include <Navigation/components/Navigator/RemoteGui.h>
+#include <Navigation/libraries/client/NavigationStackConfig.h>
+#include <Navigation/libraries/core/types.h>
+#include <Navigation/libraries/factories/NavigationStackFactory.h>
+#include <Navigation/libraries/server/Navigator.h>
+#include <Navigation/libraries/server/execution/PlatformUnitExecutor.h>
+#include <Navigation/libraries/server/introspection/MemoryIntrospector.h>
+#include <Navigation/libraries/util/util.h>
 
-#include "RobotAPI/libraries/core/remoterobot/RemoteRobot.h"
 
-#include "Navigation/components/Navigator/RemoteGui.h"
-#include "Navigation/libraries/client/NavigationStackConfig.h"
-#include "Navigation/libraries/core/types.h"
-#include "Navigation/libraries/factories/NavigationStackFactory.h"
-#include "Navigation/libraries/server/Navigator.h"
-#include "Navigation/libraries/server/execution/PlatformUnitExecutor.h"
-#include "Navigation/libraries/server/introspection/MemoryIntrospector.h"
-#include "Navigation/libraries/util/util.h"
 
 std::vector<armarx::nav::core::Pose>
 convert(const std::vector<Eigen::Matrix4f>& wps)
@@ -68,10 +70,10 @@ convert(const std::vector<Eigen::Matrix4f>& wps)
 }
 
 armarx::nav::components::Navigator::Navigator() :
-    parameterizationReader(memoryNameSystem),
-    parameterizationWriter(memoryNameSystem),
-    eventsWriter(memoryNameSystem),
-    resultsWriter(memoryNameSystem),
+    parameterizationReader(memoryNameSystem()),
+    parameterizationWriter(memoryNameSystem()),
+    eventsWriter(memoryNameSystem()),
+    resultsWriter(memoryNameSystem()),
     parameterizationService(&parameterizationReader, &parameterizationWriter),
     publisher(&resultsWriter, &eventsWriter)
 {
diff --git a/source/Navigation/components/Navigator/Navigator.h b/source/Navigation/components/Navigator/Navigator.h
index a0415cad..b4d52093 100644
--- a/source/Navigation/components/Navigator/Navigator.h
+++ b/source/Navigation/components/Navigator/Navigator.h
@@ -31,7 +31,7 @@
 
 #include <Ice/Object.h>
 
-#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
+#include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 #include <ArmarXCore/core/Component.h>
 
 #include <ArmarXGui/interface/RemoteGuiInterface.h>
@@ -41,12 +41,12 @@
 #include <RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h>
 #include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 #include <RobotAPI/libraries/RobotAPIComponentPlugins/RobotStateComponentPlugin.h>
-#include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
+#include <RobotAPI/libraries/armem/client/plugins.h>
 
-#include "Navigation/libraries/core/time/ChronoMonotonicTimeServer.h"
-#include "Navigation/libraries/memory/client/parameterization/Reader.h"
-#include "Navigation/libraries/memory/client/stack_result/Writer.h"
-#include "Navigation/libraries/server/introspection/MemoryIntrospector.h"
+#include <Navigation/libraries/core/time/ChronoMonotonicTimeServer.h>
+#include <Navigation/libraries/memory/client/parameterization/Reader.h>
+#include <Navigation/libraries/memory/client/stack_result/Writer.h>
+#include <Navigation/libraries/server/introspection/MemoryIntrospector.h>
 #include <Navigation/components/Navigator/NavigatorInterface.h>
 #include <Navigation/components/Navigator/RemoteGui.h>
 #include <Navigation/libraries/core/types.h>
@@ -56,6 +56,7 @@
 #include <Navigation/libraries/server/introspection/ArvizIntrospector.h>
 #include <Navigation/libraries/server/parameterization/MemoryParameterizationService.h>
 
+
 namespace armarx::nav::components
 {
 
@@ -76,7 +77,7 @@ namespace armarx::nav::components
         virtual public ObjectPoseClientPluginUser,
         virtual public RobotStateComponentPluginUser,
         virtual public ArVizComponentPluginUser,
-        virtual public armem::client::ComponentPluginUser
+        virtual public armem::ListeningClientPluginUser
     {
 
     public:
diff --git a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp
index 36936fee..4b9b56b5 100644
--- a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp
+++ b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp
@@ -82,8 +82,8 @@ namespace armarx::nav
         {
             proxies.graphSegment = proxies.priorKnowledge->getGraphSegment();
         }
-        proxies.locationWriter = memoryNameSystem.useWriter(properties.locationCoreSegmentID);
-        proxies.graphWriter = memoryNameSystem.useWriter(properties.graphCoreSegmentID);
+        proxies.locationWriter = memoryNameSystem().useWriter(properties.locationCoreSegmentID);
+        proxies.graphWriter = memoryNameSystem().useWriter(properties.graphCoreSegmentID);
 
 
         // Setup and start the remote GUI.
diff --git a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h
index 949ad673..70b41cde 100644
--- a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h
+++ b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h
@@ -29,7 +29,7 @@
 #include <MemoryX/interface/components/PriorKnowledgeInterface.h>
 #include <MemoryX/interface/components/GraphNodePoseResolverInterface.h>
 
-#include <RobotAPI/libraries/armem/client/MemoryNameSystemComponentPlugin.h>
+#include <RobotAPI/libraries/armem/client/plugins.h>
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 
@@ -58,7 +58,7 @@ namespace armarx::nav
         , virtual public armarx::DebugObserverComponentPluginUser
         , virtual public armarx::LightweightRemoteGuiComponentPluginUser
         , virtual public armarx::ArVizComponentPluginUser
-        , virtual public armarx::armem::client::MemoryNameSystemComponentPluginUser
+        , virtual public armarx::armem::ClientPluginUser
     {
     public:
 
-- 
GitLab


From 3952c1d2129b513a32c6e2daa9cd6e83338b2e79 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:03:26 +0200
Subject: [PATCH 2/7] Add missing includes

---
 .../gui-plugins/LocationGraphEditor/widgets/ConnectDialog.h      | 1 +
 .../gui-plugins/LocationGraphEditor/widgets/RobotVisuWidget.cpp  | 1 +
 2 files changed, 2 insertions(+)

diff --git a/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/ConnectDialog.h b/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/ConnectDialog.h
index 14157a33..d183a2e4 100644
--- a/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/ConnectDialog.h
+++ b/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/ConnectDialog.h
@@ -27,6 +27,7 @@
 
 #include <QDialog>
 #include <QDialogButtonBox>
+#include <QVBoxLayout>
 
 
 namespace armarx::nav::locgrapheditor
diff --git a/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/RobotVisuWidget.cpp b/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/RobotVisuWidget.cpp
index e6699a15..9d1151cb 100644
--- a/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/RobotVisuWidget.cpp
+++ b/source/armarx/navigation/gui-plugins/LocationGraphEditor/widgets/RobotVisuWidget.cpp
@@ -35,6 +35,7 @@
 #include <QCheckBox>
 #include <QDialog>
 #include <QDialogButtonBox>
+#include <QLabel>
 #include <QPushButton>
 #include <QVBoxLayout>
 
-- 
GitLab


From 727b04ca551b4fd7b918485057798d90764531bf Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:03:48 +0200
Subject: [PATCH 3/7] Add missing includes

---
 source/Navigation/libraries/client/NavigationStackConfig.cpp | 2 ++
 .../libraries/factories/NavigationStackFactory.cpp           | 2 ++
 source/Navigation/libraries/global_planning/AStar.cpp        | 2 ++
 .../global_planning/optimization/OrientationOptimizer.cpp    | 1 +
 .../libraries/server/event_publishing/MemoryPublisher.h      | 5 +++--
 .../libraries/server/monitoring/GoalReachedMonitor.cpp       | 2 ++
 6 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/source/Navigation/libraries/client/NavigationStackConfig.cpp b/source/Navigation/libraries/client/NavigationStackConfig.cpp
index ef0fd135..e6dcec38 100644
--- a/source/Navigation/libraries/client/NavigationStackConfig.cpp
+++ b/source/Navigation/libraries/client/NavigationStackConfig.cpp
@@ -3,6 +3,7 @@
 #include <memory>
 
 #include "ArmarXCore/core/exceptions/local/ExpressionException.h"
+#include <ArmarXCore/core/logging/Logging.h>
 
 #include "RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.h"
 #include "RobotAPI/libraries/aron/core/navigator/data/primitive/String.h"
@@ -12,6 +13,7 @@
 #include "Navigation/libraries/core/constants.h"
 #include "Navigation/libraries/core/types.h"
 
+
 namespace armarx::nav::client
 {
     aron::datanavigator::DictNavigatorPtr
diff --git a/source/Navigation/libraries/factories/NavigationStackFactory.cpp b/source/Navigation/libraries/factories/NavigationStackFactory.cpp
index 3e2206ed..d5b63872 100644
--- a/source/Navigation/libraries/factories/NavigationStackFactory.cpp
+++ b/source/Navigation/libraries/factories/NavigationStackFactory.cpp
@@ -1,6 +1,7 @@
 #include "NavigationStackFactory.h"
 
 #include "ArmarXCore/core/exceptions/local/ExpressionException.h"
+#include <ArmarXCore/core/logging/Logging.h>
 
 #include "Navigation/libraries/core/constants.h"
 #include "Navigation/libraries/factories/GlobalPlannerFactory.h"
@@ -9,6 +10,7 @@
 #include "Navigation/libraries/factories/TrajectoryControllerFactory.h"
 #include "Navigation/libraries/server/NavigationStack.h"
 
+
 namespace armarx::nav::fac
 {
     server::NavigationStack
diff --git a/source/Navigation/libraries/global_planning/AStar.cpp b/source/Navigation/libraries/global_planning/AStar.cpp
index a8a20ffe..da68fabc 100644
--- a/source/Navigation/libraries/global_planning/AStar.cpp
+++ b/source/Navigation/libraries/global_planning/AStar.cpp
@@ -6,6 +6,7 @@
 #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/logging/Logging.h>
 
 #include "RobotAPI/libraries/aron/core/navigator/data/container/Dict.h"
 #include "RobotAPI/libraries/aron/core/navigator/data/primitive/String.h"
@@ -22,6 +23,7 @@
 #include <Navigation/libraries/global_planning/aron/AStarParams.aron.generated.h>
 #include <Navigation/libraries/global_planning/optimization/OrientationOptimizer.h>
 
+
 namespace armarx::nav::glob_plan
 {
 
diff --git a/source/Navigation/libraries/global_planning/optimization/OrientationOptimizer.cpp b/source/Navigation/libraries/global_planning/optimization/OrientationOptimizer.cpp
index 37d64f4c..cf7671ab 100644
--- a/source/Navigation/libraries/global_planning/optimization/OrientationOptimizer.cpp
+++ b/source/Navigation/libraries/global_planning/optimization/OrientationOptimizer.cpp
@@ -13,6 +13,7 @@
 #include <SimoxUtility/math/convert/rpy_to_mat3f.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/logging/Logging.h>
 
 #include "Navigation/libraries/core/Trajectory.h"
 
diff --git a/source/Navigation/libraries/server/event_publishing/MemoryPublisher.h b/source/Navigation/libraries/server/event_publishing/MemoryPublisher.h
index d4bcf5c1..78312f28 100644
--- a/source/Navigation/libraries/server/event_publishing/MemoryPublisher.h
+++ b/source/Navigation/libraries/server/event_publishing/MemoryPublisher.h
@@ -1,9 +1,10 @@
 #pragma once
 
-#include "Navigation/libraries/memory/client/events/Writer.h"
-#include "Navigation/libraries/memory/client/stack_result/Writer.h"
+#include <Navigation/libraries/memory/client/events/Writer.h>
+#include <Navigation/libraries/memory/client/stack_result/Writer.h>
 #include <Navigation/libraries/server/event_publishing/EventPublishingInterface.h>
 
+
 namespace armarx::nav::server
 {
 
diff --git a/source/Navigation/libraries/server/monitoring/GoalReachedMonitor.cpp b/source/Navigation/libraries/server/monitoring/GoalReachedMonitor.cpp
index d70ea8f2..b7b69aa5 100644
--- a/source/Navigation/libraries/server/monitoring/GoalReachedMonitor.cpp
+++ b/source/Navigation/libraries/server/monitoring/GoalReachedMonitor.cpp
@@ -3,6 +3,8 @@
 #include <VirtualRobot/Robot.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/logging/Logging.h>
+
 
 namespace armarx::nav::server
 {
-- 
GitLab


From d3d655187744cd560b76e885d6663d44d03ef5db Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:04:16 +0200
Subject: [PATCH 4/7] Add snapshot loading

---
 .../NavigationMemory/NavigationMemory.cpp     | 52 +++++++++++++++++++
 .../NavigationMemory/NavigationMemory.h       |  1 +
 2 files changed, 53 insertions(+)

diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
index c16efecf..d2267148 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
@@ -35,7 +35,11 @@
 #include <RobotAPI/libraries/armem/server/query_proc/ltm.h>
 #include <RobotAPI/libraries/armem/client/query.h>
 #include <RobotAPI/libraries/armem/core/operations.h>
+
 #include <ArmarXCore/core/time/CycleUtil.h>
+#include <ArmarXCore/core/system/ArmarXDataPath.h>
+
+#include <filesystem>
 
 
 namespace armarx::nav
@@ -58,6 +62,10 @@ namespace armarx::nav
 
 
         workingMemory().name() = "Navigation";
+        def->optional(properties.snapshotToLoad, "p.snapshotToLoad",
+                      "Memory snapshot to load at start up \n"
+                      "(e.g. 'PriorKnowledgeData/navigation-graphs/snapshot').");
+
         def->optional(properties.locationGraph.visuLocations, "p.locationGraph.visuLocation",
                       "Enable visualization of locations.");
         def->optional(properties.locationGraph.visuGraphEdges, "p.locationGraph.visuGraphEdges",
@@ -69,6 +77,25 @@ namespace armarx::nav
     }
 
 
+    std::optional<std::filesystem::path>
+    findSnapshotDirectory(const std::filesystem::path& specifiedPath, const std::string& memoryName)
+    {
+        std::vector<std::filesystem::path> candidates
+        {
+            specifiedPath,
+            specifiedPath / memoryName,
+        };
+        for (const auto& candidate : candidates)
+        {
+            if (candidate.filename() == memoryName and std::filesystem::is_directory(candidate))
+            {
+                return candidate;
+            }
+        }
+        return std::nullopt;
+    }
+
+
     void
     NavigationMemory::onInitComponent()
     {
@@ -98,6 +125,31 @@ namespace armarx::nav
         workingMemory().addCoreSegment(nav::graph::coreSegmentID.coreSegmentName,
                                      nav::graph::arondto::Graph::toAronType());
 
+
+        if (not properties.snapshotToLoad.empty())
+        {
+            std::string resolved = ArmarXDataPath::resolvePath(properties.snapshotToLoad);
+            if (auto path = findSnapshotDirectory(resolved, workingMemory().name()))
+            {
+                const std::string key = path->filename();
+                armem::server::ltm::disk::MemoryManager manager;
+                manager.setName(key);
+                manager.setBasePath(path.value());
+                manager.reload();
+
+                armem::client::QueryBuilder builder;
+                builder.all();
+                armem::client::QueryInput queryInput = builder.buildQueryInput();
+                queryInput.addQueryTargetToAll(armem::query::data::QueryTarget::LTM);
+
+                armem::server::query_proc::ltm::MemoryQueryProcessor processor;
+                armem::wm::Memory memory = processor.process(queryInput.toIce(), manager.getCacheAndLutNotConverted());
+                manager.convert(memory);
+
+                ARMARX_INFO << "Loaded " << armem::print(memory);
+                workingMemory().update(armem::toCommit(memory));
+            }
+        }
     }
 
 
diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.h b/source/Navigation/components/NavigationMemory/NavigationMemory.h
index 58b274bd..f769f90a 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.h
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.h
@@ -95,6 +95,7 @@ namespace armarx::nav
         /// Properties shown in the Scenario GUI.
         struct Properties
         {
+            std::string snapshotToLoad = "";
 
             struct LocationGraph
             {
-- 
GitLab


From 3a619f5d8bc024485783def782fdbac070dd05e6 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:04:30 +0200
Subject: [PATCH 5/7] Add newline at end of file

---
 source/armarx/navigation/gui-plugins/CMakeLists.txt | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/source/armarx/navigation/gui-plugins/CMakeLists.txt b/source/armarx/navigation/gui-plugins/CMakeLists.txt
index 0b821f03..0d39eb1e 100644
--- a/source/armarx/navigation/gui-plugins/CMakeLists.txt
+++ b/source/armarx/navigation/gui-plugins/CMakeLists.txt
@@ -1,2 +1 @@
-
-add_subdirectory(LocationGraphEditor)
\ No newline at end of file
+add_subdirectory(LocationGraphEditor)
-- 
GitLab


From ef9b39369a3ee99d88e128aa4c240fdb1d19d01e Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:10:26 +0200
Subject: [PATCH 6/7] Update includes

---
 .../components/NavigationMemory/NavigationMemory.cpp          | 1 +
 .../Navigation/components/NavigationMemory/NavigationMemory.h | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
index d2267148..59a84bbe 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
@@ -31,6 +31,7 @@
 #include <armarx/navigation/graph/constants.h>
 #include <armarx/navigation/graph/Graph.h>
 
+#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/ltm/disk/MemoryManager.h>
 #include <RobotAPI/libraries/armem/server/query_proc/ltm.h>
 #include <RobotAPI/libraries/armem/client/query.h>
diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.h b/source/Navigation/components/NavigationMemory/NavigationMemory.h
index f769f90a..6a6606c1 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.h
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.h
@@ -24,7 +24,7 @@
 
 
 #include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
-#include <RobotAPI/libraries/armem/server/ComponentPlugin.h>
+#include <RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h>
 
 #include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h>
 
@@ -54,7 +54,7 @@ namespace armarx::nav
         // , virtual public armarx::DebugObserverComponentPluginUser
         , virtual public armarx::LightweightRemoteGuiComponentPluginUser
         , virtual public armarx::ArVizComponentPluginUser
-        , virtual public armarx::armem::server::ComponentPluginUser
+        , virtual public armarx::armem::server::ReadWritePluginUser
     {
     public:
 
-- 
GitLab


From 8f5ead1f2a661d4851132d57c0d26e51d1453ad0 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 6 Sep 2021 11:04:50 +0200
Subject: [PATCH 7/7] Add GraphImportExport scenario

---
 .../GraphImportExport/GraphImportExport.scx   |   5 +
 .../config/GraphImportExport.cfg              | 254 ++++++++++++++++++
 scenarios/GraphImportExport/config/global.cfg |   4 +
 3 files changed, 263 insertions(+)
 create mode 100644 scenarios/GraphImportExport/GraphImportExport.scx
 create mode 100644 scenarios/GraphImportExport/config/GraphImportExport.cfg
 create mode 100644 scenarios/GraphImportExport/config/global.cfg

diff --git a/scenarios/GraphImportExport/GraphImportExport.scx b/scenarios/GraphImportExport/GraphImportExport.scx
new file mode 100644
index 00000000..ffbce148
--- /dev/null
+++ b/scenarios/GraphImportExport/GraphImportExport.scx
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scenario name="GraphImportExport" creation="2021-08-18.09:51:51" globalConfigName="./config/global.cfg" package="Navigation" deploymentType="local" nodeName="NodeMain">
+	<application name="GraphImportExport" instance="" package="Navigation" nodeName="" enabled="true" iceAutoRestart="false"/>
+</scenario>
+
diff --git a/scenarios/GraphImportExport/config/GraphImportExport.cfg b/scenarios/GraphImportExport/config/GraphImportExport.cfg
new file mode 100644
index 00000000..95073507
--- /dev/null
+++ b/scenarios/GraphImportExport/config/GraphImportExport.cfg
@@ -0,0 +1,254 @@
+# ==================================================================
+# GraphImportExport properties
+# ==================================================================
+
+# ArmarX.AdditionalPackages:  List of additional ArmarX packages which should be in the list of default packages. If you have custom packages, which should be found by the gui or other apps, specify them here. Comma separated List.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.AdditionalPackages = Default value not mapped.
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+#  Attributes:
+#  - Default:            mongo/.cache
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.CachePath = mongo/.cache
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.DefaultPackages:  List of ArmarX packages which are accessible by default. Comma separated List. If you want to add your own packages and use all default ArmarX packages, use the property 'AdditionalPackages'.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.DefaultPackages = Default value not mapped.
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.DisableLogging = false
+
+
+# ArmarX.EnableProfiling:  Enable profiling of CPU load produced by this application
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.EnableProfiling = false
+
+
+# ArmarX.GraphImportExport.ArVizTopicName:  Name of the ArViz topic
+#  Attributes:
+#  - Default:            ArVizTopic
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.ArVizTopicName = ArVizTopic
+
+
+# ArmarX.GraphImportExport.DebugObserverTopicName:  Name of the topic the DebugObserver listens on
+#  Attributes:
+#  - Default:            DebugObserver
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.DebugObserverTopicName = DebugObserver
+
+
+# ArmarX.GraphImportExport.EnableProfiling:  enable profiler which is used for logging performance events
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.GraphImportExport.EnableProfiling = false
+
+
+# ArmarX.GraphImportExport.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
+# ArmarX.GraphImportExport.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.GraphImportExport.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.ObjectName = ""
+
+
+# ArmarX.GraphImportExport.RemoteGuiName:  Name of the remote gui provider
+#  Attributes:
+#  - Default:            RemoteGuiProvider
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.RemoteGuiName = RemoteGuiProvider
+
+
+# ArmarX.GraphImportExport.cmp.GraphNodePoseResolver:  Ice object name of the `GraphNodePoseResolver` component.
+#  Attributes:
+#  - Default:            GraphNodePoseResolver
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.cmp.GraphNodePoseResolver = GraphNodePoseResolver
+
+
+# ArmarX.GraphImportExport.cmp.PriorKnowledge:  Ice object name of the `PriorKnowledge` component.
+#  Attributes:
+#  - Default:            PriorKnowledge
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.cmp.PriorKnowledge = PriorKnowledge
+
+
+# ArmarX.GraphImportExport.mns.MemoryNameSystemEnabled:  Whether to use (and depend on) the Memory Name System (MNS).
+# Set to false to use this memory as a stand-alone.
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.GraphImportExport.mns.MemoryNameSystemEnabled = true
+
+
+# ArmarX.GraphImportExport.mns.MemoryNameSystemName:  Name of the Memory Name System (MNS) component.
+#  Attributes:
+#  - Default:            MemoryNameSystem
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.mns.MemoryNameSystemName = MemoryNameSystem
+
+
+# ArmarX.GraphImportExport.tpc.sub.MemoryListener:  Name of the `MemoryListener` topic to subscribe to.
+#  Attributes:
+#  - Default:            MemoryUpdates
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.GraphImportExport.tpc.sub.MemoryListener = MemoryUpdates
+
+
+# ArmarX.LoadLibraries:  Libraries to load at start up of the application. Must be enabled by the Application with enableLibLoading(). Format: PackageName:LibraryName;... or /absolute/path/to/library;...
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.LoadLibraries = ""
+
+
+# ArmarX.LoggingGroup:  The logging group is transmitted with every ArmarX log message over Ice in order to group the message in the GUI.
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.LoggingGroup = ""
+
+
+# ArmarX.RedirectStdout:  Redirect std::cout and std::cerr to ArmarXLog
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.RedirectStdout = true
+
+
+# ArmarX.RemoteHandlesDeletionTimeout:  The timeout (in ms) before a remote handle deletes the managed object after the use count reached 0. This time can be used by a client to increment the count again (may be required when transmitting remote handles)
+#  Attributes:
+#  - Default:            3000
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.RemoteHandlesDeletionTimeout = 3000
+
+
+# ArmarX.SecondsStartupDelay:  The startup will be delayed by this number of seconds (useful for debugging)
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.SecondsStartupDelay = 0
+
+
+# ArmarX.StartDebuggerOnCrash:  If this application crashes (segmentation fault) qtcreator will attach to this process and start the debugger.
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.StartDebuggerOnCrash = false
+
+
+# ArmarX.ThreadPoolSize:  Size of the ArmarX ThreadPool that is always running.
+#  Attributes:
+#  - Default:            1
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ThreadPoolSize = 1
+
+
+# ArmarX.TopicSuffix:  Suffix appended to all topic names for outgoing topics. This is mainly used to direct all topics to another name for TopicReplaying purposes.
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.TopicSuffix = ""
+
+
+# ArmarX.UseTimeServer:  Enable using a global Timeserver (e.g. from ArmarXSimulator)
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.UseTimeServer = false
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Info
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
+ArmarX.Verbosity = Verbose
+
+
diff --git a/scenarios/GraphImportExport/config/global.cfg b/scenarios/GraphImportExport/config/global.cfg
new file mode 100644
index 00000000..673c18c7
--- /dev/null
+++ b/scenarios/GraphImportExport/config/global.cfg
@@ -0,0 +1,4 @@
+# ==================================================================
+# Global Config from Scenario GraphImportExport
+# ==================================================================
+
-- 
GitLab