diff --git a/source/Navigation/components/Navigator/Navigator.cpp b/source/Navigation/components/Navigator/Navigator.cpp index 05a025c3732c60159ea4039f89f774566b4dd3de..ab82d8a29927a0e782790d597ae77b2b8f076e93 100644 --- a/source/Navigation/components/Navigator/Navigator.cpp +++ b/source/Navigation/components/Navigator/Navigator.cpp @@ -32,7 +32,7 @@ #include "Navigation/libraries/core/types.h" #include "Navigation/libraries/util/util.h" #include <Navigation/libraries/factories/NavigationStackFactory.h> -#include <Navigation/libraries/server/Navigator.h> + namespace armarx::nav::components { @@ -88,13 +88,20 @@ namespace armarx::nav::components const std::string& navigationMode, const Ice::Current&) { - updateContext(); - server::NavigationStack stack = fac::NavigationStackFactory::create(stackConfig, scene); - - server::Navigator navigator{stack, scene, executor}; - navigator.moveTo(convert(waypoints), core::NavigationFramesMap.from_name(navigationMode)); + if (navigator.has_value()) + { + navigator->stop(); + navigator.reset(); + } + + if (not navigator.has_value()) + { + navigator.emplace(stack, scene, executor); + } + + navigator->moveTo(convert(waypoints), core::NavigationFramesMap.from_name(navigationMode)); } void Navigator::moveTowards(const Eigen::Vector3f& direction, @@ -103,15 +110,28 @@ namespace armarx::nav::components const Ice::Current&) { server::NavigationStack stack = fac::NavigationStackFactory::create(stackConfig, scene); - server::Navigator navigator{stack, scene, executor}; - navigator.moveTowards(direction, core::NavigationFramesMap.from_name(navigationMode)); + if (navigator.has_value()) + { + navigator->stop(); + navigator.reset(); + } + + if (not navigator.has_value()) + { + navigator.emplace(stack, scene, executor); + } + + navigator->moveTowards(direction, core::NavigationFramesMap.from_name(navigationMode)); } void Navigator::stop(const Ice::Current&) { - //server::Navigator navigator; - //navigator.stop(); + if (navigator.has_value()) + { + navigator->stop(); + navigator.reset(); + } } armarx::PropertyDefinitionsPtr Navigator::createPropertyDefinitions() diff --git a/source/Navigation/components/Navigator/Navigator.h b/source/Navigation/components/Navigator/Navigator.h index 95ee26e2cc2492682852bfdc3c3cc8362aa6673b..4ec574d3a61311bfc40fd8ae56d0f5c155982eda 100644 --- a/source/Navigation/components/Navigator/Navigator.h +++ b/source/Navigation/components/Navigator/Navigator.h @@ -25,6 +25,7 @@ // STD/STL +#include <optional> #include <string> #include <vector> @@ -40,6 +41,7 @@ // Navigation #include "Navigation/libraries/core/StaticScene.h" #include "Navigation/libraries/core/types.h" +#include <Navigation/libraries/server/Navigator.h> #include <Navigation/libraries/server/execution/PlatformUnitExecutor.h> #include <Navigation/components/Navigator/NavigatorInterface.h> @@ -116,7 +118,7 @@ namespace armarx::nav::components core::Scene scene; server::PlatformUnitExecutor executor; - + std::optional<server::Navigator> navigator; }; } // namespace armarx::nav::components diff --git a/source/Navigation/libraries/server/Navigator.cpp b/source/Navigation/libraries/server/Navigator.cpp index 927792ff38fa8c568bb7c3a6805a77c26b197efc..d49b6bcedd2575edcd8722f62ee906f749a0ce38 100644 --- a/source/Navigation/libraries/server/Navigator.cpp +++ b/source/Navigation/libraries/server/Navigator.cpp @@ -45,6 +45,11 @@ namespace armarx::nav::server setTag("Navigator"); } + Navigator::~Navigator() + { + stop(); + } + void Navigator::moveTo(const std::vector<core::Pose>& waypoints, const core::NavigationFrames& navigationFrame) { std::vector<core::Pose> globalWaypoints; diff --git a/source/Navigation/libraries/server/Navigator.h b/source/Navigation/libraries/server/Navigator.h index 4e07f21b550c839a4d657e023a2da6f3b6d0dd8f..499a46259956081a12c44cbe848653a923def274 100644 --- a/source/Navigation/libraries/server/Navigator.h +++ b/source/Navigation/libraries/server/Navigator.h @@ -51,6 +51,7 @@ namespace armarx::nav::server { public: Navigator(const server::NavigationStack& navigationStack, const core::Scene& scene, ExecutorInterface& executor); + virtual ~Navigator(); void moveTo(const std::vector<core::Pose>& waypoints, const core::NavigationFrames& navigationFrame); void moveToAbsolute(const std::vector<core::Pose>& waypoints);