27#include "generated/airframe.h"
42#ifndef PLUSQUAD_EFF_SCHED_IXX
43#error "NO PLUSQUAD_EFF_SCHED_IXX defined"
46#ifndef PLUSQUAD_EFF_SCHED_IYY
47#error "NO PLUSQUAD_EFF_SCHED_IYY defined"
50#ifndef PLUSQUAD_EFF_SCHED_IZZ
51#error "NO PLUSQUAD_EFF_SCHED_IZZ defined"
54#ifndef PLUSQUAD_EFF_SCHED_M
55#error "NO PLUSQUAD_EFF_SCHED_M defined"
100#include "generated/modules.h"
107 float sample_time = 1.0 / PERIODIC_FREQUENCY;
116 RW.I.xx = PLUSQUAD_EFF_SCHED_IXX;
117 RW.I.yy = PLUSQUAD_EFF_SCHED_IYY;
118 RW.I.zz = PLUSQUAD_EFF_SCHED_IZZ;
119 RW.m = PLUSQUAD_EFF_SCHED_M;
127 RW.mF.l = PLUSQUAD_EFF_SCHED_MF_l;
133 RW.mR.l = PLUSQUAD_EFF_SCHED_MR_l;
139 RW.mB.l = PLUSQUAD_EFF_SCHED_MB_l;
145 RW.mL.l = PLUSQUAD_EFF_SCHED_ML_l;
166 float sample_time = 1.0 / PERIODIC_FREQUENCY;
180 RW.att.sphi = sinf(
RW.att.phi);
181 RW.att.cphi = cosf(
RW.att.phi);
182 RW.att.stheta = sinf(
RW.att.theta);
183 RW.att.ctheta = cosf(
RW.att.theta);
184 RW.att.spsi = sinf(
RW.att.psi);
185 RW.att.cpsi = cosf(
RW.att.psi);
215 G2_RW[COMMAND_MOTOR_FRONT] = -
G2_on*
RW.mF.dMdud *
I_inv[z][z] * PERIODIC_FREQUENCY;
221 G2_RW[COMMAND_MOTOR_RIGHT] =
G2_on*
RW.mR.dMdud *
I_inv[z][z] * PERIODIC_FREQUENCY;
227 G2_RW[COMMAND_MOTOR_BACK] = -
G2_on*
RW.mB.dMdud *
I_inv[z][z] * PERIODIC_FREQUENCY;
233 G2_RW[COMMAND_MOTOR_LEFT] =
G2_on*
RW.mL.dMdud *
I_inv[z][z] * PERIODIC_FREQUENCY;
253 float T =
RW.T /
RW.m;
259 case (COMMAND_MOTOR_FRONT):
260 case (COMMAND_MOTOR_BACK):
261 case (COMMAND_MOTOR_RIGHT):
262 case (COMMAND_MOTOR_LEFT):
337 return k1*u*u + k2*u + k3;
341 float out= 2.0*k1*u + k2;
342 Bound(out, 1.0e-3, 1.0e-2);
375 RW.T =
RW.m*9.81/(
RW.att.cphi *
RW.att.ctheta);
376 Bound(
RW.T, 30.0, 180.0);
386 float T_mF =
calc_thrust_curve(PLUSQUAD_EFF_SCHED_MF_k1, PLUSQUAD_EFF_SCHED_MF_k2, PLUSQUAD_EFF_SCHED_MF_k3, 4800.0);
387 float T_mR =
calc_thrust_curve(PLUSQUAD_EFF_SCHED_MR_k1, PLUSQUAD_EFF_SCHED_MR_k2, PLUSQUAD_EFF_SCHED_MR_k3, 4800.0);
388 float T_mB =
calc_thrust_curve(PLUSQUAD_EFF_SCHED_MB_k1, PLUSQUAD_EFF_SCHED_MB_k2, PLUSQUAD_EFF_SCHED_MB_k3, 4800.0);
389 float T_mL =
calc_thrust_curve(PLUSQUAD_EFF_SCHED_ML_k1, PLUSQUAD_EFF_SCHED_ML_k2, PLUSQUAD_EFF_SCHED_ML_k3, 4800.0);
390 RW.T = T_mF + T_mR + T_mB + T_mL;
391 Bound(
RW.T, 0.0, 180.0);
Main include for ABI (AirBorneInterface).
void update_attitude(void)
float G2_RW[EFF_MAT_COLS_NB]
float G1_RW[EFF_MAT_ROWS_NB][EFF_MAT_COLS_NB]
struct FloatEulers eulers_zxy_RW_EFF
float calc_thrust_curve_d(float k1, float k2, float u)
static Butterworth2LowPass psi_filt
void calc_all_thrust_curve(void)
float EFF_MAT_RW[EFF_MAT_ROWS_NB][EFF_MAT_COLS_NB]
float calc_thrust_curve(float k1, float k2, float k3, float u)
void eff_scheduling_rotwing_init(void)
static Butterworth2LowPass theta_filt
void sum_EFF_MAT_RW(void)
Function that sums g1 and g2 to obtain the g1_g2 matrix.
void eff_scheduling_rotwing_periodic(void)
void init_all_thrust_curve(void)
static Butterworth2LowPass phi_filt
void float_eulers_of_quat_zxy(struct FloatEulers *e, const struct FloatQuat *q)
euler rotation 'ZXY' This rotation order is useful if you need 90 deg pitch
static struct FloatQuat * stateGetNedToBodyQuat_f(void)
Get vehicle body attitude quaternion (float).
Integrated Navigation System interface.
Simple first order low pass filter with bilinear transform.
struct SecondOrderLowPass Butterworth2LowPass
Second order Butterworth low pass filter.
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.
Hardware independent API for actuators (servos, motor controllers).
float actuator_state_1l[ANDI_NUM_ACT_TOT]
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
float oneloop_nB_filt_cutoff
float actuator_state_filt_vect[INDI_NUM_ACT]
API to get/set the generic vehicle states.