83#include "generated/airframe.h"
92#ifndef ONELOOP_ANDI_SIMPLE_QUAD
97#include "generated/modules.h"
98#ifdef MODULE_SYS_ID_DOUBLET_ID
106#ifdef ONELOOP_ANDI_CONSTANT_EFFECTIVENESS
128#ifndef ONELOOP_ANDI_DEBUG_MODE
129#define ONELOOP_ANDI_DEBUG_MODE FALSE
134static float g = 9.81;
140#ifdef ONELOOP_ANDI_FILT_CUTOFF
146#ifdef ONELOOP_ANDI_FILT_CUTOFF_ACC
152#ifdef ONELOOP_ANDI_FILT_CUTOFF_VEL
158#ifdef ONELOOP_ANDI_FILT_CUTOFF_P
159#define ONELOOP_ANDI_FILTER_ROLL_RATE TRUE
165#ifdef ONELOOP_ANDI_FILT_CUTOFF_Q
166#define ONELOOP_ANDI_FILTER_PITCH_RATE TRUE
172#ifdef ONELOOP_ANDI_FILT_CUTOFF_R
173#define ONELOOP_ANDI_FILTER_YAW_RATE TRUE
179PRINT_CONFIG_MSG(
"============================================================")
187PRINT_CONFIG_MSG("============================================================")
198#define USE_PID_NUMDIFF_DERIVATIVE
199#ifdef USE_PID_NUMDIFF_DERIVATIVE
208#ifndef ONELOOP_ANDI_NUM_THRUSTERS
214#ifdef ONELOOP_ANDI_ACT_IS_SERVO
220#ifdef ONELOOP_ANDI_ACT_DYN
224#error "You must specify the actuator dynamics"
229#ifdef ONELOOP_ANDI_ACT_MAX
235#ifdef ONELOOP_ANDI_ACT_MIN
241#ifdef ONELOOP_ANDI_ACT_MAX_NORM
247#ifdef ONELOOP_ANDI_ACT_MIN_NORM
253#ifdef ONELOOP_ANDI_NU_NORM_MAX
259#ifdef ONELOOP_ANDI_U_PREF
265#define ONELOOP_ANDI_MAX_BANK act_max[COMMAND_ROLL]
266#define ONELOOP_ANDI_MAX_PHI act_max[COMMAND_ROLL]
267#define ONELOOP_ANDI_MAX_THETA act_max[COMMAND_PITCH]
269#ifndef ONELOOP_THETA_PREF_MAX
275#if ANDI_NUM_ACT_TOT != WLS_N_U_MAX
276#error Matrix-WLS_N_U_MAX is not equal to the number of actuators: define WLS_N_U_MAX == ANDI_NUM_ACT_TOT in airframe file
277#define WLS_N_U_MAX == ANDI_NUM_ACT_TOT
279#if ANDI_OUTPUTS != WLS_N_V_MAX
280#error Matrix-WLS_N_V_MAX is not equal to the number of controlled axis: define WLS_N_V_MAX == ANDI_OUTPUTS in airframe file
281#define WLS_N_V_MAX == ANDI_OUTPUTS
300#ifdef ONELOOP_ANDI_YAW_DISTURBANCE_LIMIT
306#if ONELOOP_ANDI_HEADING_MANUAL
312#if ONELOOP_ANDI_YAW_STICK_IN_AUTO
319 #ifdef ONELOOP_ANDI_MAX_ANGULAR_JERK
327#ifdef ONELOOP_ANDI_MAX_ANGULAR_JERK_YAW
333 #ifdef ONELOOP_ANDI_MAX_ANGULAR_ACCEL
341#ifdef ONELOOP_ANDI_MAX_ANGULAR_ACCEL_YAW
347#ifdef ONELOOP_ANDI_MAX_ANGULAR_VEL
355#ifdef ONELOOP_ANDI_MAX_ANGULAR_VEL_YAW
366static float psi_vec[4] = {0.0, 0.0, 0.0, 0.0};
367static float phi_vec[4] = {0.0, 0.0, 0.0, 0.0};
371#ifndef ONELOOP_ANDI_AIRSPEED_SWITCH_THRESHOLD
372#define ONELOOP_ANDI_AIRSPEED_SWITCH_THRESHOLD 10.0
375#ifndef FWD_SIDESLIP_GAIN
381#ifdef NAV_HYBRID_MAX_DECELERATION
387#ifdef ONELOOP_ANDI_MAX_LINEAR_JERK
393#ifdef NAV_HYBRID_MAX_AIRSPEED
399#ifdef NAV_HYBRID_MAX_SPEED_V
405#define USE_ND_VELOCITIES
417#ifndef ONELOOP_ANDI_WU_QUAD_MOTORS_FWD
428#ifdef ONELOOP_ANDI_WV
433#ifdef ONELOOP_ANDI_WU
446#ifdef ONELOOP_ANDI_WV
452#ifdef ONELOOP_ANDI_WU
546void err_nd(
float err[],
float a[],
float b[],
float k[],
int n);
547void err_sum_nd(
float err[],
float a[],
float b[],
float k[],
float c[],
int n);
554void rm_3rd_attitude(
float dt,
float x_ref[3],
float x_d_ref[3],
float x_2d_ref[3],
float x_3d_ref[3],
float x_des[3],
bool ow_psi,
float psi_overwrite[4],
float k1_rm[3],
float k2_rm[3],
float k3_rm[3],
struct OneloopStabilizationRef bounds);
555void rm_3rd_pos(
float dt,
float x_ref[],
float x_d_ref[],
float x_2d_ref[],
float x_3d_ref[],
float x_des[],
float k1_rm[],
float k2_rm[],
float k3_rm[],
float x_d_bound,
float x_2d_bound,
float x_3d_bound,
int n);
558void ec_3rd_att(
float y_4d[3],
float x_des[3],
float x_ref[3],
float x_d_ref[3],
float x_2d_ref[3],
float x_3d_ref[3],
float x[3],
float x_d[3],
float x_2d[3],
float k1_e[3],
float k2_e[3],
float k3_e[3],
struct OneloopStabilizationRef bounds,
float fb[3]);
559void ec_3rd_pos(
float y_4d[],
float x_des[],
float x_ref[],
float x_d_ref[],
float x_2d_ref[],
float x_3d_ref[],
float x[],
float x_d[],
float x_2d[],
float k1_e[],
float k2_e[],
float k3_e[],
float x_d_bound,
float x_2d_bound,
float fb[],
int n);
562void chirp_pos(
float time_elapsed,
float f0,
float f1,
float t_chirp,
float A,
int8_t n,
float psi,
float p_ref[],
float v_ref[],
float a_ref[],
float j_ref[],
float p_ref_0[]);
563void chirp_call(
bool*
chirp_on,
bool*
chirp_first_call,
float*
t_0_chirp,
float*
time_elapsed,
float f0,
float f1,
float t_chirp,
float A,
int8_t n,
float psi,
float p_ref[],
float v_ref[],
float a_ref[],
float j_ref[],
float p_ref_0[]);
572#if PERIODIC_TELEMETRY
698void err_nd(
float err[],
float a[],
float b[],
float k[],
int n)
701 for (i = 0; i < n; i++) {
702 err[i] = k[i] * (a[i] -
b[i]);
706void err_sum_nd(
float err[],
float a[],
float b[],
float k[],
float c[],
int n)
709 for (i = 0; i < n; i++) {
710 err[i] = k[i] * (a[i] -
b[i]);
717 err[0] = (a[0] -
b[0]);
718 err[1] = (a[1] -
b[1]);
719 err[2] = (a[2] -
b[2]);
726 for (i = 0; i < n; i++) {
727 a[i] = a[i] + dt *
a_dot[i];
737 for(i = 0; i < n; i++) {
745static float k_rm_1_3_f(
float omega_n,
float zeta,
float p1) {
749 return (omega_n * omega_n * p1) / (omega_n * omega_n + omega_n * p1 * zeta * 2.0);
751static float k_rm_2_3_f(
float omega_n,
float zeta,
float p1) {
755 return (omega_n * omega_n + omega_n * p1 * zeta * 2.0) / (p1 + omega_n * zeta * 2.0);
757static float k_rm_3_3_f(
float omega_n,
float zeta,
float p1) {
761 return p1 + omega_n * zeta * 2.0;
768 static float prev_pos[3] = {0.0f, 0.0f, 0.0f};
769 static float integral[3] = {0.0f, 0.0f, 0.0f};
770 for (
int i = 0; i < 3; i++)
772 float err =
x_des[i] - x[i];
775 const float I_MAX = 0.4f;
778#ifdef USE_PID_NUMDIFF_DERIVATIVE
807 float spsi =
sinf(psi);
808 float cpsi =
cosf(psi);
810 float aX = cpsi*a[0]+spsi*a[1];
811 float aY =-spsi*a[0]+cpsi*a[1];
840 float sphi =
sinf(e[0]);
841 float cphi =
cosf(e[0]);
842 float stheta =
sinf(e[1]);
843 float ctheta =
cosf(e[1]);
844 r[0] = ctheta *
edot[0] - stheta * cphi *
edot[2];
846 r[2] = stheta *
edot[0] + ctheta *cphi *
edot[2];
868 float sphi =
sinf(e[0]);
869 float cphi =
cosf(e[0]);
870 float stheta =
sinf(e[1]);
871 float ctheta =
cosf(e[1]);
872 float spsi =
sinf(e[2]);
873 float cpsi =
cosf(e[2]);
879 edot[0] = r[0] + spsi * stheta / ctheta * r[1] + cpsi * stheta / ctheta * r[2];
880 edot[1] = cphi * r[1] - sphi * r[2];
881 edot[2] = sphi * r[1] + cphi * r[2];
889 float v[2] = {vect->
x, vect->
y};
890 float sign_v0 = (v[0] > 0.f) ? 1.f : (v[0] < 0.f) ? -1.f : 0.f;
891 float sign_v1 = (v[1] > 0.f) ? 1.f : (v[1] < 0.f) ? -1.f : 0.f;
956void rm_3rd_attitude(
float dt,
float x_ref[3],
float x_d_ref[3],
float x_2d_ref[3],
float x_3d_ref[3],
float x_des[3],
bool ow_psi,
float psi_overwrite[4],
float k1_rm[3],
float k2_rm[3],
float k3_rm[3],
struct OneloopStabilizationRef bounds){
1020void rm_3rd_pos(
float dt,
float x_ref[],
float x_d_ref[],
float x_2d_ref[],
float x_3d_ref[],
float x_des[],
float k1_rm[],
float k2_rm[],
float k3_rm[],
float x_d_bound,
float x_2d_bound,
float x_3d_bound,
int n)
1099void ec_3rd_pos(
float y_4d[],
float x_des[],
float x_ref[],
float x_d_ref[],
float x_2d_ref[],
float x_3d_ref[],
float x[],
float x_d[],
float x_2d[],
float k1_e[],
float k2_e[],
float k3_e[],
float x_d_bound,
float x_2d_bound,
float fb[],
int n)
1131void ec_3rd_att(
float y_4d[3],
float x_des[3],
float x_ref[3],
float x_d_ref[3],
float x_2d_ref[3],
float x_3d_ref[3],
float x[3],
float x_d[3],
float x_2d[3],
float k1_e[3],
float k2_e[3],
float k3_e[3],
struct OneloopStabilizationRef bounds,
float fb[3])
1182 float tao = (p1 * p2 + p1 * p3 + p2 * p3) / (p1 * p2 * p3) / (
rm_k);
1444 LP->tau = 1 / (2 *
M_PI *
LP->freq);
1447#elif defined(USE_BW2)
1449#elif defined(USE_YAW_LP4)
1455 LP->meas_prev = 0.0;
1463 LP->freq =
LP->freq_set;
1464 LP->tau = 1 / (2 *
M_PI *
LP->freq);
1473 LP->freq =
LP->freq_set;
1474 LP->tau = 1 / (2 *
M_PI *
LP->freq);
1526#ifdef USE_PID_NUMDIFF_DERIVATIVE
1527 for (
int i = 0; i < 3; i++){
1543#ifdef USE_ND_VELOCITIES
1662#if PERIODIC_TELEMETRY
1682#ifndef ONELOOP_ANDI_SIMPLE_QUAD
1791 rm_3rd_attitude(
dt_1l,
oneloop_andi.
sta_ref.
att,
oneloop_andi.
sta_ref.
att_d,
oneloop_andi.
sta_ref.
att_2d,
oneloop_andi.
sta_ref.
att_3d,
att_des,
false,
psi_vec,
k_att_rm.
k1,
k_att_rm.
k2,
k_att_rm.
k3,
sta_bounds);
1801 rm_3rd_pos(
dt_1l,
oneloop_andi.
gui_ref.
pos,
oneloop_andi.
gui_ref.
vel,
oneloop_andi.
gui_ref.
acc,
oneloop_andi.
gui_ref.
jer,
nav_target,
k_pos_rm.
k1,
k_pos_rm.
k2,
k_pos_rm.
k3,
max_v_nav,
max_a_nav,
max_j_lin, 2);
1849 rm_3rd_pos(
dt_1l,
single_value_ref,
single_value_d_ref,
single_value_2d_ref,
single_value_3d_ref,
single_value_nav_target,
single_value_k1_rm,
single_value_k2_rm,
single_value_k3_rm,
max_v_nav_v,
max_a_nav,
max_j_lin, 1);
1918 chirp_call(&
chirp_on, &
chirp_first_call, &
t_0_chirp, &
time_elapsed_chirp,
f0_chirp,
f1_chirp,
t_chirp,
A_chirp,
chirp_axis,
att_des[2],
oneloop_andi.
gui_ref.
pos,
oneloop_andi.
gui_ref.
vel,
oneloop_andi.
gui_ref.
acc,
oneloop_andi.
gui_ref.
jer,
p_ref_0);
1944 rm_3rd_attitude(
dt_1l,
oneloop_andi.
sta_ref.
att,
oneloop_andi.
sta_ref.
att_d,
oneloop_andi.
sta_ref.
att_2d,
oneloop_andi.
sta_ref.
att_3d,
att_des,
ow_psi,
psi_vec,
k_att_rm.
k1,
k_att_rm.
k2,
k_att_rm.
k3,
sta_bounds);
2059 ec_3rd_pos(
nu,
pos_des,
oneloop_andi.
gui_ref.
pos,
oneloop_andi.
gui_ref.
vel,
oneloop_andi.
gui_ref.
acc,
oneloop_andi.
gui_ref.
jer,
oneloop_andi.
gui_state.
pos,
oneloop_andi.
gui_state.
vel,
oneloop_andi.
gui_state.
acc,
k_pos_e.
k1,
k_pos_e.
k2,
k_pos_e.
k3,
max_v_nav,
max_a_nav,
temp_dist_bound_gui, 3);
2063 float dummy1[3] = {0.0, 0.0, 0.0};
2064 ec_3rd_pos(
nu,
pos_des,
oneloop_andi.
gui_ref.
pos,
oneloop_andi.
gui_ref.
vel,
oneloop_andi.
gui_ref.
acc,
dummy1,
oneloop_andi.
gui_state.
pos,
oneloop_andi.
gui_state.
vel,
oneloop_andi.
gui_state.
acc,
k_pos_e_indi.
k1,
k_pos_e_indi.
k2,
k_pos_e_indi.
k3,
max_v_nav,
max_a_nav,
dummy1, 3);
2069#define USE_PID_OUTERLOOP
2070#ifdef USE_PID_OUTERLOOP
2088 ec_3rd_att(
y_4d_att,
att_des_4_ec,
oneloop_andi.
sta_ref.
att,
oneloop_andi.
sta_ref.
att_d,
oneloop_andi.
sta_ref.
att_2d,
oneloop_andi.
sta_ref.
att_3d,
oneloop_andi.
sta_state.
att,
oneloop_andi.
sta_state.
att_d,
oneloop_andi.
sta_state.
att_2d,
k_att_e.
k1,
k_att_e.
k2,
k_att_e.
k3,
sta_bounds,
temp_dist_bound_sta);
2092 float dummy0[3] = {0.0, 0.0, 0.0};
2094 ec_3rd_att(
y_4d_att,
att_des_4_ec,
oneloop_andi.
sta_ref.
att,
oneloop_andi.
sta_ref.
att_d,
oneloop_andi.
sta_ref.
att_2d,
dummy0,
oneloop_andi.
sta_state.
att,
oneloop_andi.
sta_state.
att_d,
oneloop_andi.
sta_state.
att_2d,
k_att_e_indi.
k1,
k_att_e_indi.
k2,
k_att_e_indi.
k3,
sta_bounds,
temp_dist_bound_sta_INDI);
2167#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2178#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2193#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2239#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2264#ifdef MODULE_SYS_ID_DOUBLET_ID
2281#ifdef COMMAND_MOTOR_PUSHER
2306#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2328#ifndef USE_PID_OUTERLOOP
2371#ifdef ONELOOP_ANDI_CONSTANT_EFFECTIVENESS
2423#ifdef ONELOOP_ANDI_CONSTANT_EFFECTIVENESS
2435#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2466#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2478#ifndef ONELOOP_ANDI_SIMPLE_QUAD
2632#ifdef FWD_SIDESLIP_GAIN
2676void chirp_pos(
float time_elapsed,
float f0,
float f1,
float t_chirp,
float A,
int8_t n,
float psi,
float p_ref[],
float v_ref[],
float a_ref[],
float j_ref[],
float p_ref_0[])
2703 float spsi =
sinf(psi);
2704 float cpsi =
cosf(psi);
2810void chirp_call(
bool *
chirp_on,
bool *
chirp_first_call,
float *
t_0,
float *
time_elapsed,
float f0,
float f1,
float t_chirp,
float A,
int8_t n,
float psi,
float p_ref[],
float v_ref[],
float a_ref[],
float j_ref[],
float p_ref_0[])
2826 chirp_pos(*
time_elapsed,
f0,
f1,
t_chirp,
A, n, psi,
p_ref,
v_ref,
a_ref,
j_ref,
p_ref_0);
2860 float cpsi =
cosf(psi);
2861 float spsi =
sinf(psi);
2890 float dv =
bv *
bv - 4.0f *
av * cv;
2942#ifndef ONELOOP_ANDI_SIMPLE_QUAD
Main include for ABI (AirBorneInterface).
struct pprz_autopilot autopilot
Global autopilot structure.
bool autopilot_get_motors_on(void)
get motors status
pprz_t throttle
throttle level as will be displayed in GCS
Hardware independent code for commands handling.
static struct uart_periph * dev
float G2_RW[EFF_MAT_COLS_NB]
float EFF_MAT_RW[EFF_MAT_ROWS_NB][EFF_MAT_COLS_NB]
#define FLOAT_ANGLE_NORMALIZE(_a)
static void float_vect_sum(float *o, const float *a, const float *b, const int n)
o = a + b
static void float_vect_zero(float *a, const int n)
a = 0
static void float_vect_copy(float *a, const float *b, const int n)
a = b
static void float_vect_diff(float *o, const float *a, const float *b, const int n)
o = a - b
static float float_vect_norm(const float *a, const int n)
||a||
#define FLOAT_VECT2_NORM(_v)
#define VECT2_DIFF(_c, _a, _b)
#define POS_FLOAT_OF_BFP(_ai)
#define SPEED_FLOAT_OF_BFP(_ai)
#define POS_BFP_OF_REAL(_af)
#define ACCEL_FLOAT_OF_BFP(_ai)
#define SPEED_BFP_OF_REAL(_af)
static struct NedCoor_f * stateGetAccelNed_f(void)
Get acceleration in NED coordinates (float).
static struct FloatEulers * stateGetNedToBodyEulersZxy_f(void)
Get vehicle body attitude ZXY euler angles (float).
static struct NedCoor_f * stateGetPositionNed_f(void)
Get position in local NED coordinates (float).
static struct FloatRates * stateGetBodyRates_f(void)
Get vehicle body angular rate (float).
static struct NedCoor_f * stateGetSpeedNed_f(void)
Get ground speed in local NED coordinates (float).
static struct Int32Vect3 * stateGetAccelBody_i(void)
Get acceleration in Body coordinates (int).
static float stateGetAirspeed_f(void)
Get airspeed (float).
bool force_forward
forward flight for hybrid nav
Integrated Navigation System interface.
PRINT_CONFIG_MSG("USE_INS_NAV_INIT defaulting to TRUE")
Simple first order low pass filter with bilinear transform.
static void init_first_order_low_pass(struct FirstOrderLowPass *filter, float tau, const float sample_time, float value)
Init first order low pass filter.
static float update_first_order_low_pass(struct FirstOrderLowPass *filter, const float value)
Update first order low pass filter state with a new value.
static void init_butterworth_2_low_pass(Butterworth2LowPass *filter, const float tau, const float sample_time, const float value)
Init a second order Butterworth filter.
static float update_butterworth_2_low_pass(Butterworth2LowPass *filter, const float value)
Update second order Butterworth low pass filter state with a new value.
static float update_butterworth_4_low_pass(Butterworth4LowPass *filter, const float value)
Update fourth order Butterworth low pass filter state with a new value.
static void init_butterworth_4_low_pass(Butterworth4LowPass *filter, const float tau, const float sample_time, const float value)
Init a fourth order Butterworth filter.
Second order low pass filter structure.
Hardware independent API for actuators (servos, motor controllers).
#define NAV_HYBRID_MAX_AIRSPEED
float nav_hybrid_max_bank
float nav_max_acceleration_sp
float nav_hybrid_pos_gain
#define NAV_HYBRID_MAX_DECELERATION
Specific navigation functions for hybrid aircraft.
static void notch_filter_update(struct SecondOrderNotchFilter *filter, int32_t *input_signal, int32_t *output_signal)
Notch filter propagate.
static void notch_filter_init(struct SecondOrderNotchFilter *filter, float cutoff_frequency, float bandwidth, uint16_t sample_frequency)
Initialize second order notch filter.
static float w_approx(float p1, float p2, float p3, float rm_k)
Third Order to First Order Dynamics Approximation.
#define ONELOOP_ANDI_MAX_THETA
void init_poles(void)
Initialize Position of Poles.
struct PolePlacement p_pos_e
static float Wv_backup[ANDI_OUTPUTS]
static void reinit_LP(struct LP_t *LP, bool reinit)
void chirp_pos(float time_elapsed, float f0, float f1, float t_chirp, float A, int8_t n, float psi, float p_ref[], float v_ref[], float a_ref[], float j_ref[], float p_ref_0[])
Reference Model Definition for 3rd order system specific to positioning with bounds.
static Butterworth2LowPass accely_filt
float act_dynamics[ANDI_NUM_ACT_TOT]
float ratio_u_un[ANDI_NUM_ACT_TOT]
static float Wu_backup[ANDI_NUM_ACT_TOT]
void init_filter(void)
Initialize the filters.
void reinit_controller(void)
Re-Init function of controller variables.
struct PolePlacement p_head_rm
void oneloop_andi_RM(bool half_loop, struct FloatVect3 PSA_des, int rm_order_h, int rm_order_v, bool in_flight_oneloop)
Function to generate the reference signals for the oneloop controller.
void oneloop_calc_model_disturbance(bool in_flight)
Function that calculates the model disturbance (Control Effort) The control effort is equalt to : EFF...
static void update_filter_on_type(struct LP_t *filter, float input)
Update a filter based on its type.
void oneloop_andi_enter(bool half_loop_sp, int ctrl_type)
Function that resets important values upon engaging Oneloop ANDI.
static Butterworth2LowPass airspeed_filt
static Butterworth2LowPass filt_veloc[3]
static void eul_of_acc(float a[3], float psi)
float n_array[ANDI_OUTPUTS]
static void init_all_LP(void)
Initialize all Low Pass Filters.
float act_max_norm[ANDI_NUM_ACT_TOT]
struct Gains3rdOrder k_att_rm
void float_euler_dot_of_rates_vec(float r[3], float e[3], float edot[3])
Attitude Euler to Rates Conversion Function ZYX.
float oneloop_andi_filt_cutoff_v
void oneloop_andi_bound_disturbance(void)
static Butterworth2LowPass u_filt[ANDI_NUM_ACT_TOT]
float act_dyn_ctrl[ANDI_NUM_ACT_TOT]
struct FloatEulers eulers_zxy_des
struct PolePlacement p_att_rm
static float k_rm_3_3_f(float omega_n, float zeta, float p1)
struct Oneloop_DynFilt_t mu_mR
void guidance_set_max_bank_angle(float max_bank)
Guidance limit setters called by rotwing_state (also implemented by guidance_indi_hybrid).
struct Gains3rdOrder k_att_e
float EFF_MAT_G[ANDI_OUTPUTS][ANDI_NUM_ACT_TOT]
void rm_1st_pos(float dt, float x_2d_ref[], float x_3d_ref[], float x_2d_des[], float k3_rm[], float x_3d_bound, int n)
Reference Model Definition for 3rd order system specific to positioning with bounds.
void oneloop_andi_propagate_filters(void)
Propagate the filters.
void guidance_set_max_climb_speed(float max_climb_speed_quad, float max_climb_speed_fwd)
struct Gains3rdOrder k_pos_e
bool actuator_is_servo[ANDI_NUM_ACT_TOT]
void float_vect_diff_euler(float err[3], float a[3], float b[3])
Calculate Error between two 3D euler arrays with the psi normalized.
float oneloop_andi_sideslip(void)
Function to calculate corrections for sideslip.
float num_thrusters_oneloop
static float act_dynamics_d[ANDI_NUM_ACT_TOT]
static float andi_u_n[ANDI_NUM_ACT_TOT]
float act_min_norm[ANDI_NUM_ACT_TOT]
#define ONELOOP_ANDI_DEBUG_MODE
float oneloop_andi_filt_cutoff_q
void dynFilter_init(struct Oneloop_DynFilt_t *mu, float varepsilon, float sigma)
void rm_3rd_attitude(float dt, float x_ref[3], float x_d_ref[3], float x_2d_ref[3], float x_3d_ref[3], float x_des[3], bool ow_psi, float psi_overwrite[4], float k1_rm[3], float k2_rm[3], float k3_rm[3], struct OneloopStabilizationRef bounds)
Reference Model Definition for 3rd order system with attitude conversion functions.
float oneloop_andi_filt_cutoff_a
void oneloop_axis_effectiveness_calc(void)
static void send_wls_u_oneloop(struct transport_tx *trans, struct link_device *dev)
static float chirp_pos_j_ref(float delta_t, float f0, float k, float A)
Function to calculate the jerk reference during the chirp.
#define ONELOOP_ANDI_MAX_PHI
float oneloop_andi_sigma_min
void oneloop_from_nav(bool in_flight)
Function that maps navigation inputs to the oneloop controller for the generated autopilot.
float bound_v_from_a(float e_x, float v_bound, float a_bound)
Calculate velocity limit based on acceleration limit for a float From SUVAT we have that v^2 = u^2 + ...
struct PolePlacement p_alt_rm
void init_controller_gains(void)
Initialize Controller Gains FIXME: Calculate the gains dynamically for transition.
static void reinit_all_LP(bool reinit)
Reinitialize all the Low Pass Filters.
float oneloop_andi_sigma_max
static float positive_non_zero(float input)
Function to make sure that inputs are positive non zero vaues.
static void send_eff_mat_stab_oneloop_andi(struct transport_tx *trans, struct link_device *dev)
float oneloop_andi_yaw_dist_limit
void guidance_set_min_max_airspeed(float min_airspeed, float max_airspeed)
float andi_u[ANDI_NUM_ACT_TOT]
void calc_normalization(void)
Calculate Normalization of actuators and discrete actuator dynamics
struct Gains3rdOrder k_pos_e_indi
void oneloop_andi_run(bool in_flight, bool half_loop, struct FloatVect3 PSA_des, int rm_order_h, int rm_order_v)
Main function that runs the controller and performs control allocation.
struct PolePlacement p_att_e
static void send_eff_mat_guid_oneloop_andi(struct transport_tx *trans, struct link_device *dev)
static void debug_vect(struct transport_tx *trans, struct link_device *dev, char *name, float *data, int datasize)
struct PolePlacement p_alt_e
float bound_v_from_a_vect(float e_x[], float v_bound, float a_bound, int n)
Calculate velocity limit based on acceleration limit for a vector From SUVAT we have that v^2 = u^2 +...
void rm_2nd_pos(float dt, float x_d_ref[], float x_2d_ref[], float x_3d_ref[], float x_d_des[], float k2_rm[], float k3_rm[], float x_2d_bound, float x_3d_bound, int n)
Reference Model Definition for 3rd order system specific to positioning with bounds.
void get_act_state_oneloop(void)
Function to reconstruct actuator state using first order dynamics.
struct PolePlacement p_roll_e
void ec_3rd_pos(float y_4d[], float x_des[], float x_ref[], float x_d_ref[], float x_2d_ref[], float x_3d_ref[], float x[], float x_d[], float x_2d[], float k1_e[], float k2_e[], float k3_e[], float x_d_bound, float x_2d_bound, float fb[], int n)
Error Controller Definition for 3rd order system.
struct PolePlacement p_head_e
static float chirp_pos_p_ref(float delta_t, float f0, float k, float A)
Function to calculate the position reference during the chirp.
struct Oneloop_LP_t oneloop_andi_model_filt
static void init_LP(struct LP_t *LP, float fc)
Initialize the Low Pass Filter Struct.
float andi_du[ANDI_NUM_ACT_TOT]
static float chirp_pos_v_ref(float delta_t, float f0, float k, float A)
Function to calculate the velocity reference during the chirp.
static void send_wls_v_oneloop(struct transport_tx *trans, struct link_device *dev)
static float nav_target[3]
void err_nd(float err[], float a[], float b[], float k[], int n)
Calculate Scaled Error between two 3D arrays.
static void Pos_PID(float x_des[3], float x[3], float x_dot[3], float k_P, float k_I, float k_D, float a[3])
#define ONELOOP_ANDI_AIRSPEED_SWITCH_THRESHOLD
float oneloop_andi_dist_bound[ANDI_OUTPUTS]
void dynFilter_run(struct Oneloop_DynFilt_t *mu, float u_c, float sigma)
static void init_filter_on_type(struct LP_t *filter, float x0)
Initialize a filter based on its type.
struct OneloopGeneral oneloop_andi
struct Gains3rdOrder k_pos_rm
bool autopilot_in_flight_end_detection(bool motors_on UNUSED)
Quadplanes can still be in-flight with COMMAND_THRUST==0 and can even soar not descending in updrafts...
void guidance_set_max_descend_speed(float max_descend_speed_quad, float max_descend_speed_fwd)
static void reinit_LP_synchronous(struct LP_t *LP, struct LP_t *f, bool reinit)
Reinitialize Low Pass filter if new frequency setting or if forced.
float oneloop_andi_model[ANDI_OUTPUTS]
float m_array[ANDI_NUM_ACT_TOT]
void chirp_call(bool *chirp_on, bool *chirp_first_call, float *t_0_chirp, float *time_elapsed, float f0, float f1, float t_chirp, float A, int8_t n, float psi, float p_ref[], float v_ref[], float a_ref[], float j_ref[], float p_ref_0[])
void G1G2_oneloop(int ctrl_type)
Function that samples and scales the effectiveness matrix FIXME: make this function into a for loop t...
static void send_guidance_oneloop_andi(struct transport_tx *trans, struct link_device *dev)
float act_max[ANDI_NUM_ACT_TOT]
void normalize_nu(void)
Function to normalize the pseudo control vector.
void rm_3rd_pos(float dt, float x_ref[], float x_d_ref[], float x_2d_ref[], float x_3d_ref[], float x_des[], float k1_rm[], float k2_rm[], float k3_rm[], float x_d_bound, float x_2d_bound, float x_3d_bound, int n)
Reference Model Definition for 3rd order system specific to positioning with bounds.
struct FloatEulers eulers_zxy
void oneloop_andi_init(void)
Init function of Oneloop ANDI controller
void float_rates_of_euler_dot_vec(float r[3], float e[3], float edot[3])
Attitude Rates to Euler Conversion Function ZYX.
float oneloop_andi_filt_cutoff_p
static float k_rm_1_3_f(float omega_n, float zeta, float p1)
Reference Model Gain Design.
float gi_unbounded_airspeed_sp
struct OneloopStabilizationRef sta_bounds
float oneloop_andi_filt_cutoff_r
struct PolePlacement p_pos_rm
float ratio_vn_v[ANDI_OUTPUTS]
static float chirp_pos_a_ref(float delta_t, float f0, float k, float A)
Function to calculate the acceleration reference during the chirp.
#define ONELOOP_ANDI_MAX_BANK
float actuator_state_1l[ANDI_NUM_ACT_TOT]
void vect_bound_nd(float vect[], float bound, int n)
Scale a 3D array to within a 3D bound.
void err_sum_nd(float err[], float a[], float b[], float k[], float c[], int n)
Calculate Scaled Error between two 3D arrays.
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
void integrate_nd(float dt, float a[], float a_dot[], int n)
Integrate in time 3D array.
static void send_oneloop_andi(struct transport_tx *trans, struct link_device *dev)
struct Gains3rdOrder k_att_e_indi
static void send_oneloop_debug(struct transport_tx *trans, struct link_device *dev)
float act_min[ANDI_NUM_ACT_TOT]
struct Oneloop_DynFilt_t mu_mL
void acc_body_bound(struct FloatVect2 *vect, float bound)
Scale a 3D array to within a 3D bound.
float * bwls_1l[ANDI_OUTPUTS]
static float k_rm_2_3_f(float omega_n, float zeta, float p1)
static float nav_target_new[3]
void ec_3rd_att(float y_4d[3], float x_des[3], float x_ref[3], float x_d_ref[3], float x_2d_ref[3], float x_3d_ref[3], float x[3], float x_d[3], float x_2d[3], float k1_e[3], float k2_e[3], float k3_e[3], struct OneloopStabilizationRef bounds, float fb[3])
Error Controller Definition for 3rd order system specific to attitude.
static float u_pref[ANDI_NUM_ACT_TOT]
static void shape_vector(float a[3])
float oneloop_andi_filt_cutoff
float coupling_factor[ANDI_OUTPUTS]
#define CTRL_ANDI
Control types.
struct OneloopGuidanceState gui_state
struct OneloopStabilizationState sta_state
union LP_t::@275 meas_filt
struct OneloopGuidanceRef gui_ref
struct OneloopStabilizationRef sta_ref
enum FilterType filter_type
Paparazzi floating point algebra.
vector in North East Down coordinates Units: meters
struct RadioControl radio_control
Generic interface for radio control modules.
pprz_t values[RADIO_CONTROL_NB_CHANNEL]
static pprz_t radio_control_get(uint8_t idx)
Get a radio control channel value.
#define RADIO_ROLL
Redefining RADIO_* Do not use with radio.h (ppm rc)
struct RotorcraftNavigation nav
Rotorcraft navigation functions.
struct EnuCoor_f speed
speed setpoint (in m/s)
float climb
climb setpoint (in m/s)
#define NAV_SETPOINT_MODE_SPEED
#define NAV_VERTICAL_MODE_CLIMB
float nav_altitude
current altitude setpoint (in meters): might differ from fp_altitude depending on altitude shift from...
#define NAV_VERTICAL_MODE_ALT
#define NAV_SETPOINT_MODE_POS
Nav setpoint modes these modes correspond to submodes defined by navigation routines to tell which se...
struct EnuCoor_f target
final target position (in meters)
bool rotwing_state_hover_motors_running(void)
struct rotwing_state_t rotwing_state
enum rotwing_states_t state
bool hover_motors_enabled
@ ROTWING_STATE_FORCE_HOVER
static const ShellCommand commands[]
struct Stabilization stabilization
int32_t cmd[COMMANDS_NB]
output command vector, range from [-MAX_PPRZ:MAX_PPRZ] (store for messages)
API to get/set the generic vehicle states.
uint8_t sys_id_doublet_running(void)
static float get_sys_time_float(void)
Get the time in seconds since startup.
int16_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint16_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
static const float scale[]
short int16_t
Typedef defining 16 bit short type.
signed char int8_t
Typedef defining 8 bit char type.
uint16_t f
Camera baseline, in meters (i.e. horizontal distance between the two cameras of the stereo setup)
void send_wls_v(char *name, struct WLS_t *WLS_p, struct transport_tx *trans, struct link_device *dev)
void wls_alloc(struct WLS_t *WLS_p, float **B, float *u_guess, float *W_init, int imax)
active set algorithm for control allocation
void send_wls_u(char *name, struct WLS_t *WLS_p, struct transport_tx *trans, struct link_device *dev)
float u_pref[WLS_N_U_MAX]