Paparazzi UAS  v6.2_unstable
Paparazzi is a free software Unmanned Aircraft System.
guidance_indi.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Ewoud Smeur <ewoud.smeur@gmail.com>
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21 
34 #include "generated/airframe.h"
36 #include "modules/ins/ins_int.h"
38 #include "state.h"
39 #include "modules/imu/imu.h"
44 #include "mcu_periph/sys_time.h"
45 #include "autopilot.h"
49 #include "modules/core/abi.h"
50 
51 // The acceleration reference is calculated with these gains. If you use GPS,
52 // they are probably limited by the update rate of your GPS. The default
53 // values are tuned for 4 Hz GPS updates. If you have high speed position updates, the
54 // gains can be higher, depending on the speed of the inner loop.
55 #ifdef GUIDANCE_INDI_POS_GAIN
57 #else
59 #endif
60 
61 #ifdef GUIDANCE_INDI_SPEED_GAIN
63 #else
65 #endif
66 
67 #ifndef GUIDANCE_INDI_ACCEL_SP_ID
68 #define GUIDANCE_INDI_ACCEL_SP_ID ABI_BROADCAST
69 #endif
71 static void accel_sp_cb(uint8_t sender_id, uint8_t flag, struct FloatVect3 *accel_sp);
72 struct FloatVect3 indi_accel_sp = {0.0, 0.0, 0.0};
73 bool indi_accel_sp_set_2d = false;
74 bool indi_accel_sp_set_3d = false;
75 
76 struct FloatVect3 speed_sp = {0.0, 0.0, 0.0};
77 struct FloatVect3 sp_accel = {0.0, 0.0, 0.0};
78 #ifdef GUIDANCE_INDI_SPECIFIC_FORCE_GAIN
79 float guidance_indi_specific_force_gain = GUIDANCE_INDI_SPECIFIC_FORCE_GAIN;
80 static void guidance_indi_filter_thrust(void);
81 
82 #ifndef GUIDANCE_INDI_THRUST_DYNAMICS
83 #ifndef STABILIZATION_INDI_ACT_DYN_P
84 #error "You need to define GUIDANCE_INDI_THRUST_DYNAMICS to be able to use indi vertical control"
85 #else // assume that the same actuators are used for thrust as for roll (e.g. quadrotor)
86 #define GUIDANCE_INDI_THRUST_DYNAMICS STABILIZATION_INDI_ACT_DYN_P
87 #endif
88 #endif //GUIDANCE_INDI_THRUST_DYNAMICS
89 
90 #endif //GUIDANCE_INDI_SPECIFIC_FORCE_GAIN
91 
92 #ifndef GUIDANCE_INDI_FILTER_CUTOFF
93 #ifdef STABILIZATION_INDI_FILT_CUTOFF
94 #define GUIDANCE_INDI_FILTER_CUTOFF STABILIZATION_INDI_FILT_CUTOFF
95 #else
96 #define GUIDANCE_INDI_FILTER_CUTOFF 3.0
97 #endif
98 #endif
99 
100 float thrust_act = 0;
105 
106 struct FloatMat33 Ga;
108 struct FloatVect3 control_increment; // [dtheta, dphi, dthrust]
109 
112 
115 
117 float thrust_in;
118 
119 static void guidance_indi_propagate_filters(struct FloatEulers *eulers);
120 static void guidance_indi_calcG(struct FloatMat33 *Gmat);
121 static void guidance_indi_calcG_yxz(struct FloatMat33 *Gmat, struct FloatEulers *euler_yxz);
122 
123 #if PERIODIC_TELEMETRY
125 static void send_indi_guidance(struct transport_tx *trans, struct link_device *dev)
126 {
127  pprz_msg_send_GUIDANCE_INDI_HYBRID(trans, dev, AC_ID,
128  &sp_accel.x,
129  &sp_accel.y,
130  &sp_accel.z,
134  &filt_accel_ned[0].o[0],
135  &filt_accel_ned[1].o[0],
136  &filt_accel_ned[2].o[0],
137  &speed_sp.x,
138  &speed_sp.y,
139  &speed_sp.z);
140 }
141 #endif
142 
147 {
148  AbiBindMsgACCEL_SP(GUIDANCE_INDI_ACCEL_SP_ID, &accel_sp_ev, accel_sp_cb);
149 
150 #if PERIODIC_TELEMETRY
151  register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_GUIDANCE_INDI_HYBRID, send_indi_guidance);
152 #endif
153 }
154 
160 {
161  thrust_in = stabilization_cmd[COMMAND_THRUST];
163 
164  float tau = 1.0 / (2.0 * M_PI * filter_cutoff);
165  float sample_time = 1.0 / PERIODIC_FREQUENCY;
166  for (int8_t i = 0; i < 3; i++) {
167  init_butterworth_2_low_pass(&filt_accel_ned[i], tau, sample_time, 0.0);
168  }
172 }
173 
179 void guidance_indi_run(float *heading_sp)
180 {
181  struct FloatEulers eulers_yxz;
182  struct FloatQuat * statequat = stateGetNedToBodyQuat_f();
183  float_eulers_of_quat_yxz(&eulers_yxz, statequat);
184 
185  //filter accel to get rid of noise and filter attitude to synchronize with accel
186  guidance_indi_propagate_filters(&eulers_yxz);
187 
188  //Linear controller to find the acceleration setpoint from position and velocity
189  float pos_x_err = POS_FLOAT_OF_BFP(guidance_h.ref.pos.x) - stateGetPositionNed_f()->x;
190  float pos_y_err = POS_FLOAT_OF_BFP(guidance_h.ref.pos.y) - stateGetPositionNed_f()->y;
191  float pos_z_err = POS_FLOAT_OF_BFP(guidance_v_z_ref - stateGetPositionNed_i()->z);
192 
193  // Use feed forward part from reference model
197 
198  // If the acceleration setpoint is set over ABI message
199  if (indi_accel_sp_set_2d) {
202  // In 2D the vertical motion is derived from the flight plan
205  // If the input command is not updated after a timeout, switch back to flight plan control
206  if (dt > 0.5) {
207  indi_accel_sp_set_2d = false;
208  }
209  } else if (indi_accel_sp_set_3d) {
214  // If the input command is not updated after a timeout, switch back to flight plan control
215  if (dt > 0.5) {
216  indi_accel_sp_set_3d = false;
217  }
218  } else {
222  }
223 
224 #if GUIDANCE_INDI_RC_DEBUG
225 #warning "GUIDANCE_INDI_RC_DEBUG lets you control the accelerations via RC, but disables autonomous flight!"
226  //for rc control horizontal, rotate from body axes to NED
227  float psi = stateGetNedToBodyEulers_f()->psi;
228  float rc_x = -(radio_control.values[RADIO_PITCH] / 9600.0) * 8.0;
229  float rc_y = (radio_control.values[RADIO_ROLL] / 9600.0) * 8.0;
230  sp_accel.x = cosf(psi) * rc_x - sinf(psi) * rc_y;
231  sp_accel.y = sinf(psi) * rc_x + cosf(psi) * rc_y;
232 
233  //for rc vertical control
234  sp_accel.z = -(radio_control.values[RADIO_THROTTLE] - 4500) * 8.0 / 9600.0;
235 #endif
236 
237  //Calculate matrix of partial derivatives
238  guidance_indi_calcG_yxz(&Ga, &eulers_yxz);
239 
240  //Invert this matrix
241  MAT33_INV(Ga_inv, Ga);
242 
243  struct FloatVect3 a_diff = { sp_accel.x - filt_accel_ned[0].o[0], sp_accel.y - filt_accel_ned[1].o[0], sp_accel.z - filt_accel_ned[2].o[0]};
244 
245  //Bound the acceleration error so that the linearization still holds
246  Bound(a_diff.x, -6.0, 6.0);
247  Bound(a_diff.y, -6.0, 6.0);
248  Bound(a_diff.z, -9.0, 9.0);
249 
250  //If the thrust to specific force ratio has been defined, include vertical control
251  //else ignore the vertical acceleration error
252 #ifndef GUIDANCE_INDI_SPECIFIC_FORCE_GAIN
253 #ifndef STABILIZATION_ATTITUDE_INDI_FULL
254  a_diff.z = 0.0;
255 #endif
256 #endif
257 
258  //Calculate roll,pitch and thrust command
260 
261  AbiSendMsgTHRUST(THRUST_INCREMENT_ID, control_increment.z);
262 
265  guidance_euler_cmd.psi = *heading_sp;
266 
267 #ifdef GUIDANCE_INDI_SPECIFIC_FORCE_GAIN
268  guidance_indi_filter_thrust();
269 
270  //Add the increment in specific force * specific_force_to_thrust_gain to the filtered thrust
272  Bound(thrust_in, 0, 9600);
273 
274 #if GUIDANCE_INDI_RC_DEBUG
275  if (radio_control.values[RADIO_THROTTLE] < 300) {
276  thrust_in = 0;
277  }
278 #endif
279 
280  //Overwrite the thrust command from guidance_v
281  stabilization_cmd[COMMAND_THRUST] = thrust_in;
282 #endif
283 
284  //Bound euler angles to prevent flipping
287 
288  //set the quat setpoint with the calculated roll and pitch
289  struct FloatQuat q_sp;
292 }
293 
294 #ifdef GUIDANCE_INDI_SPECIFIC_FORCE_GAIN
295 
298 void guidance_indi_filter_thrust(void)
299 {
300  // Actuator dynamics
301  thrust_act = thrust_act + GUIDANCE_INDI_THRUST_DYNAMICS * (thrust_in - thrust_act);
302 
303  // same filter as for the acceleration
305 }
306 #endif
307 
314 {
315  struct NedCoor_f *accel = stateGetAccelNed_f();
319 
322 }
323 
331 void guidance_indi_calcG_yxz(struct FloatMat33 *Gmat, struct FloatEulers *euler_yxz)
332 {
333 
334  float sphi = sinf(euler_yxz->phi);
335  float cphi = cosf(euler_yxz->phi);
336  float stheta = sinf(euler_yxz->theta);
337  float ctheta = cosf(euler_yxz->theta);
338  //minus gravity is a guesstimate of the thrust force, thrust measurement would be better
339  float T = -9.81;
340 
341  RMAT_ELMT(*Gmat, 0, 0) = ctheta * cphi * T;
342  RMAT_ELMT(*Gmat, 1, 0) = 0;
343  RMAT_ELMT(*Gmat, 2, 0) = -stheta * cphi * T;
344  RMAT_ELMT(*Gmat, 0, 1) = -stheta * sphi * T;
345  RMAT_ELMT(*Gmat, 1, 1) = -cphi * T;
346  RMAT_ELMT(*Gmat, 2, 1) = -ctheta * sphi * T;
347  RMAT_ELMT(*Gmat, 0, 2) = stheta * cphi;
348  RMAT_ELMT(*Gmat, 1, 2) = -sphi;
349  RMAT_ELMT(*Gmat, 2, 2) = ctheta * cphi;
350 }
351 
360 {
361 
362  struct FloatEulers *euler = stateGetNedToBodyEulers_f();
363 
364  float sphi = sinf(euler->phi);
365  float cphi = cosf(euler->phi);
366  float stheta = sinf(euler->theta);
367  float ctheta = cosf(euler->theta);
368  float spsi = sinf(euler->psi);
369  float cpsi = cosf(euler->psi);
370  //minus gravity is a guesstimate of the thrust force, thrust measurement would be better
371  float T = -9.81;
372 
373  RMAT_ELMT(*Gmat, 0, 0) = (cphi * spsi - sphi * cpsi * stheta) * T;
374  RMAT_ELMT(*Gmat, 1, 0) = (-sphi * spsi * stheta - cpsi * cphi) * T;
375  RMAT_ELMT(*Gmat, 2, 0) = -ctheta * sphi * T;
376  RMAT_ELMT(*Gmat, 0, 1) = (cphi * cpsi * ctheta) * T;
377  RMAT_ELMT(*Gmat, 1, 1) = (cphi * spsi * ctheta) * T;
378  RMAT_ELMT(*Gmat, 2, 1) = -stheta * cphi * T;
379  RMAT_ELMT(*Gmat, 0, 2) = sphi * spsi + cphi * cpsi * stheta;
380  RMAT_ELMT(*Gmat, 1, 2) = cphi * spsi * stheta - cpsi * sphi;
381  RMAT_ELMT(*Gmat, 2, 2) = cphi * ctheta;
382 }
383 
388 static void accel_sp_cb(uint8_t sender_id __attribute__((unused)), uint8_t flag, struct FloatVect3 *accel_sp)
389 {
390  if (flag == 0) {
391  indi_accel_sp.x = accel_sp->x;
392  indi_accel_sp.y = accel_sp->y;
393  indi_accel_sp_set_2d = true;
395  } else if (flag == 1) {
396  indi_accel_sp.x = accel_sp->x;
397  indi_accel_sp.y = accel_sp->y;
398  indi_accel_sp.z = accel_sp->z;
399  indi_accel_sp_set_3d = true;
401  }
402 }
403 
guidance_indi_calcG
static void guidance_indi_calcG(struct FloatMat33 *Gmat)
Definition: guidance_indi.c:359
radio_control.h
thrust_act
float thrust_act
Definition: guidance_indi.c:100
update_butterworth_2_low_pass
static float update_butterworth_2_low_pass(Butterworth2LowPass *filter, float value)
Update second order Butterworth low pass filter state with a new value.
Definition: low_pass_filter.h:291
int8_t
signed char int8_t
Typedef defining 8 bit char type.
Definition: vl53l1_types.h:103
uint8_t
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98
NedCoor_f
vector in North East Down coordinates Units: meters
Definition: pprz_geodetic_float.h:63
HorizontalGuidance::ref
struct HorizontalGuidanceReference ref
reference calculated from setpoints
Definition: guidance_h.h:104
stateGetPositionNed_f
static struct NedCoor_f * stateGetPositionNed_f(void)
Get position in local NED coordinates (float).
Definition: state.h:710
stabilization_attitude.h
guidance_euler_cmd
struct FloatEulers guidance_euler_cmd
Definition: guidance_indi.c:116
THRUST_INCREMENT_ID
#define THRUST_INCREMENT_ID
Definition: abi_sender_ids.h:443
GUIDANCE_H_MAX_BANK
#define GUIDANCE_H_MAX_BANK
Definition: guidance_h.c:70
NedCoor_f::z
float z
in meters
Definition: pprz_geodetic_float.h:66
abi.h
guidance_v_zdd_ref
int32_t guidance_v_zdd_ref
vertical acceleration reference in meter/s^2.
Definition: guidance_v.c:134
stateGetAccelNed_f
static struct NedCoor_f * stateGetAccelNed_f(void)
Get acceleration in NED coordinates (float).
Definition: state.h:1038
get_sys_time_float
static float get_sys_time_float(void)
Get the time in seconds since startup.
Definition: sys_time.h:138
guidance_indi_speed_gain
float guidance_indi_speed_gain
Definition: guidance_indi.c:64
guidance_indi_max_bank
float guidance_indi_max_bank
Definition: guidance_indi.c:111
Int32Vect2::y
int32_t y
Definition: pprz_algebra_int.h:85
thrust_filt
Butterworth2LowPass thrust_filt
Definition: guidance_indi.c:104
indi_accel_sp
struct FloatVect3 indi_accel_sp
Definition: guidance_indi.c:72
abi_struct
Event structure to store callbacks in a linked list.
Definition: abi_common.h:66
pitch_filt
Butterworth2LowPass pitch_filt
Definition: guidance_indi.c:103
stateGetNedToBodyEulers_f
static struct FloatEulers * stateGetNedToBodyEulers_f(void)
Get vehicle body attitude euler angles (float).
Definition: state.h:1143
filter_cutoff
float filter_cutoff
Definition: guidance_indi.c:110
HorizontalGuidanceReference::accel
struct Int32Vect2 accel
with INT32_ACCEL_FRAC
Definition: guidance_h.h:84
time_of_accel_sp_3d
float time_of_accel_sp_3d
Definition: guidance_indi.c:114
UNUSED
uint8_t last_wp UNUSED
Definition: navigation.c:101
ins_int.h
SecondOrderLowPass
Second order low pass filter structure.
Definition: low_pass_filter.h:136
POS_FLOAT_OF_BFP
#define POS_FLOAT_OF_BFP(_ai)
Definition: pprz_algebra_int.h:218
SPEED_FLOAT_OF_BFP
#define SPEED_FLOAT_OF_BFP(_ai)
Definition: pprz_algebra_int.h:220
stateGetPositionNed_i
static struct NedCoor_i * stateGetPositionNed_i(void)
Get position in local NED coordinates (int).
Definition: state.h:665
stabilization_attitude_ref_quat_int.h
guidance_v.h
HorizontalGuidanceReference::speed
struct Int32Vect2 speed
with INT32_SPEED_FRAC
Definition: guidance_h.h:83
Ga
struct FloatMat33 Ga
Definition: guidance_indi.c:106
guidance_indi_propagate_filters
static void guidance_indi_propagate_filters(struct FloatEulers *eulers)
Low pass the accelerometer measurements to remove noise from vibrations.
Definition: guidance_indi.c:313
roll_filt
Butterworth2LowPass roll_filt
Definition: guidance_indi.c:102
FloatEulers::theta
float theta
in radians
Definition: pprz_algebra_float.h:86
SecondOrderLowPass::o
float o[2]
output history
Definition: low_pass_filter.h:140
guidance_v_zd_ref
int32_t guidance_v_zd_ref
vertical speed reference in meter/s.
Definition: guidance_v.c:133
FloatVect3
Definition: pprz_algebra_float.h:54
telemetry.h
imu.h
FloatQuat
Roation quaternion.
Definition: pprz_algebra_float.h:63
Int32Vect2::x
int32_t x
Definition: pprz_algebra_int.h:84
stateGetSpeedNed_f
static struct NedCoor_f * stateGetSpeedNed_f(void)
Get ground speed in local NED coordinates (float).
Definition: state.h:908
autopilot_rc_helpers.h
ACCEL_FLOAT_OF_BFP
#define ACCEL_FLOAT_OF_BFP(_ai)
Definition: pprz_algebra_int.h:222
indi_accel_sp_set_3d
bool indi_accel_sp_set_3d
Definition: guidance_indi.c:74
send_indi_guidance
static void send_indi_guidance(struct transport_tx *trans, struct link_device *dev)
Definition: guidance_indi.c:125
FloatEulers::phi
float phi
in radians
Definition: pprz_algebra_float.h:85
stateGetNedToBodyQuat_f
static struct FloatQuat * stateGetNedToBodyQuat_f(void)
Get vehicle body attitude quaternion (float).
Definition: state.h:1131
dev
static const struct usb_device_descriptor dev
Definition: usb_ser_hw.c:74
guidance_indi_enter
void guidance_indi_enter(void)
Call upon entering indi guidance.
Definition: guidance_indi.c:159
indi_accel_sp_set_2d
bool indi_accel_sp_set_2d
Definition: guidance_indi.c:73
sys_time.h
Architecture independent timing functions.
RMAT_ELMT
#define RMAT_ELMT(_rm, _row, _col)
Definition: pprz_algebra.h:660
register_periodic_telemetry
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Definition: telemetry.c:51
filt_accel_ned
Butterworth2LowPass filt_accel_ned[3]
Definition: guidance_indi.c:101
QUAT_BFP_OF_REAL
#define QUAT_BFP_OF_REAL(_qi, _qf)
Definition: pprz_algebra.h:752
control_increment
struct FloatVect3 control_increment
Definition: guidance_indi.c:108
GUIDANCE_INDI_ACCEL_SP_ID
#define GUIDANCE_INDI_ACCEL_SP_ID
Definition: guidance_indi.c:68
FloatMat33
Definition: pprz_algebra_float.h:70
autopilot.h
sp_accel
struct FloatVect3 sp_accel
Definition: guidance_indi.c:77
FloatVect3::y
float y
Definition: pprz_algebra_float.h:56
NedCoor_f::y
float y
in meters
Definition: pprz_geodetic_float.h:65
GUIDANCE_INDI_SPEED_GAIN
#define GUIDANCE_INDI_SPEED_GAIN
Definition: guidance_indi_hybrid.c:55
MAT33_INV
#define MAT33_INV(_minv, _m)
Definition: pprz_algebra.h:489
guidance_indi_init
void guidance_indi_init(void)
Init function.
Definition: guidance_indi.c:146
MAT33_VECT3_MUL
#define MAT33_VECT3_MUL(_vout, _mat, _vin)
Definition: pprz_algebra.h:463
thrust_in
float thrust_in
Definition: guidance_indi.c:117
FloatVect3::x
float x
Definition: pprz_algebra_float.h:55
guidance_indi_specific_force_gain
float guidance_indi_specific_force_gain
guidance_indi_calcG_yxz
static void guidance_indi_calcG_yxz(struct FloatMat33 *Gmat, struct FloatEulers *euler_yxz)
Definition: guidance_indi.c:331
Ga_inv
struct FloatMat33 Ga_inv
Definition: guidance_indi.c:107
accel_sp_cb
static void accel_sp_cb(uint8_t sender_id, uint8_t flag, struct FloatVect3 *accel_sp)
ABI callback that obtains the acceleration setpoint from telemetry flag: 0 -> 2D, 1 -> 3D.
Definition: guidance_indi.c:388
GUIDANCE_INDI_FILTER_CUTOFF
#define GUIDANCE_INDI_FILTER_CUTOFF
Definition: guidance_indi.c:96
mesonh.mesonh_atmosphere.T
int T
Definition: mesonh_atmosphere.py:46
stabilization_cmd
int32_t stabilization_cmd[COMMANDS_NB]
Stabilization commands.
Definition: stabilization.c:32
HorizontalGuidanceReference::pos
struct Int32Vect2 pos
with INT32_POS_FRAC
Definition: guidance_h.h:82
guidance_h
struct HorizontalGuidance guidance_h
Definition: guidance_h.c:90
guidance_indi.h
FloatVect3::z
float z
Definition: pprz_algebra_float.h:57
init_butterworth_2_low_pass
static void init_butterworth_2_low_pass(Butterworth2LowPass *filter, float tau, float sample_time, float value)
Init a second order Butterworth filter.
Definition: low_pass_filter.h:280
NedCoor_f::x
float x
in meters
Definition: pprz_geodetic_float.h:64
FloatEulers
euler angles
Definition: pprz_algebra_float.h:84
stab_att_sp_quat
struct Int32Quat stab_att_sp_quat
with INT32_QUAT_FRAC
Definition: stabilization_attitude_heli_indi.c:127
stabilization.h
state.h
time_of_accel_sp_2d
float time_of_accel_sp_2d
Definition: guidance_indi.c:113
FloatEulers::psi
float psi
in radians
Definition: pprz_algebra_float.h:87
float_eulers_of_quat_yxz
void float_eulers_of_quat_yxz(struct FloatEulers *e, struct FloatQuat *q)
euler rotation 'YXZ' This function calculates from a quaternion the Euler angles with the order YXZ,...
Definition: pprz_algebra_float.c:722
float_quat_of_eulers_yxz
void float_quat_of_eulers_yxz(struct FloatQuat *q, struct FloatEulers *e)
quat from euler rotation 'YXZ' This function calculates a quaternion from Euler angles with the order...
Definition: pprz_algebra_float.c:532
guidance_h.h
DefaultPeriodic
#define DefaultPeriodic
Set default periodic telemetry.
Definition: telemetry.h:66
speed_sp
struct FloatVect3 speed_sp
Definition: guidance_indi.c:76
guidance_indi_run
void guidance_indi_run(float *heading_sp)
Definition: guidance_indi.c:179
radio_control
struct RadioControl radio_control
Definition: radio_control.c:33
accel_sp_ev
abi_event accel_sp_ev
Definition: guidance_indi.c:70
guidance_indi_pos_gain
float guidance_indi_pos_gain
Definition: guidance_indi.c:58
GUIDANCE_INDI_POS_GAIN
#define GUIDANCE_INDI_POS_GAIN
Definition: guidance_indi_hybrid.c:60
RadioControl::values
pprz_t values[RADIO_CONTROL_NB_CHANNEL]
Definition: radio_control.h:67
low_pass_filter.h
Simple first order low pass filter with bilinear transform.
guidance_v_z_ref
int32_t guidance_v_z_ref
altitude reference in meters.
Definition: guidance_v.c:132