NavigateToAlternatives.cpp
Go to the documentation of this file.
2
3#include <chrono>
4#include <future>
5#include <string>
6
7#include <Eigen/Core>
8#include <Eigen/Geometry>
9
13
16
23
25{
26 template <typename R>
27 bool
28 is_ready(std::future<R> const& f)
29 {
30 if (!f.valid())
31 {
32 return true;
33 }
34 std::future_status status = f.wait_for(std::chrono::seconds(0));
35 if (status == std::future_status::ready)
36 {
37 return true;
38 }
39 else if (status == std::future_status::deferred)
40 {
41 // if the task has not been started --> start the task
42 f.wait();
43 return true;
44 }
45 else
46 {
47 return false;
48 }
49 }
50
57
59 NavigateToAlternatives::init(const Base::SpecializedInitInput& in)
60 {
61 helper.init(in.parameters.navigatingSkillParams,
62 DefaultSkillDescription().skillId.skillName);
63
64 return ::armarx::skills::Skill::InitResult{
66 }
67
69 NavigateToAlternatives::main(const Base::SpecializedMainInput& in)
70 {
71 std::vector<core::TargetAlternative> targetAlternatives;
72 for (const auto& t : in.parameters.targetAlternatives)
73 {
74 core::TargetAlternative bo;
75 core::fromAron(t, bo);
76 targetAlternatives.emplace_back(bo);
77 }
78
79 ARMARX_INFO << "moving to " << targetAlternatives.size() << " alternatives";
80
81 // execute
82 ARMARX_INFO << "Sending navigation request";
83 helper.getNavigator()->moveToAlternatives(targetAlternatives,
85
86 // Wait until goal is reached
87 ARMARX_INFO << "Waiting until goal is reached.";
88
89 auto future = std::async(std::launch::async,
90 [this]() { return helper.getNavigator()->waitForStop(); });
91 while (not is_ready(future))
92 {
94 {
95 ARMARX_INFO << "Skill was aborted by user " << stopped << ", " << timeoutReached;
96 helper.getNavigator()->stop();
97 break;
98 }
99 }
100
101 auto se = future.get();
102 if (se)
103 {
104 ARMARX_INFO << "Goal reached.";
105 }
106 else
107 {
108 if (se.isSafetyStopTriggeredEvent())
109 {
110 ARMARX_ERROR << "Safety stop was triggered!";
111
112 return ::armarx::skills::Skill::MainResult{
114 }
115 if (se.isUserAbortTriggeredEvent())
116 {
117 ARMARX_ERROR << "Aborted by user!";
118
119 return ::armarx::skills::Skill::MainResult{
121 }
122 if (se.isInternalErrorEvent())
123 {
124 ARMARX_ERROR << "Unknown internal error occured! "
125 << se.toInternalErrorEvent().message;
126
127 return ::armarx::skills::Skill::MainResult{
129 }
130 if (se.isGlobalPlanningFailedEvent())
131 {
132 ARMARX_ERROR << "Global planning failed! "
133 << se.toGlobalPlanningFailedEvent().message;
134
135 return ::armarx::skills::Skill::MainResult{
137 }
138
139 ARMARX_ERROR << "Unknown event!";
140 return ::armarx::skills::Skill::MainResult{
142 }
143
144
145 return ::armarx::skills::Skill::MainResult{
147 }
148
149 void
150 NavigateToAlternatives::onStopRequested()
151 {
152 if (helper.getNavigator().has_value())
153 {
154 ARMARX_CHECK(helper.getNavigator().has_value());
155 helper.getNavigator()->stop();
156 }
157 }
158
159 armarx::skills::SkillDescription
161 {
162 ParamType defaultParameters;
163 defaultParameters.targetAlternatives = {};
164 defaultParameters.navigatingSkillParams = NavigatingSkillHelper::DefaultSkillDescription();
165
167 .skillId = {.skillName = constants::skill_names::NavigateToAlternatives},
168 .description = "Navigate to a list of prioritized target alternatives.",
169 .rootProfileDefaults = defaultParameters.toAron(),
171 .parametersType = Params::ToAronType()};
172 }
173
174} // namespace armarx::navigation::skills
static Duration Hours(std::int64_t hours)
Constructs a duration in hours.
Definition Duration.cpp:120
::armarx::skills::SimpleSpecializedSkill< Params > Base
static armarx::skills::SkillDescription DefaultSkillDescription()
NavigateToAlternatives(const NavigatingSkillHelper::Properties &properties, const NavigatingSkillHelper::Services &srv)
std::optional< client::Navigator > & getNavigator()
void init(const arondto::NavigatingSkillParams &params, const std::string &id)
static arondto::NavigatingSkillParams DefaultSkillDescription()
std::atomic_bool timeoutReached
Definition Skill.h:387
bool shouldSkillTerminate() const override
Returns whether the skill should terminate as soon as possible.
Definition Skill.cpp:469
std::atomic_bool stopped
Definition Skill.h:386
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
Definition Logging.h:196
void fromAron(const arondto::GlobalTrajectoryPoint &dto, GlobalTrajectoryPoint &bo)
bool is_ready(std::future< R > const &f)
A result struct for skill initialization.
Definition Skill.h:50
A result struct for th main method of a skill.
Definition Skill.h:62