36 VirtualRobot::RobotIO::RobotDescription::eStructure);
53 srv(srv), params(params)
61 ARMARX_VERBOSE <<
"Resetting PriorityQueue, old requests are discarded";
63 std::scoped_lock<std::mutex> targetLock(targetMutex);
64 requestedTargets.clear();
68 currentTargetBuffer.getWriteBuffer() = std::nullopt;
69 currentTargetBuffer.commitWrite();
76 Scheduler::checkTargetDeadline()
78 bool deadlineViolation =
false;
80 std::scoped_lock<std::mutex> targetLock(targetMutex);
83 deadlineViolation =
true;
87 currentTargetBuffer.getWriteBuffer() = std::nullopt;
88 currentTargetBuffer.commitWrite();
91 if (deadlineViolation)
98 Scheduler::submitIdleTarget()
103 params.
defaultTarget, robot_->getRootNode()->getName(), robot_->getName());
110 std::scoped_lock<std::mutex> targetLock(targetMutex);
111 requestedTargets.emplace(
112 gaze_targets::GazeTarget(
"idle", viewCenter, priority, infinite,
true));
119 Scheduler::visualizeActiveTarget()
126 const std::string activeTargetLayerName =
"active_target";
128 const auto currentTarget = currentTargetBuffer.getUpToDateReadBuffer();
130 if (not currentTarget.has_value())
133 srv.
arviz->commitDeleteLayer(activeTargetLayerName);
139 ARMARX_VERBOSE <<
"Failed to synchronize robot. Cannot visualize targets.";
143 const Eigen::Vector3f globalPosition = currentTarget->position.toGlobalEigen(robot_);
145 std::map<gaze_targets::AttentionType, simox::Color> attentionTypeColor{
155 auto l = srv.
arviz->layer(activeTargetLayerName);
157 .position(globalPosition)
159 .color(attentionTypeColor.at(currentTarget->priority.attentionType)));
160 srv.
arviz->commit(l);
164 Scheduler::runPeriodically()
166 checkTargetDeadline();
167 visualizeActiveTarget();
174 std::scoped_lock<std::mutex> targetLock(targetMutex);
178 for (
auto it = requestedTargets.cbegin(); it != requestedTargets.cend(); it++)
180 if (it->name ==
target.name)
183 requestedTargets.erase(it);
188 requestedTargets.emplace(
target);
195 std::scoped_lock<std::mutex> targetLock(targetMutex);
196 if (requestedTargets.empty())
205 auto nextTarget = requestedTargets.cbegin();
209 for (
const auto&
target : requestedTargets)
214 const auto currentTarget = currentTargetBuffer.getUpToDateReadBuffer();
216 if (not currentTarget.has_value())
218 ARMARX_VERBOSE <<
"No currently active Targets, submitting new target: " << *nextTarget;
220 submitControlTarget(*nextTarget);
223 if (nextTarget->keepInQueue)
229 requestedTargets.erase(nextTarget);
235 if (nextTarget->priority >= currentTarget->priority)
237 ARMARX_VERBOSE <<
"requested Target priority > current Target priority ("
238 << nextTarget->priority <<
" > " << currentTarget->priority <<
")";
241 submitControlTarget(*nextTarget);
245 ARMARX_VERBOSE <<
"current Target has higher priority (" << nextTarget->priority
246 <<
" <= " << currentTarget->priority
247 <<
") waiting until it is reached";
255 if (
target.duration.toMicroSeconds() < 0)
265 currentTargetBuffer.getWriteBuffer() =
target;
266 currentTargetBuffer.commitWrite();