Auterion App SDK
Auterion SDK is a library that can be used by AuterionOS apps to communicate with the system.
Loading...
Searching...
No Matches
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
39namespace auterion {
44enum 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
82
90 double latitude_deg;
99 inline Eigen::Vector3d toEigenVector() const {
100 return Eigen::Vector3d{latitude_deg, longitude_deg, altitude_amsl_m};
101 }
102};
103
110struct Odometry {
111 Eigen::Quaternionf attitude;
112 Eigen::Vector3f angular_velocity;
113 Eigen::Vector3f position;
114 Eigen::Vector3f velocity;
115};
116
128
146
154 float voltage_v;
155 float current_a;
158 float remaining;
161 Eigen::VectorXf cell_voltage_v;
162};
163
170 UNDEFINED,
171 TRANSITION_TO_FIXED_WING,
172 TRANSITION_TO_MULTICOPTER,
173 MULTICOPTER,
174 FIXED_WING
175};
176
184 float roll;
185 float pitch;
186 float yaw;
187 float throttle;
189 Eigen::Matrix<float, 6, 1> aux;
192};
193
201 bool landed;
203};
204
211struct Wind {
214 std::optional<float> variance_north;
216 std::optional<float> variance_east;
218};
219
226struct Airspeed {
227 std::optional<float>
229 std::optional<float> calibrated_airspeed_m_s;
231 std::optional<float> true_airspeed_m_s;
232};
233
235class SDK;
236
237template <SubscriptionType S, typename DataType>
238class SubscriptionImpl;
239
240class SystemStateImpl;
242
252template <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
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:119
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:123
Eigen::Vector3f angular_acceleration_flu_rad_s
Definition system_state.hpp:125
Eigen::Vector3f angular_velocity_flu_rad_s
Definition system_state.hpp:124
Represents the status of the battery.
Definition system_state.hpp:153
float discharged_mah
Definition system_state.hpp:157
float remaining
Definition system_state.hpp:158
float voltage_v
Definition system_state.hpp:154
int cell_count
Definition system_state.hpp:160
Eigen::VectorXf cell_voltage_v
Definition system_state.hpp:161
float current_a
Definition system_state.hpp:155
Represents global position using latitude, longitude, and altitude.
Definition system_state.hpp:89
double longitude_deg
Definition system_state.hpp:91
Eigen::Vector3d toEigenVector() const
Converts the global position to an Eigen vector.
Definition system_state.hpp:99
double altitude_amsl_m
Definition system_state.hpp:92
double latitude_deg
Definition system_state.hpp:90
Represents the home position in both local ENU and global coordinates.
Definition system_state.hpp:135
bool was_set_manually
Definition system_state.hpp:144
double yaw
Definition system_state.hpp:138
bool global_position_valid
Definition system_state.hpp:141
bool local_position_valid
Definition system_state.hpp:142
bool altitude_valid
Definition system_state.hpp:140
Eigen::Vector3f local_position_enu_m
Definition system_state.hpp:136
GlobalPosition global_position
Definition system_state.hpp:137
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:76
bool horizontal_velocity_valid
Definition system_state.hpp:78
bool vertical_velocity_valid
Definition system_state.hpp:79
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:80
bool vertical_position_valid
Definition system_state.hpp:77
double unaided_heading
Definition system_state.hpp:73
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:110
Eigen::Vector3f velocity
Definition system_state.hpp:114
Eigen::Vector3f position
Definition system_state.hpp:113
Eigen::Vector3f angular_velocity
Definition system_state.hpp:112
Eigen::Quaternionf attitude
Definition system_state.hpp:111
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