Auterion App SDK
Auterion SDK is a library that can be used by AuterionOS apps to communicate with the system.
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 
42 namespace 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 
67  PX4Mode::ID replace_px4_mode{
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 
162 class 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 
221 class 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
ModeConfiguration & replacesPX4Mode(PX4Mode::ID px4_mode_id)
Configures a Mode to replace an existing PX4 mode.
Definition: mode.hpp:106
PX4Mode::ID replace_px4_mode
Definition: mode.hpp:67
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:45
std::variant< RateSetpoint, AttitudeSetpoint, multicopter::LocalFrameDynamicsSetpoint, multicopter::BodyFrameDynamicsSetpoint, multicopter::LocalFrameGotoSetpoint, multicopter::GlobalFrameGotoSetpoint > Setpoint
Type alias for representing various types of setpoints.
Definition: control.hpp:66
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