diff --git a/conf/airframes/tudelft/bebop_indi.xml b/conf/airframes/tudelft/bebop_indi.xml index 06b3f62afa..001409c009 100644 --- a/conf/airframes/tudelft/bebop_indi.xml +++ b/conf/airframes/tudelft/bebop_indi.xml @@ -156,9 +156,9 @@ - - - + + + diff --git a/conf/airframes/tudelft/cyfoam.xml b/conf/airframes/tudelft/cyfoam.xml index 1639c0d026..ad8fa027ee 100644 --- a/conf/airframes/tudelft/cyfoam.xml +++ b/conf/airframes/tudelft/cyfoam.xml @@ -111,7 +111,7 @@ - + diff --git a/conf/userconf/tudelft/conf.xml b/conf/userconf/tudelft/conf.xml index 3b1e66a0ae..50da0328b0 100644 --- a/conf/userconf/tudelft/conf.xml +++ b/conf/userconf/tudelft/conf.xml @@ -95,7 +95,7 @@ telemetry="telemetry/default_rotorcraft.xml" flight_plan="flight_plans/rotorcraft_basic.xml" settings="settings/rotorcraft_basic.xml settings/control/rotorcraft_speed.xml" - settings_modules="modules/ahrs_float_mlkf.xml modules/air_data.xml modules/bebop_ae_awb.xml modules/bebop_cam.xml modules/geo_mag.xml modules/gps.xml modules/guidance_rotorcraft.xml modules/imu_common.xml modules/ins_extended.xml modules/nav_basic_rotorcraft.xml modules/stabilization_int_quat.xml modules/video_rtp_stream.xml" + settings_modules="modules/ahrs_float_mlkf.xml modules/air_data.xml modules/bebop_ae_awb.xml modules/bebop_cam.xml modules/electrical.xml modules/geo_mag.xml modules/gps.xml modules/guidance_pid_rotorcraft.xml modules/guidance_rotorcraft.xml modules/imu_common.xml modules/ins_extended.xml modules/nav_rotorcraft.xml modules/stabilization_int_quat.xml modules/video_rtp_stream.xml" gui_color="#ffffbc3bce5b" /> act_rate_limit[i]) { diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.c index ac46c36a9e..cb65ec35ed 100644 --- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.c +++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.c @@ -41,8 +41,13 @@ #include "modules/radio_control/radio_control.h" #include "filters/low_pass_filter.h" -#if !defined(STABILIZATION_INDI_ACT_DYN_P) && !defined(STABILIZATION_INDI_ACT_DYN_Q) && !defined(STABILIZATION_INDI_ACT_DYN_R) -#error You have to define the first order time constant of the actuator dynamics! +#if defined(STABILIZATION_INDI_ACT_DYN_P) && !defined(STABILIZATION_INDI_ACT_DYN_Q) && !defined(STABILIZATION_INDI_ACT_DYN_R) +#warning STABILIZATION_INDI_ACT_DYN is deprecated, use STABILIZATION_INDI_ACT_FREQ instead. +#warning You now have to define the continuous time corner frequency in rad/s of the actuators. +#warning "Use -log(1 - old_number) * PERIODIC_FREQUENCY to compute it from the old values. +#else +#if !defined(STABILIZATION_INDI_ACT_FREQ_P) && !defined(STABILIZATION_INDI_ACT_FREQ_Q) && !defined(STABILIZATION_INDI_ACT_FREQ_R) +#warning You have to define the corner frequency of the first order actuator dynamics model in rad/s! #endif // these parameters are used in the filtering of the angular acceleration @@ -169,13 +174,13 @@ static void send_eff_mat_g_indi_simple(struct transport_tx *trans, struct link_d RATES_SMUL(g1_disp, indi.est.g1, INDI_EST_SCALE); float g2_disp = indi.est.g2 * INDI_EST_SCALE; float zero = 0.0; - pprz_msg_send_EFF_MAT_G(trans, dev, AC_ID, + pprz_msg_send_EFF_MAT_G(trans, dev, AC_ID, 1, &zero, 1, &zero, 1, &zero, 1, &g1_disp.p, 1, &g1_disp.q, - 1, &g1_disp.r, + 1, &g1_disp.r, 1, &g2_disp, 1, &zero); } @@ -200,6 +205,16 @@ void stabilization_indi_init(void) // Initialize filters indi_init_filters(); +#ifdef STABILIZATION_INDI_ACT_FREQ_P + indi.act_dyn.p = 1-exp(-STABILIZATION_INDI_ACT_FREQ_P/PERIODIC_FREQUENCY); + indi.act_dyn.q = 1-exp(-STABILIZATION_INDI_ACT_FREQ_Q/PERIODIC_FREQUENCY); + indi.act_dyn.r = 1-exp(-STABILIZATION_INDI_ACT_FREQ_R/PERIODIC_FREQUENCY); +#else + indi.act_dyn.p = STABILIZATION_INDI_ACT_DYN_P; + indi.act_dyn.q = STABILIZATION_INDI_ACT_DYN_Q; + indi.act_dyn.r = STABILIZATION_INDI_ACT_DYN_R; +#endif + #if PERIODIC_TELEMETRY register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_STAB_ATTITUDE, send_att_indi); register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_EFF_MAT_G, send_eff_mat_g_indi_simple); @@ -374,9 +389,9 @@ void stabilization_indi_rate_run(struct FloatRates rate_sp, bool in_flight __att { //Propagate input filters //first order actuator dynamics - indi.u_act_dyn.p = indi.u_act_dyn.p + STABILIZATION_INDI_ACT_DYN_P * (indi.u_in.p - indi.u_act_dyn.p); - indi.u_act_dyn.q = indi.u_act_dyn.q + STABILIZATION_INDI_ACT_DYN_Q * (indi.u_in.q - indi.u_act_dyn.q); - indi.u_act_dyn.r = indi.u_act_dyn.r + STABILIZATION_INDI_ACT_DYN_R * (indi.u_in.r - indi.u_act_dyn.r); + indi.u_act_dyn.p = indi.u_act_dyn.p + indi.act_dyn.p * (indi.u_in.p - indi.u_act_dyn.p); + indi.u_act_dyn.q = indi.u_act_dyn.q + indi.act_dyn.q * (indi.u_in.q - indi.u_act_dyn.q); + indi.u_act_dyn.r = indi.u_act_dyn.r + indi.act_dyn.r * (indi.u_in.r - indi.u_act_dyn.r); // Propagate the filter on the gyroscopes and actuators struct FloatRates *body_rates = stateGetBodyRates_f(); diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.h index d86398cf95..0938e1660c 100644 --- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.h +++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_indi_simple.h @@ -70,6 +70,7 @@ struct IndiVariables { Butterworth2LowPass rate[3]; struct FloatRates g1; float g2; + struct FloatRates act_dyn; struct Indi_gains gains;