Auterion App SDK
Auterion SDK is a library that can be used by AuterionOS apps to communicate with the system.
Loading...
Searching...
No Matches
mode.hpp
1/****************************************************************************
2 *
3 * Copyright 2023 Auterion AG. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 ****************************************************************************/
32
33#pragma once
34
35#include <Eigen/Eigen>
36#include <auterion_sdk/auterion.hpp>
37#include <auterion_sdk/control/control.hpp>
38#include <functional>
39#include <memory>
40#include <variant>
41
42namespace px4_ros2 {
43class HealthAndArmingCheckReporter;
44}
45
46namespace auterion {
55 public:
59 struct PX4Mode {
60 using ID = uint8_t;
61 static const ID kModeIDInvalid;
62
63 static const ID kModeIDPosctl;
64 static const ID kModeIDTakeoff;
65 static const ID kModeIDDescend;
66 static const ID kModeIDLand;
67 static const ID kModeIDRtl;
68 static const ID kModeIDPrecisionLand;
69 };
70
74
75 bool needs_angular_velocity{false};
76 bool needs_attitude{false};
77 bool needs_local_altitude{false};
78 bool needs_local_position{false};
79 bool needs_local_position_relaxed{false};
80 bool needs_global_position{false};
81 bool needs_valid_mission{false};
82 bool needs_valid_home{false};
83 bool needs_manual_control_input{false};
84 bool can_prevent_arming{false};
85 bool user_selectable{true};
86
87 ModeConfiguration merge(const ModeConfiguration& other) const {
88 ModeConfiguration config = *this;
89 config.needs_angular_velocity =
90 config.needs_angular_velocity || other.needs_angular_velocity;
91 config.needs_attitude = config.needs_attitude || other.needs_attitude;
92 config.needs_local_altitude = config.needs_local_altitude || other.needs_local_altitude;
93 config.needs_local_position = config.needs_local_position || other.needs_local_position;
94 config.needs_local_position_relaxed =
95 config.needs_local_position_relaxed || other.needs_local_position_relaxed;
96 config.needs_global_position = config.needs_global_position || other.needs_global_position;
97 config.needs_valid_mission = config.needs_valid_mission || other.needs_valid_mission;
98 config.needs_valid_home = config.needs_valid_home || other.needs_valid_home;
99 config.needs_manual_control_input =
100 config.needs_manual_control_input || other.needs_manual_control_input;
101 config.can_prevent_arming = config.can_prevent_arming || other.can_prevent_arming;
102 config.user_selectable = config.user_selectable || other.user_selectable;
103 return config;
104 }
105
112 ModeConfiguration& replacesPX4Mode(PX4Mode::ID px4_mode_id) {
113 replace_px4_mode = px4_mode_id;
114 return *this;
115 }
116
117 ModeConfiguration& needsAngularVelocity(bool needs = true) {
118 needs_angular_velocity = needs;
119 return *this;
120 }
121
122 ModeConfiguration& needsAttitude(bool needs = true) {
123 needs_attitude = needs;
124 return *this;
125 }
126
127 ModeConfiguration& needsLocalAltitude(bool needs = true) {
128 needs_local_altitude = needs;
129 return *this;
130 }
131
132 ModeConfiguration& needsLocalPosition(bool needs = true) {
133 needs_local_position = needs;
134 return *this;
135 }
136
137 ModeConfiguration& needsLocalPositionRelaxed(bool needs = true) {
138 needs_local_position_relaxed = needs;
139 return *this;
140 }
141
142 ModeConfiguration& needsGlobalPosition(bool needs = true) {
143 needs_global_position = needs;
144 return *this;
145 }
146
147 ModeConfiguration& needsValidMission(bool needs = true) {
148 needs_valid_mission = needs;
149 return *this;
150 }
151
152 ModeConfiguration& needsValidHome(bool needs = true) {
153 needs_valid_home = needs;
154 return *this;
155 }
156
157 ModeConfiguration& needsManualControlInput(bool needs = true) {
158 needs_manual_control_input = needs;
159 return *this;
160 }
161
162 ModeConfiguration& canPreventArming(bool can = true) {
163 can_prevent_arming = can;
164 return *this;
165 }
166
167 ModeConfiguration& userSelectable(bool selectable = true) {
168 user_selectable = selectable;
169 return *this;
170 }
171};
172
180enum class ModeFailureReason {
181 None = 0,
182 NoTrackingService,
183 InvalidTarget,
184 Other,
185};
186
191 public:
198 void fail(ModeFailureReason reason);
199
200 private:
201 friend class ModeImpl;
202 explicit FailureReporter(px4_ros2::HealthAndArmingCheckReporter& reporter)
203 : _reporter(reporter) {}
204
205 px4_ros2::HealthAndArmingCheckReporter& _reporter;
206};
207
211enum class Result {
212 Success = 0,
213 Rejected,
214 Interrupted,
215 Timeout,
216 Deactivated,
217 ModeFailureOther = 100,
218};
219
220class ModeImpl;
221
227 float roll_input_normalized;
228 float pitch_input_normalized;
229 float yaw_input_normalized;
230 float throttle_input_normalized;
231
232 float aux1_input_normalized;
233 float aux2_input_normalized;
234 float aux3_input_normalized;
235 float aux4_input_normalized;
236 float aux5_input_normalized;
237 float aux6_input_normalized;
238
239 bool valid;
240};
241
279class Mode {
280 private:
281 std::shared_ptr<ModeImpl> _impl;
282
283 public:
293 Mode(SDK& sdk, const std::string& mode_name, const std::vector<ModalityConfig>& controls,
295
296 ~Mode() = default;
297
303 void onActivate(const std::function<void()>& callback);
304
310 void onDeactivate(const std::function<void()>& callback);
311
323 void onUpdateSetpoint(const std::function<Setpoint(float)>& callback);
324
336 void canRun(const std::function<void(FailureReporter&)>& callback);
337
338 [[nodiscard]] auterion::ManualControlInput lastManualControlInput() const;
339
346 [[nodiscard]] ModeConfiguration::PX4Mode::ID id() const;
347
353 void completed(Result result);
354};
355
357} // namespace auterion
Reports reasons why a mode cannot arm or run, passed to the Mode::canRun() callback.
Definition mode.hpp:190
void fail(ModeFailureReason reason)
Reports a reason why the mode cannot arm or run.
Configuration flags for specifying mode requirements and capabilities.
Definition mode.hpp:54
PX4Mode::ID replace_px4_mode
Definition mode.hpp:71
ModeConfiguration & replacesPX4Mode(PX4Mode::ID px4_mode_id)
Configures a Mode to replace an existing PX4 mode.
Definition mode.hpp:112
Defines a mode to control the vehicle using a (set) of setpoint types.
Definition mode.hpp:279
ModeConfiguration::PX4Mode::ID id() const
Returns the nav_state ID assigned to this mode after registration with PX4.
void canRun(const std::function< void(FailureReporter &)> &callback)
Sets a callback that checks whether the mode is allowed to arm and run, reporting the reasons to the ...
void onDeactivate(const std::function< void()> &callback)
Sets a callback function to be called when the mode is deactivated.
void completed(Result result)
Signal that the mode has finished and hand control back to PX4.
Mode(SDK &sdk, const std::string &mode_name, const std::vector< ModalityConfig > &controls, ModeConfiguration config=ModeConfiguration{})
Constructor to initialize a mode.
void onActivate(const std::function< void()> &callback)
Sets a callback function to be called when the mode is activated.
void onUpdateSetpoint(const std::function< Setpoint(float)> &callback)
Sets a callback function to be called at periodically at the update frequency of the mode.
SDK execution class. All callbacks are called on the same thread.
Definition auterion.hpp:119
std::variant< RateSetpoint, AttitudeSetpoint, multicopter::LocalFrameDynamicsSetpoint, multicopter::BodyFrameDynamicsSetpoint, multicopter::LocalFrameGotoSetpoint, multicopter::GlobalFrameGotoSetpoint, fixedwing::DynamicsSetpoint, fixedwing::GuidanceSetpoint, vtol::TransitionSetpoint > Setpoint
Type alias for representing various types of setpoints.
Definition control.hpp:71
Represents manual input from a controller including normalized control signals and validity flag.
Definition mode.hpp:226
Struct storing PX4 mode IDs.
Definition mode.hpp:59
static const ID kModeIDRtl
PX4 RTL mode.
Definition mode.hpp:67
static const ID kModeIDPrecisionLand
PX4 Precision Land mode.
Definition mode.hpp:68
static const ID kModeIDLand
PX4 Land mode.
Definition mode.hpp:66
static const ID kModeIDInvalid
Invalid mode, will not replace any PX4 mode.
Definition mode.hpp:61
static const ID kModeIDDescend
PX4 Descend mode.
Definition mode.hpp:65
static const ID kModeIDTakeoff
PX4 Takeoff mode.
Definition mode.hpp:64
static const ID kModeIDPosctl
PX4 Position mode.
Definition mode.hpp:63