diff --git a/source/armarx/view_selection/components/scheduler_example/Component.cpp b/source/armarx/view_selection/components/scheduler_example/Component.cpp index 9fd0b17be733b60c1d7e27b464d42ec1eba189be..39407b1addcc34b3b6bf703ba2de6469f84d06c0 100644 --- a/source/armarx/view_selection/components/scheduler_example/Component.cpp +++ b/source/armarx/view_selection/components/scheduler_example/Component.cpp @@ -96,6 +96,7 @@ namespace armarx::view_selection::components::scheduler_example //can not call consecutive targets with inverse order without getting stuck //TODO:resolve timing bug of inverse priority requests armarx::Clock::WaitFor(armarx::core::time::Duration::MilliSeconds(100)); + gazeScheduler->fixateFor(new FramedPosition(Eigen::Vector3f(500, -2000, 1000), "Global", "Armar6"), {taskAttention, 1.5}, duration); gazeScheduler->fixateFor(new FramedPosition(Eigen::Vector3f(500, 2000, 1000), "root", "Armar6"), {taskAttention, 0.8}, duration); layer.add(viz::Sphere("target_3") @@ -114,7 +115,6 @@ namespace armarx::view_selection::components::scheduler_example // .position(Eigen::Vector3f(0, 4000, 2000)) // .radius(50).color(simox::Color::blue())); - gazeScheduler->fixateFor(new FramedPosition(Eigen::Vector3f(500, -2000, 1000), "Global", "Armar6"), {taskAttention, 1.5}, duration); //gazeScheduler->fixateFor(new FramedPosition(Eigen::Vector3f(1500, -2000, 1000), "Global", "Armar6"), {stimulusAttention, 10.0}, duration_infinite); //gazeScheduler->fixateFor(new FramedPosition(Eigen::Vector3f(500, -2000, 1000), "Global", "Armar6"), {stimulusAttention, 11.0}, duration); arviz.commit(layer); diff --git a/source/armarx/view_selection/gaze_scheduler/Scheduler.cpp b/source/armarx/view_selection/gaze_scheduler/Scheduler.cpp index cb41c52ff547051d943cef3329c297306486c63e..d667ac09301f4628f946c9fd776bfc5b3d8fe76c 100644 --- a/source/armarx/view_selection/gaze_scheduler/Scheduler.cpp +++ b/source/armarx/view_selection/gaze_scheduler/Scheduler.cpp @@ -87,13 +87,6 @@ namespace armarx::view_selection::gaze_scheduler controller = armarx::control::gaze_controller::GazeControllerInterfacePrx::checkedCast( robotUnit->createNJointController("GazeController", "ViewController", config)); controller->activateController(); - - //for testing - this->task = new armarx::SimpleRunningTask<>([this]() - { - this->run(); - }); - this->task->start(); } @@ -159,16 +152,20 @@ namespace armarx::view_selection::gaze_scheduler } else if (submittedTargets.back().priority < requestedTargets.top().priority) { - ARMARX_INFO << "current Target has lower priority (" + ARMARX_INFO << "current Target has lower priority than next in Queue (" << submittedTargets.back().priority << " < " << requestedTargets.top().priority - << ") replacing until later"; + << ") removing it"; //replaced target needs to be stopped properly, then next target will be scheduled automatically + if (!openStopRequest) + { + openStopRequest = true; + armarx::core::time::dto::Duration zero; + armarx::core::time::toIce(zero, armarx::core::time::Duration()); + controller->removeTargetAfter(zero); + } //TODO: does the target need to be reinserted in the request queue? //requestedTargets.push(submittedTargets.back()); //submittedTargets.pop_back(); - armarx::core::time::dto::Duration zero; - armarx::core::time::toIce(zero, armarx::core::time::Duration()); - controller->removeTargetAfter(zero); } else { @@ -189,6 +186,8 @@ namespace armarx::view_selection::gaze_scheduler if (memoryTarget.isReleased()) { submittedTargets.erase(submittedTargets.begin() + i); + //enable stop requests only after erasing their target to prevent multiple consecutive calls + openStopRequest = false; scheduleNextTarget(); return; } @@ -196,12 +195,14 @@ namespace armarx::view_selection::gaze_scheduler { armarx::core::time::dto::Duration duration; armarx::core::time::toIce(duration, submittedTargets[i].duration); + openStopRequest = true; controller->removeTargetAfter(duration); } else if (memoryTarget.isAborted()) { armarx::core::time::dto::Duration zero; armarx::core::time::toIce(zero, armarx::core::time::Duration()); + openStopRequest = true; controller->removeTargetAfter(zero); } } @@ -245,7 +246,7 @@ namespace armarx::view_selection::gaze_scheduler { ARMARX_INFO << "Query failed: " << result.errorMessage; } - ARMARX_INFO << "Memory updated, " << submittedTargets.size() << " open Targets:"; + ARMARX_INFO << "Memory updated, " << submittedTargets.size() << " open Target:"; for (auto target : submittedTargets) { ARMARX_INFO << target; diff --git a/source/armarx/view_selection/gaze_scheduler/Scheduler.h b/source/armarx/view_selection/gaze_scheduler/Scheduler.h index 077f4b4ab4f8ebda8bc4dc549c67515c4882a1da..afa9511cb47a562ca6052695cff9cd9bd2819c4a 100644 --- a/source/armarx/view_selection/gaze_scheduler/Scheduler.h +++ b/source/armarx/view_selection/gaze_scheduler/Scheduler.h @@ -29,11 +29,11 @@ #include <ArmarXCore/core/Component.h> #include <ArmarXCore/core/time.h> -#include <ArmarXCore/core/services/tasks/TaskUtil.h> -//#include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h> #include <RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.h> #include <RobotAPI/libraries/core/FramedPose.h> +#include <RobotAPI/libraries/armem/client/Reader.h> +#include <RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h> #include <armarx/control/gaze_controller/gaze_target/GazeTarget.h> #include <armarx/control/gaze_controller/GazeControllerInterface.h> @@ -41,9 +41,6 @@ #include <armarx/view_selection/client/ice/GazeSchedulerInterface.h> #include <armarx/view_selection/client.h> -#include <RobotAPI/libraries/armem/client/Reader.h> -#include <RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h> - namespace armarx::view_selection::gaze_scheduler { @@ -105,10 +102,6 @@ namespace armarx::view_selection::gaze_scheduler RobotUnitInterfacePrx robotUnit; armarx::control::gaze_controller::GazeControllerInterfacePrx controller; - std::mutex targetMutex; - std::map<long, long> openTargets; - armarx::SimpleRunningTask<>::pointer_type task = nullptr; - struct TargetRequest { FramedPositionBasePtr target; @@ -158,8 +151,14 @@ namespace armarx::view_selection::gaze_scheduler }; + //to prevent multiple consecutive stop requests + std::atomic<bool> openStopRequest = false; + //target managemant needs to be synchronized + std::mutex targetMutex; + std::map<long, long> openTargets; std::priority_queue<TargetRequest> requestedTargets; std::vector<TargetRequest> submittedTargets; + }; } // namespace armarx::view_selection::gaze_scheduler