33 auto stopped_callback = [
this](
const auto& e) { stopped(
StopEvent(e)); };
35 srv.subscriber->onGoalReached(stopped_callback);
36 srv.subscriber->onSafetyStopTriggered(stopped_callback);
37 srv.subscriber->onUserAbortTriggered(stopped_callback);
38 srv.subscriber->onInternalError(stopped_callback);
39 srv.subscriber->onGlobalPlanningFailed(stopped_callback);
46 moveTo(std::vector<core::Pose>{pose}, frame);
57 std::scoped_lock
const l{stoppedInfo.m};
58 stoppedInfo.event.reset();
60 forward(
"moveTo", [&] { srv.navigator->moveTo(waypoints, frame); });
69 const std::vector<WaypointTarget>& path = builder.
path();
75 std::scoped_lock
const l{stoppedInfo.m};
76 stoppedInfo.event.reset();
78 forward(
"moveTo", [&] { srv.navigator->moveTo(path, frame); });
91 std::scoped_lock
const l{stoppedInfo.m};
92 stoppedInfo.event.reset();
94 forward(
"moveToAlternatives",
95 [&] { srv.navigator->moveToAlternatives(
targets, frame); });
104 forward(
"update", [&] { srv.navigator->update(waypoints, frame); });
116 std::scoped_lock
const l{stoppedInfo.m};
117 stoppedInfo.event.reset();
119 forward(
"moveTowards", [&] { srv.navigator->moveTowards(direction, frame); });
124 const std::optional<std::string>& providerName)
132 std::scoped_lock
const l{stoppedInfo.m};
133 stoppedInfo.event.reset();
135 forward(
"moveToLocation",
136 [&] { srv.navigator->moveToLocation(
location, providerName); });
144 srv.navigator->setVelocityFactor(velocityFactor);
152 srv.navigator->pause();
160 srv.navigator->resume();
168 forward(
"stop", [&] { srv.navigator->stop(); });
193 std::future<void> future = std::async(
197 std::unique_lock l{stoppedInfo.m};
198 stoppedInfo.cv.wait(l, [&i = stoppedInfo] {
return i.event.has_value(); });
205 auto status = future.wait_for(std::chrono::milliseconds(timeoutMs));
210 case std::future_status::ready:
211 ARMARX_INFO <<
"waitForStop: terminated on goal reached";
213 case std::future_status::timeout:
214 ARMARX_INFO <<
"waitForStop: terminated due to timeout";
218 throw LocalException(
"Navigator::waitForStop: timeout");
220 case std::future_status::deferred:
236 stoppedInfo.event.reset();
242 Navigator::forward(
const char* what,
const std::function<
void()>& call)
248 catch (
const std::exception& e)
251 ARMARX_WARNING <<
"Navigator call `" << what <<
"` failed: " << e.what();
253 {
armarx::Clock::Now()}, core::Pose::Identity(), std::string(what) +
": " + e.what()}));
262 std::scoped_lock l{stoppedInfo.m};
263 stoppedInfo.event = e;
265 stoppedInfo.cv.notify_all();
static DateTime Now()
Current time on the virtual clock.
void setVelocityFactor(float velocityFactor)
void update(const std::vector< core::Pose > &waypoints, core::NavigationFrame frame)
void moveToLocation(const std::string &location, const std::optional< std::string > &providerName)
Navigator(const InjectedServices &services)
void moveTo(const core::Pose &pose, core::NavigationFrame frame)
void moveToAlternatives(const std::vector< core::TargetAlternative > &targets, core::NavigationFrame frame)
StopEvent waitForStop(std::int64_t timeoutMs=-1)
void moveTowards(const core::Direction &direction, core::NavigationFrame frame)
void onGoalReached(const std::function< void(void)> &callback)
void onWaypointReached(const std::function< void(int)> &callback)
const WaypointTargets & path() const
Brief description of class targets.
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_INFO
The normal logging level.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
This file is part of ArmarX.
void validate(const std::vector< WaypointTarget > &path)
Eigen::Vector3f Direction
This file is part of ArmarX.
Event describing that the targeted goal was successfully reached.
Event describing the occurance of an internal unhandled error.