paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [5035] Add rates_d gains and reference module schedu


From: Allen Ibara
Subject: [paparazzi-commits] [5035] Add rates_d gains and reference module scheduling ( different ref model for different mode)
Date: Fri, 09 Jul 2010 05:41:34 +0000

Revision: 5035
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5035
Author:   aibara
Date:     2010-07-09 05:41:34 +0000 (Fri, 09 Jul 2010)
Log Message:
-----------
Add rates_d gains and reference module scheduling (different ref model for 
different mode)

Modified Paths:
--------------
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_float.h
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.h

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
 2010-07-09 05:24:58 UTC (rev 5034)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
 2010-07-09 05:41:34 UTC (rev 5035)
@@ -32,6 +32,7 @@
        struct FloatVect3  p;
        struct FloatVect3  d;
        struct FloatVect3  dd;
+       struct FloatVect3  rates_d;
        struct FloatVect3  i;
        struct FloatVect3  surface_p;
        struct FloatVect3  surface_d;

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
    2010-07-09 05:24:58 UTC (rev 5034)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
    2010-07-09 05:41:34 UTC (rev 5035)
@@ -59,6 +59,10 @@
 static const float theta_ddgain[] = BOOZ_STABILIZATION_ATTITUDE_THETA_DDGAIN;
 static const float psi_ddgain[] = BOOZ_STABILIZATION_ATTITUDE_PSI_DDGAIN;
 
+static const float phi_dgain_d[] = BOOZ_STABILIZATION_ATTITUDE_PHI_DGAIN_D;
+static const float theta_dgain_d[] = BOOZ_STABILIZATION_ATTITUDE_THETA_DGAIN_D;
+static const float psi_dgain_d[] = BOOZ_STABILIZATION_ATTITUDE_PSI_DGAIN_D;
+
 static const float phi_pgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PHI_PGAIN_SURFACE;
 static const float theta_pgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_THETA_PGAIN_SURFACE;
 static const float psi_pgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PSI_PGAIN_SURFACE;
@@ -86,6 +90,7 @@
     VECT3_ASSIGN(booz_stabilization_gains[i].d, phi_dgain[i], theta_dgain[i], 
psi_dgain[i]);
     VECT3_ASSIGN(booz_stabilization_gains[i].i, phi_igain[i], theta_igain[i], 
psi_igain[i]);
     VECT3_ASSIGN(booz_stabilization_gains[i].dd, phi_ddgain[i], 
theta_ddgain[i], psi_ddgain[i]);
+    VECT3_ASSIGN(booz_stabilization_gains[i].rates_d, phi_dgain_d[i], 
theta_dgain_d[i], psi_dgain_d[i]);
     VECT3_ASSIGN(booz_stabilization_gains[i].surface_p, phi_pgain_surface[i], 
theta_pgain_surface[i], psi_pgain_surface[i]);
     VECT3_ASSIGN(booz_stabilization_gains[i].surface_d, phi_dgain_surface[i], 
theta_dgain_surface[i], psi_dgain_surface[i]);
     VECT3_ASSIGN(booz_stabilization_gains[i].surface_i, phi_igain_surface[i], 
theta_igain_surface[i], psi_igain_surface[i]);
@@ -103,6 +108,7 @@
                return;
        }
        gain_idx = idx;
+       booz_stabilization_attitude_ref_schedule(idx);
 }
 
 void booz_stabilization_attitude_enter(void) {
@@ -120,28 +126,43 @@
   ff_commands[COMMAND_ROLL]          = GAIN_PRESCALER_FF * gains->dd.x * 
ref_accel->p;
   ff_commands[COMMAND_PITCH]         = GAIN_PRESCALER_FF * gains->dd.y * 
ref_accel->q;
   ff_commands[COMMAND_YAW]           = GAIN_PRESCALER_FF * gains->dd.z * 
ref_accel->r;
+  ff_commands[COMMAND_ROLL_SURFACE]  = GAIN_PRESCALER_FF * gains->surface_dd.x 
* ref_accel->p;
+  ff_commands[COMMAND_PITCH_SURFACE] = GAIN_PRESCALER_FF * gains->surface_dd.y 
* ref_accel->q;
   ff_commands[COMMAND_YAW_SURFACE]   = GAIN_PRESCALER_FF * gains->surface_dd.z 
* ref_accel->r;
 }
 
 static void attitude_run_fb(float fb_commands[], struct FloatAttitudeGains 
*gains, struct FloatQuat *att_err,
-       struct FloatRates *rate_err, struct FloatQuat *sum_err)
+       struct FloatRates *rate_err, struct FloatRates *rate_err_d, struct 
FloatQuat *sum_err)
 {
   /*  PID feedback */
   fb_commands[COMMAND_ROLL] = 
     GAIN_PRESCALER_P * -gains->p.x  * att_err->qx +
     GAIN_PRESCALER_D * gains->d.x  * rate_err->p +
+    GAIN_PRESCALER_D * gains->rates_d.x  * rate_err_d->p +
     GAIN_PRESCALER_I * gains->i.x  * sum_err->qx;
 
   fb_commands[COMMAND_PITCH] = 
     GAIN_PRESCALER_P * -gains->p.y  * att_err->qy + 
     GAIN_PRESCALER_D * gains->d.y  * rate_err->q +
+    GAIN_PRESCALER_D * gains->rates_d.y  * rate_err_d->q +
     GAIN_PRESCALER_I * gains->i.y  * sum_err->qy;
   
   fb_commands[COMMAND_YAW] = 
     GAIN_PRESCALER_P * -gains->p.z  * att_err->qz +
     GAIN_PRESCALER_D * gains->d.z  * rate_err->r +
+    GAIN_PRESCALER_D * gains->rates_d.z  * rate_err_d->r +
     GAIN_PRESCALER_I * gains->i.z  * sum_err->qz;
 
+  fb_commands[COMMAND_ROLL_SURFACE] = 
+    GAIN_PRESCALER_P * -gains->surface_p.x  * att_err->qx +
+    GAIN_PRESCALER_D * gains->surface_d.x  * rate_err->p +
+    GAIN_PRESCALER_I * gains->surface_i.x  * sum_err->qx;
+
+  fb_commands[COMMAND_PITCH_SURFACE] = 
+    GAIN_PRESCALER_P * -gains->surface_p.y  * att_err->qy +
+    GAIN_PRESCALER_D * gains->surface_d.y  * rate_err->q +
+    GAIN_PRESCALER_I * gains->surface_i.y  * sum_err->qy;
+
   fb_commands[COMMAND_YAW_SURFACE] = 
     GAIN_PRESCALER_P * -gains->surface_p.z  * att_err->qz +
     GAIN_PRESCALER_D * gains->surface_d.z  * rate_err->r +
@@ -190,7 +211,7 @@
 
   attitude_run_ff(booz_stabilization_att_ff_cmd, 
&booz_stabilization_gains[gain_idx], &booz_stab_att_ref_accel);
 
-  attitude_run_fb(booz_stabilization_att_fb_cmd, 
&booz_stabilization_gains[gain_idx], &att_err, &rate_err, 
&booz_stabilization_att_sum_err_quat);
+  attitude_run_fb(booz_stabilization_att_fb_cmd, 
&booz_stabilization_gains[gain_idx], &att_err, &rate_err, 
&booz_ahrs_float.body_rate_d, &booz_stabilization_att_sum_err_quat);
 
   for (int i = COMMAND_ROLL; i <= COMMAND_YAW_SURFACE; i++) {
        booz_stabilization_cmd[i] = 
booz_stabilization_att_fb_cmd[i]+booz_stabilization_att_ff_cmd[i];

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_float.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_float.h
     2010-07-09 05:24:58 UTC (rev 5034)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_float.h
     2010-07-09 05:41:34 UTC (rev 5035)
@@ -23,6 +23,8 @@
 #ifndef BOOZ_STABILISATION_ATTITUDE_REF_FLOAT_H
 #define BOOZ_STABILISATION_ATTITUDE_REF_FLOAT_H
 
+#include "airframe.h"
+
 extern struct FloatEulers booz_stab_att_sp_euler;
 extern struct FloatQuat   booz_stab_att_sp_quat;
 extern struct FloatEulers booz_stab_att_ref_euler;
@@ -31,15 +33,11 @@
 extern struct FloatRates  booz_stab_att_ref_accel;
 
 struct FloatRefModel {
-  float omega_p;
-  float zeta_p;
-  float omega_q;
-  float zeta_q;
-  float omega_r;
-  float zeta_r;
+  struct FloatRates omega;
+  struct FloatRates zeta;
 };
 
-extern struct FloatRefModel booz_stab_att_ref_model;
+extern struct FloatRefModel booz_stab_att_ref_model[];
 
 #endif /* BOOZ_STABILISATION_ATTITUDE_REF_FLOAT_H */
 

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
        2010-07-09 05:24:58 UTC (rev 5034)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
        2010-07-09 05:41:34 UTC (rev 5035)
@@ -26,6 +26,7 @@
  *
  */
 
+#include "airframe.h"
 #include "booz_stabilization.h"
 #include "booz_ahrs.h"
 
@@ -43,8 +44,17 @@
 struct FloatRates  booz_stab_att_ref_rate;
 struct FloatRates  booz_stab_att_ref_accel;
 
-struct FloatRefModel booz_stab_att_ref_model;
+struct FloatRefModel 
booz_stab_att_ref_model[BOOZ_STABILIZATION_ATTITUDE_GAIN_NB];
 
+static int ref_idx = BOOZ_STABILIZATION_ATTITUDE_GAIN_IDX_DEFAULT;
+
+static const float omega_p[] = BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_P;
+static const float zeta_p[] = BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_P;
+static const float omega_q[] = BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_Q;
+static const float zeta_q[] = BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_Q;
+static const float omega_r[] = BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_R;
+static const float zeta_r[] = BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_R;
+
 static void reset_psi_ref_from_body(void) {
     booz_stab_att_ref_euler.psi = booz_ahrs_float.ltp_to_body_euler.psi;
     booz_stab_att_ref_rate.r = 0;
@@ -72,15 +82,18 @@
   FLOAT_RATES_ZERO( booz_stab_att_ref_rate);
   FLOAT_RATES_ZERO( booz_stab_att_ref_accel);
 
-  booz_stab_att_ref_model.omega_p = BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_P;
-  booz_stab_att_ref_model.zeta_p = BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_P;
-  booz_stab_att_ref_model.omega_q = BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_Q;
-  booz_stab_att_ref_model.zeta_q = BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_Q;
-  booz_stab_att_ref_model.omega_r = BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_R;
-  booz_stab_att_ref_model.zeta_r = BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_R;
+  for (int i = 0; i < BOOZ_STABILIZATION_ATTITUDE_GAIN_NB; i++) {
+    RATES_ASSIGN(booz_stab_att_ref_model[i].omega, omega_p[i], omega_q[i], 
omega_r[i]);
+    RATES_ASSIGN(booz_stab_att_ref_model[i].zeta, zeta_p[i], zeta_q[i], 
zeta_r[i]);
+  }
 
 }
 
+void booz_stabilization_attitude_ref_schedule(uint8_t idx)
+{
+  ref_idx = idx;
+}
+
 void booz_stabilization_attitude_ref_enter()
 {
   reset_psi_ref_from_body();
@@ -118,12 +131,12 @@
   /* wrap it in the shortest direction       */
   FLOAT_QUAT_WRAP_SHORTEST(err);
   /* propagate the 2nd order linear model    */
-  booz_stab_att_ref_accel.p = 
-2.*booz_stab_att_ref_model.zeta_p*booz_stab_att_ref_model.omega_p*booz_stab_att_ref_rate.p
 
-    - booz_stab_att_ref_model.omega_p*booz_stab_att_ref_model.omega_p*err.qx;
-  booz_stab_att_ref_accel.q = 
-2.*booz_stab_att_ref_model.zeta_q*booz_stab_att_ref_model.omega_q*booz_stab_att_ref_rate.q
 
-    - booz_stab_att_ref_model.omega_q*booz_stab_att_ref_model.omega_q*err.qy;
-  booz_stab_att_ref_accel.r = 
-2.*booz_stab_att_ref_model.zeta_r*booz_stab_att_ref_model.omega_r*booz_stab_att_ref_rate.r
 
-    - booz_stab_att_ref_model.omega_r*booz_stab_att_ref_model.omega_r*err.qz;
+  booz_stab_att_ref_accel.p = 
-2.*booz_stab_att_ref_model[ref_idx].zeta.p*booz_stab_att_ref_model[ref_idx].omega.p*booz_stab_att_ref_rate.p
 
+    - 
booz_stab_att_ref_model[ref_idx].omega.p*booz_stab_att_ref_model[ref_idx].omega.p*err.qx;
+  booz_stab_att_ref_accel.q = 
-2.*booz_stab_att_ref_model[ref_idx].zeta.q*booz_stab_att_ref_model[ref_idx].omega.q*booz_stab_att_ref_rate.q
 
+    - 
booz_stab_att_ref_model[ref_idx].omega.q*booz_stab_att_ref_model[ref_idx].omega.q*err.qy;
+  booz_stab_att_ref_accel.r = 
-2.*booz_stab_att_ref_model[ref_idx].zeta.r*booz_stab_att_ref_model[ref_idx].omega.r*booz_stab_att_ref_rate.r
 
+    - 
booz_stab_att_ref_model[ref_idx].omega.r*booz_stab_att_ref_model[ref_idx].omega.r*err.qz;
 
   /*   saturate acceleration */
   const struct FloatRates MIN_ACCEL = { -REF_ACCEL_MAX_P, -REF_ACCEL_MAX_Q, 
-REF_ACCEL_MAX_R };

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.h
        2010-07-09 05:24:58 UTC (rev 5034)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.h
        2010-07-09 05:41:34 UTC (rev 5035)
@@ -31,13 +31,14 @@
 #include "stabilization/booz_stabilization_attitude_ref_float.h"
 
 #define RC_UPDATE_FREQ 40.
-#define ROLL_COEF  (-BOOZ_STABILIZATION_ATTITUDE_SP_MAX_PHI   / MAX_PPRZ)
+#define ROLL_COEF   (BOOZ_STABILIZATION_ATTITUDE_SP_MAX_P     / MAX_PPRZ)
+#define ROLL_COEF_H  (BOOZ_STABILIZATION_ATTITUDE_SP_MAX_P_H     / MAX_PPRZ)
 #define PITCH_COEF ( BOOZ_STABILIZATION_ATTITUDE_SP_MAX_THETA / MAX_PPRZ)
-#define YAW_COEF   (-BOOZ_STABILIZATION_ATTITUDE_SP_MAX_R     / MAX_PPRZ)
-#define YAW_COEF_H  (-BOOZ_STABILIZATION_ATTITUDE_SP_MAX_H_R     / MAX_PPRZ)
+#define YAW_COEF  (BOOZ_STABILIZATION_ATTITUDE_SP_MAX_PSI   / MAX_PPRZ)
 
 #define ROLL_COEF_RATE  (-BOOZ_STABILIZATION_ATTITUDE_SP_MAX_P   / MAX_PPRZ)
 #define PITCH_COEF_RATE ( BOOZ_STABILIZATION_ATTITUDE_SP_MAX_Q / MAX_PPRZ)
+#define YAW_COEF_RATE ( BOOZ_STABILIZATION_ATTITUDE_SP_MAX_R / MAX_PPRZ)
 
 #define DEADBAND_EXCEEDED(VARIABLE, VALUE) ((VARIABLE > VALUE) || (VARIABLE < 
-VALUE))
 #define APPLY_DEADBAND(VARIABLE, VALUE) (DEADBAND_EXCEEDED(VARIABLE, VALUE) ? 
VARIABLE : 0.0)
@@ -53,5 +54,6 @@
    radio_control.values[RADIO_CONTROL_YAW] < 
-BOOZ_STABILIZATION_ATTITUDE_DEADBAND_R)
 
 void booz_stabilization_attitude_ref_enter(void);
+void booz_stabilization_attitude_ref_schedule(uint8_t idx);
 
 #endif /* BOOZ_STABILIZATION_ATTITUDE_REF_QUAT_FLOAT_H */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]