diff --git a/source/armarx/navigation/server/NavigationStack.h b/source/armarx/navigation/server/NavigationStack.h index 9c047123f4a851cb85448f5ba3424ac3a4e625be..c2a76f9a2269400f62d3e699d503036159db7a47 100644 --- a/source/armarx/navigation/server/NavigationStack.h +++ b/source/armarx/navigation/server/NavigationStack.h @@ -34,7 +34,7 @@ namespace armarx::navigation::server { global_planning::GlobalPlannerPtr globalPlanner; loc_plan::LocalPlannerPtr localPlanner = nullptr; - traj_ctrl::TrajectoryControllerPtr trajectoryControl; - safe_ctrl::SafetyControllerPtr safetyControl = nullptr; + // traj_ctrl::TrajectoryControllerPtr trajectoryControl; + // safe_ctrl::SafetyControllerPtr safetyControl = nullptr; }; } // namespace armarx::navigation::server diff --git a/source/armarx/navigation/server/Navigator.cpp b/source/armarx/navigation/server/Navigator.cpp index 3a1b42f2c58f29c5eb7164cbab8921c86055762e..bf343cba7e3d6d55e7a475eccbcd5df788a9865d 100644 --- a/source/armarx/navigation/server/Navigator.cpp +++ b/source/armarx/navigation/server/Navigator.cpp @@ -624,62 +624,18 @@ namespace armarx::navigation::server ARMARX_TRACE; ARMARX_INFO << "Planning local trajectory enabled"; - localPlannerTask = + replanningTask = new PeriodicTask<Navigator>(this, &Navigator::updateLocalPlanner, - config.general.tasks.localPlanningUpdatePeriod, + config.general.tasks.replanningUpdatePeriod, false, "LocalPlannerTask"); - localPlannerTask->start(); + replanningTask->start(); } - // trajectory controller - ARMARX_CHECK_NOT_NULL(config.stack.trajectoryControl); - trajectoryControllerTask = - new PeriodicTask<Navigator>(this, - &Navigator::updateTrajectoryController, - config.general.tasks.trajectoryControllerUpdatePeriod, - false, - "TrajectoryControllerTask"); - trajectoryControllerTask->start(); - - // safety controller - if (config.stack.safetyControl) - { - ARMARX_INFO << "Safety control enabled"; - safetyControllerTask = - new PeriodicTask<Navigator>(this, - &Navigator::updateSafetyController, - config.general.tasks.safetyControllerUpdatePeriod, - false, - "SafetyControllerTask"); - safetyControllerTask->start(); - } - - // executor - executorTask = new PeriodicTask<Navigator>(this, - &Navigator::updateExecutor, - config.general.tasks.executorUpdatePeriod, - false, - "ExecutorTask"); - executorTask->start(); - - // introspector - introspectorTask = - new PeriodicTask<Navigator>(this, - &Navigator::updateIntrospector, - config.general.tasks.introspectorUpdatePeriod, - false, - "IntrospectorTask"); - introspectorTask->start(); // monitoring ARMARX_INFO << "Starting monitoring"; - // std::vector<core::Pose> waypoints = globalPlan->trajectory.poses(); - - - // goalReachedMonitor = - // GoalReachedMonitor(waypoints.back(), *config.scene, GoalReachedMonitorConfig()); monitorTask = new PeriodicTask<Navigator>(this, &Navigator::updateMonitor, config.general.tasks.monitorUpdatePeriod, @@ -750,7 +706,7 @@ namespace armarx::navigation::server ARMARX_TRACE; srv.publisher->globalTrajectoryUpdated(globalPlan.value()); - // srv.introspector->onGlobalPlan(globalPlan.value()); + srv.introspector->onGlobalPlannerResult(globalPlan.value()); ARMARX_INFO << "Global planning completed. Will now start all required threads"; ARMARX_TRACE; @@ -759,58 +715,17 @@ namespace armarx::navigation::server if (config.stack.localPlanner) { ARMARX_INFO << "Planning local trajectory enabled"; - localPlannerTask = + replanningTask = new PeriodicTask<Navigator>(this, - &Navigator::updateLocalPlanner, - config.general.tasks.localPlanningUpdatePeriod, + &Navigator::replan, + config.general.tasks.replanningUpdatePeriod, false, "LocalPlannerTask"); - localPlannerTask->start(); + replanningTask->start(); } - // trajectory controller - ARMARX_CHECK_NOT_NULL(config.stack.trajectoryControl); - trajectoryControllerTask = - new PeriodicTask<Navigator>(this, - &Navigator::updateTrajectoryController, - config.general.tasks.trajectoryControllerUpdatePeriod, - false, - "TrajectoryControllerTask"); - trajectoryControllerTask->start(); - - // safety controller - if (config.stack.safetyControl) - { - ARMARX_INFO << "Safety control enabled"; - safetyControllerTask = - new PeriodicTask<Navigator>(this, - &Navigator::updateSafetyController, - config.general.tasks.safetyControllerUpdatePeriod, - false, - "SafetyControllerTask"); - safetyControllerTask->start(); - } - - // executor - executorTask = new PeriodicTask<Navigator>(this, - &Navigator::updateExecutor, - config.general.tasks.executorUpdatePeriod, - false, - "ExecutorTask"); - executorTask->start(); - - // introspector - introspectorTask = - new PeriodicTask<Navigator>(this, - &Navigator::updateIntrospector, - config.general.tasks.introspectorUpdatePeriod, - false, - "IntrospectorTask"); - introspectorTask->start(); - // monitoring ARMARX_INFO << "Starting monitoring"; - monitorTask = new PeriodicTask<Navigator>(this, &Navigator::updateMonitor, config.general.tasks.monitorUpdatePeriod, @@ -841,6 +756,14 @@ namespace armarx::navigation::server { } + void + Navigator::replan() + { + updateLocalPlanner(); + updateExecutor(); + updateIntrospector(); + } + void Navigator::updateLocalPlanner() { @@ -856,31 +779,6 @@ namespace armarx::navigation::server } } - void - Navigator::updateTrajectoryController() - { - // TODO distinguish between global and local plan! - - if (not globalPlan.has_value()) - { - return; - } - - trajectoryCtrlResult = config.stack.trajectoryControl->control(globalPlan->trajectory); - - srv.publisher->trajectoryControllerUpdated(trajectoryCtrlResult.value()); - } - - void - Navigator::updateSafetyController() - { - // FIXME - // if (res.controlVelocity) - // { - // res.safeVelocity = config.stack.safetyControl->control(res.controlVelocity.value()); - // } - } - void Navigator::updateExecutor() { @@ -898,32 +796,23 @@ namespace armarx::navigation::server return; } - const core::Twist twist = [&]() -> core::Twist - { - if (config.stack.safetyControl != nullptr) - { - return safetyCtrlResult->twist; - } - return trajectoryCtrlResult->twist; - }(); + // const core::Rotation robot_R_world(config.scene->robot->getGlobalOrientation().inverse()); - const core::Rotation robot_R_world(config.scene->robot->getGlobalOrientation().inverse()); + // ARMARX_VERBOSE + // << deactivateSpam(100) << "Robot orientation " + // << simox::math::mat3f_to_rpy(config.scene->robot->getGlobalOrientation()).z(); - ARMARX_VERBOSE - << deactivateSpam(100) << "Robot orientation " - << simox::math::mat3f_to_rpy(config.scene->robot->getGlobalOrientation()).z(); + // core::Twist robotFrameVelocity; - core::Twist robotFrameVelocity; + // robotFrameVelocity.linear = robot_R_world * twist.linear; + // // FIXME fix angular velocity + // robotFrameVelocity.angular = twist.angular; - robotFrameVelocity.linear = robot_R_world * twist.linear; - // FIXME fix angular velocity - robotFrameVelocity.angular = twist.angular; + // ARMARX_VERBOSE << deactivateSpam(1) << "velocity in robot frame " + // << robotFrameVelocity.linear; - ARMARX_VERBOSE << deactivateSpam(1) << "velocity in robot frame " - << robotFrameVelocity.linear; - - srv.executor->move(robotFrameVelocity); + srv.executor->execute(currentTrajectory()); } void @@ -932,30 +821,16 @@ namespace armarx::navigation::server ARMARX_CHECK_NOT_NULL(srv.introspector); // TODO event driven. should be committed only on change - if(globalPlan.has_value()) - { - srv.introspector->onGlobalPlannerResult(globalPlan.value()); - } + // if(globalPlan.has_value()) + // { + // srv.introspector->onGlobalPlannerResult(globalPlan.value()); + // } if (localPlan.has_value()) { srv.introspector->onLocalPlannerResult(localPlan.value()); } - if (trajectoryCtrlResult.has_value()) - { - srv.introspector->onTrajectoryControllerResult(trajectoryCtrlResult.value()); - } - - if (safetyCtrlResult.has_value()) - { - srv.introspector->onSafetyControllerResult(safetyCtrlResult.value()); - } - - // if (res.isValid()) - // { - // srv.introspector->onStackResult(res); - // } } void @@ -991,11 +866,7 @@ namespace armarx::navigation::server void Navigator::stopAllThreads() { - stopIfRunning(localPlannerTask); - stopIfRunning(trajectoryControllerTask); - stopIfRunning(safetyControllerTask); - stopIfRunning(executorTask); - stopIfRunning(introspectorTask); + stopIfRunning(replanningTask); stopIfRunning(monitorTask); } @@ -1023,29 +894,21 @@ namespace armarx::navigation::server } } - // trajectory controller - if (config.stack.trajectoryControl != nullptr) - { - if (not trajectoryCtrlResult.has_value()) - { - ARMARX_VERBOSE << deactivateSpam(1) << "Raw control velocity not yet set."; - return false; - } - } + // [[likely]] + return true; + } - // safety controller - if (config.stack.safetyControl != nullptr) + const core::Trajectory& Navigator::currentTrajectory() const + { + ARMARX_CHECK(isStackResultValid()); + + if(localPlan.has_value()) { - if (not safetyCtrlResult.has_value()) - { - ARMARX_VERBOSE << deactivateSpam(1) << "Safe velocity not yet set."; - return false; - } + return localPlan->trajectory; } - // [[likely]] - return true; - } + return globalPlan->trajectory; + } void Navigator::pause() @@ -1055,7 +918,7 @@ namespace armarx::navigation::server executorEnabled.store(false); ARMARX_CHECK_NOT_NULL(srv.executor); - srv.executor->move(core::Twist::Zero()); + srv.executor->stop(); } void diff --git a/source/armarx/navigation/server/Navigator.h b/source/armarx/navigation/server/Navigator.h index a1ccfa3e3cc9cfd4ce9d4459fe7699931d48bd8f..933a1c24dd52d08d62e151684b0ff02fe79c46c6 100644 --- a/source/armarx/navigation/server/Navigator.h +++ b/source/armarx/navigation/server/Navigator.h @@ -62,13 +62,8 @@ namespace armarx::navigation::server { struct { - // TODO: Use chrono? - int localPlanningUpdatePeriod{100}; // [ms] - int trajectoryControllerUpdatePeriod{100}; // [ms] - int safetyControllerUpdatePeriod{100}; // [ms] - int introspectorUpdatePeriod{100}; // [ms] - int executorUpdatePeriod{100}; // [ms] - int monitorUpdatePeriod{20}; // [ms] + int replanningUpdatePeriod{10}; // [ms] + int monitorUpdatePeriod{10}; // [ms] } tasks; }; @@ -84,7 +79,6 @@ namespace armarx::navigation::server IntrospectorInterface* introspector = nullptr; }; - public: Navigator(const Config& config, const InjectedServices& services); void moveTo(const std::vector<core::Pose>& waypoints, @@ -117,15 +111,15 @@ namespace armarx::navigation::server void moveToAbsolute(const std::vector<core::Pose>& waypoints); void moveTowardsAbsolute(const core::Direction& direction); - void updateLocalPlanner(); - void updateTrajectoryController(); - void updateSafetyController(); + void replan(); + void updateLocalPlanner(); void updateExecutor(); - void updateIntrospector(); + void updateMonitor(); + const core::Trajectory& currentTrajectory() const; bool isStackResultValid() const noexcept; void stopAllThreads(); @@ -143,16 +137,7 @@ namespace armarx::navigation::server std::atomic_bool executorEnabled = true; - // StackResult res; - - PeriodicTask<Navigator>::pointer_type localPlannerTask; - PeriodicTask<Navigator>::pointer_type trajectoryControllerTask; - PeriodicTask<Navigator>::pointer_type safetyControllerTask; - - PeriodicTask<Navigator>::pointer_type executorTask; - - PeriodicTask<Navigator>::pointer_type introspectorTask; - + PeriodicTask<Navigator>::pointer_type replanningTask; PeriodicTask<Navigator>::pointer_type monitorTask; std::optional<GoalReachedMonitor> goalReachedMonitor; @@ -160,8 +145,6 @@ namespace armarx::navigation::server std::optional<global_planning::GlobalPlannerResult> globalPlan; std::optional<loc_plan::LocalPlannerResult> localPlan; - std::optional<traj_ctrl::TrajectoryControllerResult> trajectoryCtrlResult; - std::optional<safe_ctrl::SafetyControllerResult> safetyCtrlResult; }; } // namespace armarx::navigation::server