Auterion App SDK
Auterion SDK is a library that can be used by AuterionOS apps to communicate with the system.
system_state.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 <memory>
37 #include <optional>
38 
39 namespace auterion {
44 enum class SubscriptionType {
45  LOCAL_POSITION,
46  GLOBAL_POSITION,
47  ATTITUDE,
48  ANGULAR_RATES,
49  ODOMETRY,
50  ARMED,
51  SYSTEM_ID,
52  HOME_POSITION,
53  BATTERY,
54  VTOL_STATE,
55  MANUAL_INPUT,
56  LAND_DETECTED,
57  WIND,
58  AIRSPEED
59 };
60 
67 struct LocalPosition {
68  Eigen::Vector3f position_enu_m;
69  Eigen::Vector3f velocity_enu_m;
70  Eigen::Vector3f acceleration_enu_m;
72  double heading;
73  float dist_bottom;
80 };
81 
89  double latitude_deg;
90  double longitude_deg;
91  double altitude_amsl_m;
98  inline Eigen::Vector3d toEigenVector() const {
99  return Eigen::Vector3d{latitude_deg, longitude_deg, altitude_amsl_m};
100  }
101 };
102 
109 struct Odometry {
110  Eigen::Quaternionf attitude;
111  Eigen::Vector3f angular_velocity;
112  Eigen::Vector3f position;
113  Eigen::Vector3f velocity;
114 };
115 
122 struct AngularRates {
123  Eigen::Vector3f angular_velocity_flu_rad_s;
126 };
127 
134 struct HomePosition {
135  Eigen::Vector3f local_position_enu_m;
137  double yaw;
144 };
145 
153  float voltage_v;
154  float current_a;
157  float remaining;
160  Eigen::VectorXf cell_voltage_v;
161 };
162 
169 enum VtolState {
170  UNDEFINED,
171  TRANSITION_TO_FIXED_WING,
172  TRANSITION_TO_MULTICOPTER,
173  MULTICOPTER,
174  FIXED_WING
175 };
176 
183 struct ManualInput {
184  float roll;
185  float pitch;
186  float yaw;
187  float throttle;
189  Eigen::Matrix<float, 6, 1> aux;
192 };
193 
200 struct LandDetected {
201  bool landed;
202  bool in_descend;
203 };
204 
211 struct Wind {
214  std::optional<float> variance_north;
216  std::optional<float> variance_east;
218 };
219 
226 struct Airspeed {
227  std::optional<float>
229  std::optional<float> calibrated_airspeed_m_s;
231  std::optional<float> true_airspeed_m_s;
232 };
233 
235 class SDK;
236 
237 template <SubscriptionType S, typename DataType>
238 class SubscriptionImpl;
239 
240 class SystemStateImpl;
242 
252 template <SubscriptionType S, typename DataType>
254  public:
255  Subscription(const std::shared_ptr<SubscriptionImpl<S, DataType>>& impl);
256 
265  void onUpdate(std::function<void(DataType)> callback);
266 
275  void subscribe(std::function<void(DataType)> callback);
276 
282  DataType last() const;
283 
289  bool isLastValid() const;
290 
291  private:
292  std::shared_ptr<SubscriptionImpl<S, DataType>> _impl;
293 };
294 
325 class SystemState {
326  public:
327  SystemState(SDK& sdk);
328  ~SystemState() = default;
329 
344 
345  SystemState& subscribeLocalPosition(std::function<void(LocalPosition)> callback = nullptr) {
346  localPosition().subscribe(callback);
347  return *this;
348  }
349 
350  SystemState& subscribeGlobalPosition(std::function<void(GlobalPosition)> callback = nullptr) {
351  globalPosition().subscribe(callback);
352  return *this;
353  }
354 
355  SystemState& subscribeAttitude(std::function<void(Eigen::Quaternionf)> callback = nullptr) {
356  attitude().subscribe(callback);
357  return *this;
358  }
359 
360  SystemState& subscribeOdometry(std::function<void(Odometry)> callback = nullptr) {
361  odometry().subscribe(callback);
362  return *this;
363  }
364 
365  SystemState& subscribeAngularRates(std::function<void(AngularRates)> callback = nullptr) {
366  angularRates().subscribe(callback);
367  return *this;
368  }
369 
370  SystemState& subscribeArmed(std::function<void(bool)> callback = nullptr) {
371  armed().subscribe(callback);
372  return *this;
373  }
374 
375  SystemState& subscribeSystemId(std::function<void(uint8_t)> callback = nullptr) {
376  systemId().subscribe(callback);
377  return *this;
378  }
379 
380  SystemState& subscribeHomePosition(std::function<void(HomePosition)> callback = nullptr) {
381  homePosition().subscribe(callback);
382  return *this;
383  }
384 
385  SystemState& subscribeBattery(std::function<void(BatteryStatus)> callback = nullptr) {
386  battery().subscribe(callback);
387  return *this;
388  }
389 
390  SystemState& subscribeVtolState(std::function<void(VtolState)> callback = nullptr) {
391  vtolState().subscribe(callback);
392  return *this;
393  }
394 
395  SystemState& subscribeManualInput(std::function<void(ManualInput)> callback = nullptr) {
396  manualInput().subscribe(callback);
397  return *this;
398  }
399 
400  SystemState& subscribeLandDetected(std::function<void(LandDetected)> callback = nullptr) {
401  landDetected().subscribe(callback);
402  return *this;
403  }
404 
405  SystemState& subscribeWind(std::function<void(Wind)> callback = nullptr) {
406  wind().subscribe(callback);
407  return *this;
408  }
409 
410  SystemState& subscribeAirspeed(std::function<void(Airspeed)> callback = nullptr) {
411  airspeed().subscribe(callback);
412  return *this;
413  }
414 
415  private:
416  std::shared_ptr<SystemStateImpl> _impl;
417 };
418 
420 } // namespace auterion
SDK execution class. All callbacks are called on the same thread.
Definition: auterion.hpp:97
A template class for managing subscriptions to data coming from the vehicle.
Definition: system_state.hpp:253
void subscribe(std::function< void(DataType)> callback)
Activates the subscription process and registers a callback function if provided.
bool isLastValid() const
Checks if the last received data is valid.
DataType last() const
Retrieves the last received data.
void onUpdate(std::function< void(DataType)> callback)
Regsiters a callback function to be called when the data is updated.
Provides access to the system's state, including flight controller telemetry.
Definition: system_state.hpp:325
VtolState
Represents the VTOL state.
Definition: system_state.hpp:169
Represents validated airspeed.
Definition: system_state.hpp:226
std::optional< float > true_airspeed_m_s
Definition: system_state.hpp:231
std::optional< float > calibrated_airspeed_m_s
Definition: system_state.hpp:229
std::optional< float > indicated_airspeed_m_s
Definition: system_state.hpp:228
Represents angular rates and accelerations in the FLU body frame.
Definition: system_state.hpp:122
Eigen::Vector3f angular_acceleration_flu_rad_s
Definition: system_state.hpp:124
Eigen::Vector3f angular_velocity_flu_rad_s
Definition: system_state.hpp:123
Represents the status of the battery.
Definition: system_state.hpp:152
float discharged_mah
Definition: system_state.hpp:156
float remaining
Definition: system_state.hpp:157
float voltage_v
Definition: system_state.hpp:153
int cell_count
Definition: system_state.hpp:159
Eigen::VectorXf cell_voltage_v
Definition: system_state.hpp:160
float current_a
Definition: system_state.hpp:154
Represents global position using latitude, longitude, and altitude.
Definition: system_state.hpp:88
double longitude_deg
Definition: system_state.hpp:90
Eigen::Vector3d toEigenVector() const
Converts the global position to an Eigen vector.
Definition: system_state.hpp:98
double altitude_amsl_m
Definition: system_state.hpp:91
double latitude_deg
Definition: system_state.hpp:89
Represents the home position in both local ENU and global coordinates.
Definition: system_state.hpp:134
bool was_set_manually
Definition: system_state.hpp:143
double yaw
Definition: system_state.hpp:137
bool global_position_valid
Definition: system_state.hpp:140
bool local_position_valid
Definition: system_state.hpp:141
bool altitude_valid
Definition: system_state.hpp:139
Eigen::Vector3f local_position_enu_m
Definition: system_state.hpp:135
GlobalPosition global_position
Definition: system_state.hpp:136
Represents landed state of the vehicle.
Definition: system_state.hpp:200
bool in_descend
Definition: system_state.hpp:202
Represents local position, velocity, and acceleration in the ENU coordinate system.
Definition: system_state.hpp:67
bool horizontal_position_valid
Definition: system_state.hpp:75
bool horizontal_velocity_valid
Definition: system_state.hpp:77
bool vertical_velocity_valid
Definition: system_state.hpp:78
double heading
Definition: system_state.hpp:72
Eigen::Vector3f velocity_enu_m
Definition: system_state.hpp:69
Eigen::Vector3f acceleration_enu_m
Definition: system_state.hpp:70
Eigen::Vector3f position_enu_m
Definition: system_state.hpp:68
bool dist_bottom_valid
Definition: system_state.hpp:79
bool vertical_position_valid
Definition: system_state.hpp:76
Represents manual input from a user.
Definition: system_state.hpp:183
float pitch
Definition: system_state.hpp:185
float roll
Definition: system_state.hpp:184
Eigen::Matrix< float, 6, 1 > aux
Definition: system_state.hpp:189
float throttle
Definition: system_state.hpp:187
bool sticks_moving
Definition: system_state.hpp:191
float yaw
Definition: system_state.hpp:186
Represents odometry data including attitude and angular rates.
Definition: system_state.hpp:109
Eigen::Vector3f velocity
Definition: system_state.hpp:113
Eigen::Vector3f position
Definition: system_state.hpp:112
Eigen::Vector3f angular_velocity
Definition: system_state.hpp:111
Eigen::Quaternionf attitude
Definition: system_state.hpp:110
Represents wind speed and direction.
Definition: system_state.hpp:211
float windspeed_north
Definition: system_state.hpp:212
std::optional< float > variance_east
Definition: system_state.hpp:216
float windspeed_east
Definition: system_state.hpp:213
std::optional< float > variance_north
Definition: system_state.hpp:214