From 47479041466f9f833ca8e178ff510d754bb2e654 Mon Sep 17 00:00:00 2001
From: "Christian R. G. Dreher" <c.dreher@kit.edu>
Date: Thu, 8 Jul 2021 16:33:18 +0200
Subject: [PATCH] fix: Make component::Navigator and server::Navigator compile.

---
 .../components/Navigator/Navigator.cpp        | 54 ++++++++++---------
 .../components/Navigator/Navigator.h          | 17 ++++--
 .../Navigator/NavigatorInterface.ice          |  1 +
 .../Navigation/libraries/server/Navigator.cpp | 35 +++++++++---
 .../Navigation/libraries/server/Navigator.h   |  9 +++-
 .../libraries/server/test/serverTest.cpp      |  2 +-
 6 files changed, 79 insertions(+), 39 deletions(-)

diff --git a/source/Navigation/components/Navigator/Navigator.cpp b/source/Navigation/components/Navigator/Navigator.cpp
index b941324f..83ccf9fb 100644
--- a/source/Navigation/components/Navigator/Navigator.cpp
+++ b/source/Navigation/components/Navigator/Navigator.cpp
@@ -32,6 +32,11 @@
 namespace armarx::nav::components
 {
 
+    Navigator::Navigator() :
+        executor{platformUnit}
+    {
+    }
+
     Navigator::~Navigator()
     {
     }
@@ -51,11 +56,11 @@ namespace armarx::nav::components
     void Navigator::onExitComponent()
     {
     }
-    
-    void Navigator::updateContext() 
+
+    void Navigator::updateContext()
     {
-        ctx.staticScene = staticScene();
-        ctx.robot = getRobot();
+        scene.staticScene = staticScene();
+        scene.robot = getRobot();
     }
 
     std::string Navigator::getDefaultName() const
@@ -63,34 +68,34 @@ namespace armarx::nav::components
         return "Navigator";
     }
 
-    void Navigator::moveTo(const Eigen::Matrix4f& pose,
+    void Navigator::moveTo(const std::vector<Eigen::Matrix4f>& waypoints,
                            const aron::data::AronDictPtr& stackConfig,
                            const std::string& navigationMode,
                            const Ice::Current&)
     {
         updateContext();
 
-        server::NavigationStack stack = fac::NavigationStackFactory::create(stackConfig, ctx);
-        server::Navigator navigator{stack, ctx, executor};
-
-        SimplePeriodicTask<> task(
-            [](){navigator.updateContext()}
-        );
-        task.start()
-        
+        server::NavigationStack stack = fac::NavigationStackFactory::create(stackConfig, scene);
+        server::Navigator navigator{stack, scene, executor};
 
-        navigator.moveTo(core::Pose(pose), core::NavigationFramesMap.from_name(navigationMode));
+        navigator.moveTo(waypoints, core::NavigationFramesMap.from_name(navigationMode));
     }
 
-    void Navigator::moveTowards(const Eigen::Matrix4f& direction,
+    void Navigator::moveTowards(const Eigen::Vector3f& direction,
                                 const aron::data::AronDictPtr& stackConfig,
                                 const std::string& navigationMode,
                                 const Ice::Current&)
     {
-        server::NavigationStack stack = fac::NavigationStackFactory::create(stackConfig, ctx);
-        server::Navigator navigator{stack, ctx};
+        server::NavigationStack stack = fac::NavigationStackFactory::create(stackConfig, scene);
+        server::Navigator navigator{stack, scene, executor};
 
-        // navigator.moveTowards(direction); TODO
+        navigator.moveTowards(direction, core::NavigationFramesMap.from_name(navigationMode));
+    }
+
+    void Navigator::stop(const Ice::Current&)
+    {
+        //server::Navigator navigator;
+        //navigator.stop();
     }
 
     armarx::PropertyDefinitionsPtr Navigator::createPropertyDefinitions()
@@ -116,22 +121,21 @@ namespace armarx::nav::components
         return def;
     }
 
-    core::StaticScenePtr Navigator::staticScene()
+    core::StaticScene Navigator::staticScene()
     {
-        core::StaticScenePtr scene(new core::StaticScene);
+        core::StaticScene scene;
 
         objpose::ObjectPoseSeq objectPoses = ObjectPoseClientPluginUser::getObjectPoses();
 
-        scene->objects = util::asSceneObjects(objectPoses);
+        scene.objects = util::asSceneObjects(objectPoses);
 
         return scene;
     }
-    
-    VirtualRobot::RobotPtr Navigator::getRobot() 
-    {
 
+    VirtualRobot::RobotPtr Navigator::getRobot()
+    {
         auto robot = RemoteRobot::createLocalCloneFromFile(
-            getRobotStateComponent(), VirtualRobot::RobotIO::RobotDescription::eFull);
+                         getRobotStateComponent(), VirtualRobot::RobotIO::RobotDescription::eFull);
         // auto robot = RemoteRobot::createLocalClone(getRobotStateComponent());
         ARMARX_CHECK_NOT_NULL(robot);
 
diff --git a/source/Navigation/components/Navigator/Navigator.h b/source/Navigation/components/Navigator/Navigator.h
index 84f41c17..04c7879f 100644
--- a/source/Navigation/components/Navigator/Navigator.h
+++ b/source/Navigation/components/Navigator/Navigator.h
@@ -26,6 +26,7 @@
 
 // STD/STL
 #include <string>
+#include <vector>
 
 // Eigen
 #include <Eigen/Core>
@@ -39,6 +40,7 @@
 // Navigation
 #include "Navigation/libraries/core/StaticScene.h"
 #include "Navigation/libraries/core/types.h"
+#include <Navigation/libraries/server/execution/PlatformUnitExecutor.h>
 #include <Navigation/components/Navigator/NavigatorInterface.h>
 
 
@@ -64,21 +66,25 @@ namespace armarx::nav::components
     {
 
     public:
+
+        Navigator();
         ~Navigator() override;
 
         /// @see armarx::ManagedIceObject::getDefaultName()
         std::string getDefaultName() const override;
 
-        void moveTo(const Eigen::Matrix4f& pose,
+        void moveTo(const std::vector<Eigen::Matrix4f>& waypoints,
                     const aron::data::AronDictPtr& config,
                     const std::string& navigationMode,
                     const Ice::Current&) override;
 
-        void moveTowards(const Eigen::Matrix4f& direction,
+        void moveTowards(const Eigen::Vector3f& direction,
                          const aron::data::AronDictPtr& config,
                          const std::string& navigationMode,
                          const Ice::Current&) override;
 
+        void stop(const Ice::Current&) override;
+
     protected:
         /// @see PropertyUser::createPropertyDefinitions()
         armarx::PropertyDefinitionsPtr createPropertyDefinitions() override;
@@ -97,7 +103,7 @@ namespace armarx::nav::components
 
         void updateContext();
 
-        core::StaticScenePtr staticScene();
+        core::StaticScene staticScene();
 
         VirtualRobot::RobotPtr getRobot();
 
@@ -105,9 +111,12 @@ namespace armarx::nav::components
     private:
         // TODO update context periodically
 
-        core::Scene ctx;
+        core::Scene scene;
+
+        server::PlatformUnitExecutor executor;
 
         PlatformUnitListenerPrx platformUnit;
+
     };
 } // namespace armarx::nav::components
 
diff --git a/source/Navigation/components/Navigator/NavigatorInterface.ice b/source/Navigation/components/Navigator/NavigatorInterface.ice
index 94c689e6..2a5ac274 100644
--- a/source/Navigation/components/Navigator/NavigatorInterface.ice
+++ b/source/Navigation/components/Navigator/NavigatorInterface.ice
@@ -40,6 +40,7 @@ module armarx
             {
                 void moveTo(Eigen::Matrix4fSeq waypoints, aron::data::AronDict config, string navigationFrame);
                 void moveTowards(Eigen::Vector3f direction, aron::data::AronDict config, string navigationFrame);
+                idempotent void stop();
             };
 
         };
diff --git a/source/Navigation/libraries/server/Navigator.cpp b/source/Navigation/libraries/server/Navigator.cpp
index 749ad8f3..bf2be760 100644
--- a/source/Navigation/libraries/server/Navigator.cpp
+++ b/source/Navigation/libraries/server/Navigator.cpp
@@ -1,5 +1,7 @@
 #include "Navigator.h"
 
+#include <algorithm>
+
 #include <VirtualRobot/Robot.h>
 
 #include "ArmarXCore/core/exceptions/local/ExpressionException.h"
@@ -42,29 +44,32 @@ namespace armarx::nav::server
         setTag("Navigator");
     }
 
-    void Navigator::moveTo(const core::Pose& goal, const core::NavigationFrames& navigationFrame)
+    void Navigator::moveTo(const std::vector<Eigen::Matrix4f>& waypoints, const core::NavigationFrames& navigationFrame)
     {
-        core::Pose globalPose;
+        std::vector<Eigen::Matrix4f> globalWaypoints;
         switch (navigationFrame)
         {
             case core::NavigationFrames::Absolute:
-                globalPose = goal;
+                globalWaypoints = waypoints;
                 break;
             case core::NavigationFrames::Relative:
-                globalPose = core::Pose(scene.robot->getGlobalPose()) * goal;
+                std::transform(std::begin(waypoints), std::end(waypoints), std::begin(globalWaypoints), [&](const Eigen::Matrix4f & m)
+                {
+                    return scene.robot->getGlobalPose() * m;
+                });
                 break;
         }
 
-        moveToAbsolute(globalPose);
+        moveToAbsolute(globalWaypoints);
     }
 
-    void Navigator::moveToAbsolute(const core::Pose& goal)
+    void Navigator::moveToAbsolute(const std::vector<Eigen::Matrix4f>& waypoints)
     {
         ARMARX_INFO << "Planning global trajectory";
         ARMARX_CHECK_NOT_NULL(stack.globalPlanner);
 
         StackResult res;
-        res.globalTrajectory = stack.globalPlanner->plan(goal);
+        res.globalTrajectory = stack.globalPlanner->plan(waypoints.at(0));
 
         if (stack.localPlanner)
         {
@@ -90,4 +95,20 @@ namespace armarx::nav::server
             executor.move(res.velocity());
         }
     }
+
+    void Navigator::moveTowards(const Eigen::Vector3f direction, const core::NavigationFrames& navigationFrame)
+    {
+
+    }
+
+    void Navigator::moveTowardsAbsolute(const Eigen::Vector3f direction)
+    {
+
+    }
+
+    void Navigator::stop()
+    {
+
+    }
+
 } // namespace armarx::nav::server
diff --git a/source/Navigation/libraries/server/Navigator.h b/source/Navigation/libraries/server/Navigator.h
index 848daae3..6ae203bf 100644
--- a/source/Navigation/libraries/server/Navigator.h
+++ b/source/Navigation/libraries/server/Navigator.h
@@ -52,8 +52,13 @@ namespace armarx::nav::server
     public:
         Navigator(const server::NavigationStack& navigationStack, const core::Scene& scene, ExecutorInterface& executor);
 
-        void moveTo(const core::Pose& goal, const core::NavigationFrames& navigationFrame);
-        void moveToAbsolute(const core::Pose& goal);
+        void moveTo(const std::vector<Eigen::Matrix4f>& waypoints, const core::NavigationFrames& navigationFrame);
+        void moveToAbsolute(const std::vector<Eigen::Matrix4f>& waypoints);
+
+        void moveTowards(const Eigen::Vector3f direction, const core::NavigationFrames& navigationFrame);
+        void moveTowardsAbsolute(const Eigen::Vector3f direction);
+
+        void stop();
 
     protected:
     private:
diff --git a/source/Navigation/libraries/server/test/serverTest.cpp b/source/Navigation/libraries/server/test/serverTest.cpp
index 6695d314..86da7406 100644
--- a/source/Navigation/libraries/server/test/serverTest.cpp
+++ b/source/Navigation/libraries/server/test/serverTest.cpp
@@ -65,7 +65,7 @@ BOOST_AUTO_TEST_CASE(testNavigator)
     server::DummyExecutor executor{scene.robot, server::DummyExecutor::Params()};
 
     server::Navigator navigator(stack, scene, executor);
-    navigator.moveTo(goal, core::NavigationFrames::Absolute);
+    navigator.moveTo({goal}, core::NavigationFrames::Absolute);
 
     BOOST_CHECK_EQUAL(true, true);
 }
-- 
GitLab