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 auterion {
51 public:
55 struct PX4Mode {
56 using ID = uint8_t;
57 static const ID kModeIDInvalid;
58
59 static const ID kModeIDPosctl;
60 static const ID kModeIDTakeoff;
61 static const ID kModeIDDescend;
62 static const ID kModeIDLand;
63 static const ID kModeIDRtl;
64 static const ID kModeIDPrecisionLand;
65 };
66
70
71 bool needs_angular_velocity{false};
72 bool needs_attitude{false};
73 bool needs_local_altitude{false};
74 bool needs_local_position{false};
75 bool needs_local_position_relaxed{false};
76 bool needs_global_position{false};
77 bool needs_valid_mission{false};
78 bool needs_valid_home{false};
79 bool needs_manual_control_input{false};
80 bool can_prevent_arming{false};
81
82 ModeConfiguration merge(const ModeConfiguration& other) const {
83 ModeConfiguration config = *this;
84 config.needs_angular_velocity =
85 config.needs_angular_velocity || other.needs_angular_velocity;
86 config.needs_attitude = config.needs_attitude || other.needs_attitude;
87 config.needs_local_altitude = config.needs_local_altitude || other.needs_local_altitude;
88 config.needs_local_position = config.needs_local_position || other.needs_local_position;
89 config.needs_local_position_relaxed =
90 config.needs_local_position_relaxed || other.needs_local_position_relaxed;
91 config.needs_global_position = config.needs_global_position || other.needs_global_position;
92 config.needs_valid_mission = config.needs_valid_mission || other.needs_valid_mission;
93 config.needs_valid_home = config.needs_valid_home || other.needs_valid_home;
94 config.needs_manual_control_input =
95 config.needs_manual_control_input || other.needs_manual_control_input;
96 config.can_prevent_arming = config.can_prevent_arming || other.can_prevent_arming;
97 return config;
98 }
99
106 ModeConfiguration& replacesPX4Mode(PX4Mode::ID px4_mode_id) {
107 replace_px4_mode = px4_mode_id;
108 return *this;
109 }
110
111 ModeConfiguration& needsAngularVelocity(bool needs = true) {
112 needs_angular_velocity = needs;
113 return *this;
114 }
115
116 ModeConfiguration& needsAttitude(bool needs = true) {
117 needs_attitude = needs;
118 return *this;
119 }
120
121 ModeConfiguration& needsLocalAltitude(bool needs = true) {
122 needs_local_altitude = needs;
123 return *this;
124 }
125
126 ModeConfiguration& needsLocalPosition(bool needs = true) {
127 needs_local_position = needs;
128 return *this;
129 }
130
131 ModeConfiguration& needsLocalPositionRelaxed(bool needs = true) {
132 needs_local_position_relaxed = needs;
133 return *this;
134 }
135
136 ModeConfiguration& needsGlobalPosition(bool needs = true) {
137 needs_global_position = needs;
138 return *this;
139 }
140
141 ModeConfiguration& needsValidMission(bool needs = true) {
142 needs_valid_mission = needs;
143 return *this;
144 }
145
146 ModeConfiguration& needsValidHome(bool needs = true) {
147 needs_valid_home = needs;
148 return *this;
149 }
150
151 ModeConfiguration& needsManualControlInput(bool needs = true) {
152 needs_manual_control_input = needs;
153 return *this;
154 }
155
156 ModeConfiguration& canPreventArming(bool can = true) {
157 can_prevent_arming = can;
158 return *this;
159 }
160};
161
162class ModeImpl;
163
169 float roll_input_normalized;
170 float pitch_input_normalized;
171 float yaw_input_normalized;
172 float throttle_input_normalized;
173
174 float aux1_input_normalized;
175 float aux2_input_normalized;
176 float aux3_input_normalized;
177 float aux4_input_normalized;
178 float aux5_input_normalized;
179 float aux6_input_normalized;
180
181 bool valid;
182};
183
221class Mode {
222 private:
223 std::shared_ptr<ModeImpl> _impl;
224
225 public:
235 Mode(SDK& sdk, const std::string& mode_name, const std::vector<ModalityConfig>& controls,
237
238 ~Mode() = default;
239
245 void onActivate(const std::function<void()>& callback);
246
252 void onDeactivate(const std::function<void()>& callback);
253
265 void onUpdateSetpoint(const std::function<Setpoint(float)>& callback);
266
267 [[nodiscard]] auterion::ManualControlInput lastManualControlInput() const;
268};
269
271} // namespace auterion
Configuration flags for specifying mode requirements and capabilities.
Definition mode.hpp:50
PX4Mode::ID replace_px4_mode
Definition mode.hpp:67
ModeConfiguration & replacesPX4Mode(PX4Mode::ID px4_mode_id)
Configures a Mode to replace an existing PX4 mode.
Definition mode.hpp:106
Defines a mode to control the vehicle using a (set) of setpoint types.
Definition mode.hpp:221
void onDeactivate(const std::function< void()> &callback)
Sets a callback function to be called when the mode is deactivated.
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:97
std::variant< RateSetpoint, AttitudeSetpoint, multicopter::LocalFrameDynamicsSetpoint, multicopter::BodyFrameDynamicsSetpoint, multicopter::LocalFrameGotoSetpoint, multicopter::GlobalFrameGotoSetpoint, fixedwing::DynamicsSetpoint, vtol::TransitionSetpoint > Setpoint
Type alias for representing various types of setpoints.
Definition control.hpp:70
Represents manual input from a controller including normalized control signals and validity flag.
Definition mode.hpp:168
Struct storing PX4 mode IDs.
Definition mode.hpp:55
static const ID kModeIDRtl
PX4 RTL mode.
Definition mode.hpp:63
static const ID kModeIDPrecisionLand
PX4 Precision Land mode.
Definition mode.hpp:64
static const ID kModeIDLand
PX4 Land mode.
Definition mode.hpp:62
static const ID kModeIDInvalid
Invalid mode, will not replace any PX4 mode.
Definition mode.hpp:57
static const ID kModeIDDescend
PX4 Descend mode.
Definition mode.hpp:61
static const ID kModeIDTakeoff
PX4 Takeoff mode.
Definition mode.hpp:60
static const ID kModeIDPosctl
PX4 Position mode.
Definition mode.hpp:59