paparazzi-commits
[Top][All Lists]
Advanced

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

[paparazzi-commits] [4820] Clean up booz_stabilization_attitude_quat_flo


From: Allen Ibara
Subject: [paparazzi-commits] [4820] Clean up booz_stabilization_attitude_quat_float. c by removing plenty of junk from it and pushing said bits down into ref or setpoint
Date: Tue, 20 Apr 2010 03:37:56 +0000

Revision: 4820
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4820
Author:   aibara
Date:     2010-04-20 03:37:55 +0000 (Tue, 20 Apr 2010)
Log Message:
-----------
Clean up booz_stabilization_attitude_quat_float.c by removing plenty of junk 
from it and pushing said bits down into ref or setpoint
generation, or elsewhere entirely.

Also move all of booz_stabilization gains into a single struct (potentially 
useful for gain scheduling or other hackery)

Modified Paths:
--------------
    paparazzi3/trunk/conf/settings/settings_booz2.xml
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_float.c
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_int.c
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_int.h
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
    
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/conf/settings/settings_booz2.xml
===================================================================
--- paparazzi3/trunk/conf/settings/settings_booz2.xml   2010-04-20 03:34:53 UTC 
(rev 4819)
+++ paparazzi3/trunk/conf/settings/settings_booz2.xml   2010-04-20 03:37:55 UTC 
(rev 4820)
@@ -29,18 +29,18 @@
 
 
     <dl_settings NAME="Att Loop">
-      <dl_setting var="booz_stabilization_pgain.x" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="pgain 
phi" />
-      <dl_setting var="booz_stabilization_dgain.x" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="dgain 
p"/>
-      <dl_setting var="booz_stabilization_igain.x" min="-300"  step="1" 
max="0"    module="stabilization/booz_stabilization_attitude" shortname="igain 
phi" handler="SetKiPhi"/>
-      <dl_setting var="booz_stabilization_ddgain.x" min="0"    step="1" 
max="1000" module="stabilization/booz_stabilization_attitude" shortname="ddgain 
p"/>
-      <dl_setting var="booz_stabilization_pgain.y" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="pgain 
theta"/>
-      <dl_setting var="booz_stabilization_dgain.y" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="dgain 
q"/>
-      <dl_setting var="booz_stabilization_igain.y" min="-300"  step="1" 
max="0"    module="stabilization/booz_stabilization_attitude" shortname="igain 
theta"/>
-      <dl_setting var="booz_stabilization_ddgain.y" min="0"    step="1" 
max="500"  module="stabilization/booz_stabilization_attitude" shortname="ddgain 
q"/>
-      <dl_setting var="booz_stabilization_pgain.z" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="pgain 
psi"/>
-      <dl_setting var="booz_stabilization_dgain.z" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="dgain 
r"/>
-      <dl_setting var="booz_stabilization_igain.z" min="-300"  step="1" 
max="0"    module="stabilization/booz_stabilization_attitude" shortname="igain 
psi"/>
-      <dl_setting var="booz_stabilization_ddgain.z" min="0"    step="1" 
max="2000"  module="stabilization/booz_stabilization_attitude" 
shortname="ddgain r"/>
+      <dl_setting var="booz_stabilization_gains.p.x" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="pgain 
phi" />
+      <dl_setting var="booz_stabilization_gains.d.x" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="dgain 
p"/>
+      <dl_setting var="booz_stabilization_gains.i.x" min="-300"  step="1" 
max="0"    module="stabilization/booz_stabilization_attitude" shortname="igain 
phi" handler="SetKiPhi"/>
+      <dl_setting var="booz_stabilization_gains.dd.x" min="0"    step="1" 
max="1000" module="stabilization/booz_stabilization_attitude" shortname="ddgain 
p"/>
+      <dl_setting var="booz_stabilization_gains.p.y" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="pgain 
theta"/>
+      <dl_setting var="booz_stabilization_gains.d.y" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="dgain 
q"/>
+      <dl_setting var="booz_stabilization_gains.i.y" min="-300"  step="1" 
max="0"    module="stabilization/booz_stabilization_attitude" shortname="igain 
theta"/>
+      <dl_setting var="booz_stabilization_gains.dd.y" min="0"    step="1" 
max="500"  module="stabilization/booz_stabilization_attitude" shortname="ddgain 
q"/>
+      <dl_setting var="booz_stabilization_gains.p.z" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="pgain 
psi"/>
+      <dl_setting var="booz_stabilization_gains.d.z" min="-4000" step="1" 
max="-1"   module="stabilization/booz_stabilization_attitude" shortname="dgain 
r"/>
+      <dl_setting var="booz_stabilization_gains.i.z" min="-300"  step="1" 
max="0"    module="stabilization/booz_stabilization_attitude" shortname="igain 
psi"/>
+      <dl_setting var="booz_stabilization_gains.dd.z" min="0"    step="1" 
max="2000"  module="stabilization/booz_stabilization_attitude" 
shortname="ddgain r"/>
     </dl_settings>
 
     <dl_settings NAME="Vert Loop">

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h   
    2010-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h   
    2010-04-20 03:37:55 UTC (rev 4820)
@@ -1,3 +1,4 @@
+
 /*
  * $Id$
  *  
@@ -38,25 +39,8 @@
 extern void booz_stabilization_attitude_ref_init(void);
 extern void booz_stabilization_attitude_ref_update(void);
 
-extern float booz_stabilization_attitude_beta_vane_gain;
-extern float booz_stabilization_attitude_alpha_vane_gain;
-
-extern float booz_stabilization_attitude_alpha_alt_dgain;
-extern float booz_stabilization_attitude_alpha_alt_pgain;
-
-extern float booz_stabilization_attitude_pitch_wish;
-
-extern float booz_stabilization_att_ff_adap_gain[COMMANDS_NB];
-extern float booz_stabilization_att_ff_gain_wish[COMMANDS_NB];
-extern float booz_stab_att_ff_lambda;
-extern float booz_stab_att_ff_alpha0;
-extern float booz_stab_att_ff_k0;
-extern float booz_stab_att_ff_update_min;
-extern float booz_stab_att_ff_update_max;
-
-
 #define booz_stabilization_attitude_SetKiPhi(_val) {   \
-    booz_stabilization_igain.x = _val;                 \
+    booz_stabilization_gains.i.x = _val;                       \
     booz_stabilization_att_sum_err.phi = 0;            \
   }
 

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_float.c
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_float.c
   2010-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_float.c
   2010-04-20 03:37:55 UTC (rev 4820)
@@ -30,10 +30,7 @@
 #include "airframe.h"
 
 
-struct FloatVect3  booz_stabilization_pgain;
-struct FloatVect3  booz_stabilization_dgain;
-struct FloatVect3  booz_stabilization_ddgain;
-struct FloatVect3  booz_stabilization_igain;
+struct FloatAttitudeGains booz_stabilization_gains;
 struct FloatEulers booz_stabilization_att_sum_err;
 
 float booz_stabilization_att_fb_cmd[COMMANDS_NB];
@@ -44,22 +41,22 @@
 
   booz_stabilization_attitude_ref_init();
 
-  VECT3_ASSIGN(booz_stabilization_pgain,
+  VECT3_ASSIGN(booz_stabilization_gains.p,
               BOOZ_STABILIZATION_ATTITUDE_PHI_PGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_PGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_PGAIN);
   
-  VECT3_ASSIGN(booz_stabilization_dgain,
+  VECT3_ASSIGN(booz_stabilization_gains.d,
               BOOZ_STABILIZATION_ATTITUDE_PHI_DGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_DGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_DGAIN);
   
-  VECT3_ASSIGN(booz_stabilization_igain,
+  VECT3_ASSIGN(booz_stabilization_gains.i,
               BOOZ_STABILIZATION_ATTITUDE_PHI_IGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_IGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_IGAIN);
 
-  VECT3_ASSIGN(booz_stabilization_ddgain,
+  VECT3_ASSIGN(booz_stabilization_gains.dd,
               BOOZ_STABILIZATION_ATTITUDE_PHI_DDGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_DDGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_DDGAIN);
@@ -92,11 +89,11 @@
 
   /* Compute feedforward */
   booz_stabilization_att_ff_cmd[COMMAND_ROLL] = 
-    booz_stabilization_ddgain.x * booz_stab_att_ref_accel.p / 32.;
+    booz_stabilization_gains.dd.x * booz_stab_att_ref_accel.p / 32.;
   booz_stabilization_att_ff_cmd[COMMAND_PITCH] = 
-    booz_stabilization_ddgain.y * booz_stab_att_ref_accel.q / 32.;
+    booz_stabilization_gains.dd.y * booz_stab_att_ref_accel.q / 32.;
   booz_stabilization_att_ff_cmd[COMMAND_YAW] = 
-    booz_stabilization_ddgain.z * booz_stab_att_ref_accel.r / 32.;
+    booz_stabilization_gains.dd.z * booz_stab_att_ref_accel.r / 32.;
 
   /* Compute feedback                  */
   /* attitude error            */
@@ -124,19 +121,19 @@
   /*  PID                  */
 
   booz_stabilization_att_fb_cmd[COMMAND_ROLL] = 
-    booz_stabilization_pgain.x  * att_err.phi +
-    booz_stabilization_dgain.x  * rate_err.p +
-    booz_stabilization_igain.x  * booz_stabilization_att_sum_err.phi / 1024.;
+    booz_stabilization_gains.p.x  * att_err.phi +
+    booz_stabilization_gains.d.x  * rate_err.p +
+    booz_stabilization_gains.i.x  * booz_stabilization_att_sum_err.phi / 1024.;
 
   booz_stabilization_att_fb_cmd[COMMAND_PITCH] = 
-    booz_stabilization_pgain.y  * att_err.theta +
-    booz_stabilization_dgain.y  * rate_err.q +
-    booz_stabilization_igain.y  * booz_stabilization_att_sum_err.theta / 1024.;
+    booz_stabilization_gains.p.y  * att_err.theta +
+    booz_stabilization_gains.d.y  * rate_err.q +
+    booz_stabilization_gains.i.y  * booz_stabilization_att_sum_err.theta / 
1024.;
 
   booz_stabilization_att_fb_cmd[COMMAND_YAW] = 
-    booz_stabilization_pgain.z  * att_err.psi +
-    booz_stabilization_dgain.z  * rate_err.r +
-    booz_stabilization_igain.z  * booz_stabilization_att_sum_err.psi / 1024.;
+    booz_stabilization_gains.p.z  * att_err.psi +
+    booz_stabilization_gains.d.z  * rate_err.r +
+    booz_stabilization_gains.i.z  * booz_stabilization_att_sum_err.psi / 1024.;
 
 
   booz_stabilization_cmd[COMMAND_ROLL] = 

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_int.c
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_int.c
     2010-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_euler_int.c
     2010-04-20 03:37:55 UTC (rev 4820)
@@ -29,10 +29,8 @@
 
 #include "airframe.h"
 
-struct Int32Vect3  booz_stabilization_pgain;
-struct Int32Vect3  booz_stabilization_dgain;
-struct Int32Vect3  booz_stabilization_ddgain;
-struct Int32Vect3  booz_stabilization_igain;
+struct Int32AttitudeGains  booz_stabilization_gains;
+
 struct Int32Eulers booz_stabilization_att_sum_err;
 
 int32_t booz_stabilization_att_fb_cmd[COMMANDS_NB];
@@ -43,22 +41,22 @@
   booz_stabilization_attitude_ref_init();
   
  
-  VECT3_ASSIGN(booz_stabilization_pgain,
+  VECT3_ASSIGN(booz_stabilization_gains.p,
               BOOZ_STABILIZATION_ATTITUDE_PHI_PGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_PGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_PGAIN);
   
-  VECT3_ASSIGN(booz_stabilization_dgain,
+  VECT3_ASSIGN(booz_stabilization_gains.d,
               BOOZ_STABILIZATION_ATTITUDE_PHI_DGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_DGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_DGAIN);
   
-  VECT3_ASSIGN(booz_stabilization_igain,
+  VECT3_ASSIGN(booz_stabilization_gains.i,
               BOOZ_STABILIZATION_ATTITUDE_PHI_IGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_IGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_IGAIN);
 
-  VECT3_ASSIGN(booz_stabilization_ddgain,
+  VECT3_ASSIGN(booz_stabilization_gains.dd,
               BOOZ_STABILIZATION_ATTITUDE_PHI_DDGAIN,
               BOOZ_STABILIZATION_ATTITUDE_THETA_DDGAIN,
               BOOZ_STABILIZATION_ATTITUDE_PSI_DDGAIN);
@@ -97,11 +95,11 @@
 
   /* compute feedforward command */
   booz_stabilization_att_ff_cmd[COMMAND_ROLL] = 
-    OFFSET_AND_ROUND(booz_stabilization_ddgain.x * booz_stab_att_ref_accel.p, 
5);
+    OFFSET_AND_ROUND(booz_stabilization_gains.dd.x * 
booz_stab_att_ref_accel.p, 5);
   booz_stabilization_att_ff_cmd[COMMAND_PITCH] = 
-    OFFSET_AND_ROUND(booz_stabilization_ddgain.y * booz_stab_att_ref_accel.q, 
5);
+    OFFSET_AND_ROUND(booz_stabilization_gains.dd.y * 
booz_stab_att_ref_accel.q, 5);
   booz_stabilization_att_ff_cmd[COMMAND_YAW] = 
-    OFFSET_AND_ROUND(booz_stabilization_ddgain.z * booz_stab_att_ref_accel.r, 
5);
+    OFFSET_AND_ROUND(booz_stabilization_gains.dd.z * 
booz_stab_att_ref_accel.r, 5);
 
   /* compute feedback command */
   /* attitude error            */
@@ -132,19 +130,19 @@
 
   /* PID                  */
   booz_stabilization_att_fb_cmd[COMMAND_ROLL] = 
-    booz_stabilization_pgain.x    * att_err.phi +
-    booz_stabilization_dgain.x    * rate_err.p +
-    OFFSET_AND_ROUND2((booz_stabilization_igain.x  * 
booz_stabilization_att_sum_err.phi), 10);
+    booz_stabilization_gains.p.x    * att_err.phi +
+    booz_stabilization_gains.d.x    * rate_err.p +
+    OFFSET_AND_ROUND2((booz_stabilization_gains.i.x  * 
booz_stabilization_att_sum_err.phi), 10);
 
   booz_stabilization_att_fb_cmd[COMMAND_PITCH] = 
-    booz_stabilization_pgain.y    * att_err.theta +
-    booz_stabilization_dgain.y    * rate_err.q +
-    OFFSET_AND_ROUND2((booz_stabilization_igain.y  * 
booz_stabilization_att_sum_err.theta), 10);
+    booz_stabilization_gains.p.y    * att_err.theta +
+    booz_stabilization_gains.d.y    * rate_err.q +
+    OFFSET_AND_ROUND2((booz_stabilization_gains.i.y  * 
booz_stabilization_att_sum_err.theta), 10);
 
   booz_stabilization_att_fb_cmd[COMMAND_YAW] = 
-    booz_stabilization_pgain.z    * att_err.psi +
-    booz_stabilization_dgain.z    * rate_err.r +
-    OFFSET_AND_ROUND2((booz_stabilization_igain.z  * 
booz_stabilization_att_sum_err.psi), 10);
+    booz_stabilization_gains.p.z    * att_err.psi +
+    booz_stabilization_gains.d.z    * rate_err.r +
+    OFFSET_AND_ROUND2((booz_stabilization_gains.i.z  * 
booz_stabilization_att_sum_err.psi), 10);
     
   /* sum feedforward and feedback */
   booz_stabilization_cmd[COMMAND_ROLL] = 

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
 2010-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_float.h
 2010-04-20 03:37:55 UTC (rev 4820)
@@ -28,14 +28,24 @@
 
 #include "airframe.h"
 
-extern struct FloatVect3  booz_stabilization_pgain;
-extern struct FloatVect3  booz_stabilization_dgain;
-extern struct FloatVect3  booz_stabilization_ddgain;
-extern struct FloatVect3  booz_stabilization_igain;
-extern struct FloatEulers booz_stabilization_att_sum_err;
+struct FloatAttitudeGains {
+       struct FloatVect3  p;
+       struct FloatVect3  d;
+       struct FloatVect3  dd;
+       struct FloatVect3  i;
+       struct FloatVect3  surface_p;
+       struct FloatVect3  surface_d;
+       struct FloatVect3  surface_dd;
+       struct FloatVect3  surface_i;
+};
 
+extern struct FloatAttitudeGains booz_stabilization_gains[];
+extern struct FloatEulers booz_stabilization_att_sum_err_eulers;
+
 extern float booz_stabilization_att_fb_cmd[COMMANDS_NB];
 extern float booz_stabilization_att_ff_cmd[COMMANDS_NB];
 
+void booz_stabilization_attitude_gain_schedule(uint8_t idx);
+
 #endif /* BOOZ_STABILIZATION_ATTITUDE_FLOAT_H */
 

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_int.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_int.h
   2010-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_int.h
   2010-04-20 03:37:55 UTC (rev 4820)
@@ -28,10 +28,14 @@
 
 #include "airframe.h"
 
-extern struct Int32Vect3  booz_stabilization_igain;
-extern struct Int32Vect3  booz_stabilization_pgain;
-extern struct Int32Vect3  booz_stabilization_dgain;
-extern struct Int32Vect3  booz_stabilization_ddgain;
+struct Int32AttitudeGains {
+       struct Int32Vect3  p;
+       struct Int32Vect3  d;
+       struct Int32Vect3  dd;
+       struct Int32Vect3  i;
+};
+
+extern struct Int32AttitudeGains  booz_stabilization_gains;
 extern struct Int32Eulers booz_stabilization_att_sum_err;
 
 extern int32_t booz_stabilization_att_fb_cmd[COMMANDS_NB];

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-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
    2010-04-20 03:37:55 UTC (rev 4820)
@@ -1,5 +1,5 @@
 /*
- * $Id: booz_stabilization_attitude_euler.c 3787 2009-07-24 15:33:54Z poine $
+ * $Id: booz_stabilization_attitude_quat_float.c 3787 2009-07-24 15:33:54Z 
poine $
  *  
  * Copyright (C) 2008-2009 Antoine Drouin <address@hidden>
  *
@@ -21,445 +21,139 @@
  * Boston, MA 02111-1307, USA. 
  */
 
+/** \file booz_stabilization_attitude_quat_float.c
+ * \brief Booz quaternion attitude stabilization
+ */
+
 #include "booz_stabilization.h"
 
+#include <stdio.h>
 #include "math/pprz_algebra_float.h"
 #include "math/pprz_algebra_int.h"
 #include "booz_ahrs.h"
-#include "booz_radio_control.h"
 #include "airframe.h"
 
+struct FloatAttitudeGains 
booz_stabilization_gains[BOOZ_STABILIZATION_ATTITUDE_GAIN_NB];
 
-struct FloatVect3  booz_stabilization_pgain;
-struct FloatVect3  booz_stabilization_dgain;
-struct FloatVect3  booz_stabilization_ddgain;
-struct FloatVect3  booz_stabilization_igain;
-struct FloatQuat   booz_stabilization_sum_err;
-struct FloatEulers booz_stabilization_att_sum_err;
+struct FloatQuat booz_stabilization_att_sum_err_quat;
+struct FloatEulers booz_stabilization_att_sum_err_eulers;
 
 float booz_stabilization_att_fb_cmd[COMMANDS_NB];
 float booz_stabilization_att_ff_cmd[COMMANDS_NB];
 
-float booz_stabilization_attitude_beta_vane_gain;
-float booz_stabilization_attitude_alpha_vane_gain;
+static int gain_idx = BOOZ_STABILIZATION_ATTITUDE_GAIN_IDX_DEFAULT;
 
-float booz_stabilization_attitude_alpha_alt_dgain;
-float booz_stabilization_attitude_alpha_alt_pgain;
+static const float phi_pgain[] = BOOZ_STABILIZATION_ATTITUDE_PHI_PGAIN;
+static const float theta_pgain[] = BOOZ_STABILIZATION_ATTITUDE_THETA_PGAIN;
+static const float psi_pgain[] = BOOZ_STABILIZATION_ATTITUDE_PSI_PGAIN;
 
-float booz_stabilization_attitude_pitch_wish;
+static const float phi_dgain[] = BOOZ_STABILIZATION_ATTITUDE_PHI_DGAIN;
+static const float theta_dgain[] = BOOZ_STABILIZATION_ATTITUDE_THETA_DGAIN;
+static const float psi_dgain[] = BOOZ_STABILIZATION_ATTITUDE_PSI_DGAIN;
 
-float booz_stabilization_att_ff_adap_gain[COMMANDS_NB];
-float booz_stabilization_att_ff_gain_wish[COMMANDS_NB];
-float booz_stab_att_ff_lambda;
-float booz_stab_att_ff_alpha0;
-float booz_stab_att_ff_k0;
-float booz_stab_att_ff_update_min;
-float booz_stab_att_ff_update_max;
+static const float phi_igain[] = BOOZ_STABILIZATION_ATTITUDE_PHI_IGAIN;
+static const float theta_igain[] = BOOZ_STABILIZATION_ATTITUDE_THETA_IGAIN;
+static const float psi_igain[] = BOOZ_STABILIZATION_ATTITUDE_PSI_IGAIN;
 
-#ifdef USE_VANE
-static float beta_vane_stick_cmd = 0;
-static struct FloatQuat alpha_setpoint_quat = { 1., 0., 0., 0. };
-static float alpha_error = 0;
-#endif // USE_VANE
+static const float phi_ddgain[] = BOOZ_STABILIZATION_ATTITUDE_PHI_DDGAIN;
+static const float theta_ddgain[] = BOOZ_STABILIZATION_ATTITUDE_THETA_DDGAIN;
+static const float psi_ddgain[] = BOOZ_STABILIZATION_ATTITUDE_PSI_DDGAIN;
 
-void booz_stabilization_attitude_init(void) {
+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;
 
-  booz_stabilization_attitude_ref_init();
+static const float phi_dgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PHI_DGAIN_SURFACE;
+static const float theta_dgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_THETA_DGAIN_SURFACE;
+static const float psi_dgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PSI_DGAIN_SURFACE;
 
-  VECT3_ASSIGN(booz_stabilization_pgain,
-              BOOZ_STABILIZATION_ATTITUDE_PHI_PGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_THETA_PGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_PSI_PGAIN);
-  
-  VECT3_ASSIGN(booz_stabilization_dgain,
-              BOOZ_STABILIZATION_ATTITUDE_PHI_DGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_THETA_DGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_PSI_DGAIN);
-  
-  VECT3_ASSIGN(booz_stabilization_igain,
-              BOOZ_STABILIZATION_ATTITUDE_PHI_IGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_THETA_IGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_PSI_IGAIN);
+static const float phi_igain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PHI_IGAIN_SURFACE;
+static const float theta_igain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_THETA_IGAIN_SURFACE;
+static const float psi_igain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PSI_IGAIN_SURFACE;
 
-  VECT3_ASSIGN(booz_stabilization_ddgain,
-              BOOZ_STABILIZATION_ATTITUDE_PHI_DDGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_THETA_DDGAIN,
-              BOOZ_STABILIZATION_ATTITUDE_PSI_DDGAIN);
+static const float phi_ddgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PHI_DDGAIN_SURFACE;
+static const float theta_ddgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_THETA_DDGAIN_SURFACE;
+static const float psi_ddgain_surface[] = 
BOOZ_STABILIZATION_ATTITUDE_PSI_DDGAIN_SURFACE;
 
-  FLOAT_QUAT_ZERO( booz_stabilization_sum_err );
-  FLOAT_EULERS_ZERO( booz_stabilization_att_sum_err );
+#define IERROR_SCALE 1024
 
-#ifdef USE_VANE
-  booz_stabilization_attitude_alpha_vane_gain = 
BOOZ_STABILIZATION_ATTITUDE_ALPHA_VANE_T;
-  booz_stabilization_attitude_beta_vane_gain = 
BOOZ_STABILIZATION_ATTITUDE_BETA_VANE_T;
-  booz_stabilization_attitude_alpha_alt_dgain = booz_stabilization_dgain.y;
-  booz_stabilization_attitude_alpha_alt_pgain = booz_stabilization_pgain.y/4;
-#endif
+void booz_stabilization_attitude_init(void) {
 
-  booz_stabilization_att_ff_adap_gain[COMMAND_ROLL] = 0.001;
-  booz_stabilization_att_ff_adap_gain[COMMAND_PITCH] = 0.001;
-  booz_stabilization_att_ff_adap_gain[COMMAND_YAW] = 0.001;
+  booz_stabilization_attitude_ref_init();
 
-  booz_stabilization_att_ff_gain_wish[COMMAND_ROLL] = 550;
-  booz_stabilization_att_ff_gain_wish[COMMAND_PITCH] = 400;
-  booz_stabilization_att_ff_gain_wish[COMMAND_YAW] = 300;
+  for (int i = 0; i < BOOZ_STABILIZATION_ATTITUDE_GAIN_NB; i++) {
+    VECT3_ASSIGN(booz_stabilization_gains[i].p, phi_pgain[i], theta_pgain[i], 
psi_pgain[i]);
+    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]);
+  }
 
-  booz_stab_att_ff_lambda = 0.05;
-  booz_stab_att_ff_alpha0 = 0.005;
-  booz_stab_att_ff_k0 = 10;
-  booz_stab_att_ff_update_min = 0.1;
-  booz_stab_att_ff_update_max = 500;
-
+  FLOAT_QUAT_ZERO( booz_stabilization_att_sum_err_quat );
+  FLOAT_EULERS_ZERO( booz_stabilization_att_sum_err_eulers );
 }
 
-static void reset_psi_ref_from_body(void) {
-    booz_stab_att_sp_euler.psi = booz_ahrs_float.ltp_to_body_euler.psi;
-    booz_stab_att_ref_euler.psi = booz_ahrs_float.ltp_to_body_euler.psi;
-    booz_stab_att_ref_rate.r = 0;
-    booz_stab_att_ref_accel.r = 0;
-}
-
-// Returns rotation about Y axis from dcm from -2 * pi to 2 * pi
-static float get_pitch_rotation_angle(struct FloatRMat *rmat)
+void booz_stabilization_attitude_gain_schedule(uint8_t idx)
 {
-  float dcm02 = rmat->m[2];
-  float dcm22 = rmat->m[8];
-
-  return -atan2f(dcm02, dcm22);
+       if (gain_idx >= BOOZ_STABILIZATION_ATTITUDE_GAIN_NB) {
+               // This could be bad -- Just say no.
+               return;
+       }
+       gain_idx = idx;
 }
 
+void booz_stabilization_attitude_enter(void) {
 
-// complicated function to reset setpoint quaternion to pitch theta, roll phi 
using provided
-// quaternion initial rotating first about pitch, then roll (and not yaw)
-static void reset_sp_quat(float phi, float theta, struct FloatQuat *initial)
-{
-  float pitch_rotation_angle, roll_rotation_angle;
-  struct FloatQuat pitch_axis_quat, roll_axis_quat;
-
-  struct FloatRMat ltp_to_body_rmat;
-
-  struct FloatQuat pitch_rotated_quat, roll_rotated_quat;
-
-  struct FloatVect3 x_axis = { 1, 0, 0 };
-  struct FloatVect3 y_axis = { 0, 1, 0 };
-
-  struct FloatEulers rotated_euler;
+  booz_stabilization_attitude_ref_enter();
   
-  // Convert body orientation to rotation matrix
-  FLOAT_RMAT_OF_QUAT(ltp_to_body_rmat, *initial);
-
-  // compose rotation about Y axis (pitch axis) to theta
-  pitch_rotation_angle = theta - get_pitch_rotation_angle(&ltp_to_body_rmat);
-  FLOAT_QUAT_OF_AXIS_ANGLE(pitch_axis_quat, y_axis, pitch_rotation_angle);
-  FLOAT_QUAT_COMP(pitch_rotated_quat, *initial, pitch_axis_quat);
-
-  // compose rotation about X axis (roll axis) to phi
-  FLOAT_EULERS_OF_QUAT(rotated_euler, pitch_rotated_quat);
-  roll_rotation_angle = phi - rotated_euler.phi;
-  FLOAT_QUAT_OF_AXIS_ANGLE(roll_axis_quat, x_axis, roll_rotation_angle);
-  FLOAT_QUAT_COMP(roll_rotated_quat, pitch_rotated_quat, roll_axis_quat);
-
-  // store result into setpoint
-  FLOAT_QUAT_COPY(booz_stab_att_sp_quat, roll_rotated_quat);
+  FLOAT_QUAT_ZERO( booz_stabilization_att_sum_err_quat );
+  FLOAT_EULERS_ZERO( booz_stabilization_att_sum_err_eulers );
 }
 
-static void update_sp_quat_from_eulers(void) {
-    struct FloatRMat sp_rmat;
-
-#ifdef STICKS_RMAT312
-    FLOAT_RMAT_OF_EULERS_312(sp_rmat, booz_stab_att_sp_euler);
-#else
-    FLOAT_RMAT_OF_EULERS_321(sp_rmat, booz_stab_att_sp_euler);
-#endif
-    FLOAT_QUAT_OF_RMAT(booz_stab_att_sp_quat, sp_rmat);
-}
-
-static void update_ref_quat_from_eulers(void) {
-    struct FloatRMat ref_rmat;
-
-#ifdef STICKS_RMAT312
-    FLOAT_RMAT_OF_EULERS_312(ref_rmat, booz_stab_att_ref_euler);
-#else
-    FLOAT_RMAT_OF_EULERS_321(ref_rmat, booz_stab_att_ref_euler);
-#endif
-    FLOAT_QUAT_OF_RMAT(booz_stab_att_ref_quat, ref_rmat);
-}
-
-#ifdef USE_VANE
-void booz_stabilization_attitude_read_beta_vane(float beta)
+static void attitude_run_ff(float ff_commands[], struct FloatAttitudeGains 
*gains, struct FloatRates *ref_accel)
 {
-  struct FloatEulers sticks_eulers;
-  struct FloatQuat sticks_quat, prev_sp_quat;
+  /* Compute feedforward based on reference acceleration */
 
-  sticks_eulers.phi = booz_stabilization_attitude_beta_vane_gain * beta / 
RC_UPDATE_FREQ;
-  sticks_eulers.theta = 0;
-  sticks_eulers.psi = 0;
-
-  beta_vane_stick_cmd = sticks_eulers.phi;
-
-  // convert eulers to quaternion
-  FLOAT_QUAT_OF_EULERS(sticks_quat, sticks_eulers);
-  FLOAT_QUAT_COPY(prev_sp_quat, booz_stab_att_sp_quat)
-  
-  // rotate previous setpoint by commanded rotation
-  FLOAT_QUAT_COMP(booz_stab_att_sp_quat, prev_sp_quat, sticks_quat);
+  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_YAW_SURFACE]   = GAIN_PRESCALER_FF * gains->surface_dd.z 
* ref_accel->r;
 }
 
-// when doing closed-loop angle of attack control, the pitch
-// setpoint is not based on a rate stick but on the AoA error.  
-void booz_stabilization_attitude_read_alpha_vane(float alpha)
+static void attitude_run_fb(float fb_commands[], struct FloatAttitudeGains 
*gains, struct FloatQuat *att_err,
+       struct FloatRates *rate_err, struct FloatQuat *sum_err)
 {
-  // argument alpha is error between measurement and setpoint, I believe
-  struct FloatVect3 y_axis = { 0, 1, 0 };
+  /*  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_I * gains->i.x  * sum_err->qx;
 
-  alpha_error = alpha;
-  FLOAT_QUAT_OF_AXIS_ANGLE(alpha_setpoint_quat, y_axis, alpha_error + 
booz_ahrs_float.ltp_to_body_euler.theta);
-}
-
-#endif
-
-void booz_stabilization_attitude_read_rc(bool_t in_flight) {
-
-  uint32_t rate_stick_mode = radio_control.values[RADIO_CONTROL_MODE] < -150;
-  static uint32_t last_rate_stick_mode;
-  pprz_t roll = radio_control.values[RADIO_CONTROL_ROLL];
-  pprz_t pitch = radio_control.values[RADIO_CONTROL_PITCH];
-  pprz_t yaw = radio_control.values[RADIO_CONTROL_YAW];
-  struct FloatEulers sticks_eulers;
-  struct FloatQuat sticks_quat, prev_sp_quat;
-
-#ifdef USE_VANE
-  struct FloatQuat setpoint_quat_old;
-  static int vane_transition = 0;
-  static float p_gain_y = 0;
-  static float d_gain_y = 0;
-#endif // USE_VANE
-
-  // convert sticks to commanded rates
-  sticks_eulers.phi = APPLY_DEADBAND(roll, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_A) * ROLL_COEF_RATE / RC_UPDATE_FREQ;
-  sticks_eulers.psi = APPLY_DEADBAND(yaw, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_R) * YAW_COEF_H / RC_UPDATE_FREQ;
-  sticks_eulers.theta = APPLY_DEADBAND(pitch, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_E) * PITCH_COEF_RATE / RC_UPDATE_FREQ;
-
-  // RC stick commands rate or position?
-  if (rate_stick_mode) {
-#ifdef USE_VANE
-    // is vane engaged?        
-    if (radio_control.values[RADIO_CONTROL_AUX4] < 0) {
-      sticks_eulers.theta = 0;
-
-      // generate new rotation based on current stick commands
-      if (radio_control.values[RADIO_CONTROL_UNUSED] < 0) {
-       sticks_eulers.phi = sticks_eulers.phi + beta_vane_stick_cmd;
-      }
-      FLOAT_QUAT_OF_EULERS(sticks_quat, sticks_eulers);
-
-      // if first time on the vane, set setpoint to existing attitude
-      if (vane_transition == 0) {
-
-       // new setpoint
-       FLOAT_QUAT_COPY(booz_stab_att_sp_quat, 
booz_ahrs_float.ltp_to_body_quat);
-
-       // store old gains
-       d_gain_y = booz_stabilization_dgain.y;
-       p_gain_y = booz_stabilization_pgain.y;
-       vane_transition = 1;
-      }
-
-      // swap in new D gain and reference model
-      booz_stabilization_dgain.y = booz_stabilization_attitude_alpha_alt_dgain;
-      booz_stabilization_pgain.y = booz_stabilization_attitude_alpha_alt_pgain;
-
-      // integrate stick commands in phi and psi
-      FLOAT_QUAT_COPY(setpoint_quat_old, booz_stab_att_sp_quat);
-      FLOAT_QUAT_COMP(booz_stab_att_sp_quat, setpoint_quat_old, sticks_quat);
-      
-      // make new trajectory setpoint
-    } else {
-      if (vane_transition == 1) {
-       // just switched out of vane mode
-       booz_stabilization_dgain.y = d_gain_y;
-       booz_stabilization_pgain.y = p_gain_y;
-       vane_transition = 0;
-      }
-#endif // USE_VANE
-      // convert eulers to quaternion
-      FLOAT_QUAT_OF_EULERS(sticks_quat, sticks_eulers);
-      FLOAT_QUAT_COPY(prev_sp_quat, booz_stab_att_sp_quat);
-      
-      // rotate previous setpoint by commanded rotation
-      FLOAT_QUAT_COMP(booz_stab_att_sp_quat, prev_sp_quat, sticks_quat);
-#ifdef USE_VANE
-    }
-#endif // USE_VANE
-  } else {
-    // First time switching from rate to position reset the setpoint based on 
the body
-    if (last_rate_stick_mode) {
-      reset_sp_quat(roll * ROLL_COEF, pitch * PITCH_COEF, 
&booz_ahrs_float.ltp_to_body_quat);
-    }
-#ifdef USE_VANE
-    if (vane_transition == 1) {
-      // just switched out of vane mode
-      booz_stabilization_dgain.y = d_gain_y;
-      booz_stabilization_pgain.y = p_gain_y;
-      vane_transition = 0;
-    }
-#endif // USE_VANE
-
-    // heading hold?
-    if (in_flight) {
-      // compose setpoint based on previous setpoint + pitch/roll sticks
-      reset_sp_quat(roll * ROLL_COEF, pitch * PITCH_COEF, 
&booz_stab_att_sp_quat);
-
-      // get commanded yaw rate from sticks
-      sticks_eulers.phi = 0;
-      sticks_eulers.theta = 0;
-      sticks_eulers.psi = APPLY_DEADBAND(yaw, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_R) * YAW_COEF / RC_UPDATE_FREQ;
-
-      // convert yaw rate * dt into quaternion
-      FLOAT_QUAT_OF_EULERS(sticks_quat, sticks_eulers);
-      FLOAT_QUAT_COPY(prev_sp_quat, booz_stab_att_sp_quat)
+  fb_commands[COMMAND_PITCH] = 
+    GAIN_PRESCALER_P * -gains->p.y  * att_err->qy + 
+    GAIN_PRESCALER_D * gains->d.y  * rate_err->q +
+    GAIN_PRESCALER_I * gains->i.y  * sum_err->qy;
   
-      // update setpoint by rotating by yaw command
-      FLOAT_QUAT_COMP(booz_stab_att_sp_quat, prev_sp_quat, sticks_quat);
-    } else { /* if not flying, use current body position + pitch/roll from 
sticks to compose setpoint */
-      reset_sp_quat(roll * ROLL_COEF, pitch * PITCH_COEF, 
&booz_ahrs_float.ltp_to_body_quat);
-    }
-  }
-  // update euler setpoints for telemetry
-  FLOAT_EULERS_OF_QUAT(booz_stab_att_sp_euler, booz_stab_att_sp_quat);
-  last_rate_stick_mode = rate_stick_mode;
-}
+  fb_commands[COMMAND_YAW] = 
+    GAIN_PRESCALER_P * -gains->p.z  * att_err->qz +
+    GAIN_PRESCALER_D * gains->d.z  * rate_err->r +
+    GAIN_PRESCALER_I * gains->i.z  * sum_err->qz;
 
+  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 +
+    GAIN_PRESCALER_I * gains->surface_i.z  * sum_err->qz;
 
-
-void booz_stabilization_attitude_enter(void) {
-
-  reset_psi_ref_from_body();
-  update_sp_quat_from_eulers();
-  update_ref_quat_from_eulers();
-  
-  FLOAT_EULERS_ZERO( booz_stabilization_att_sum_err );
-  FLOAT_QUAT_ZERO( booz_stabilization_sum_err );
-  
 }
 
-#define CMD_SCALE 0.0001
-
-static void booz_stabilization_attitude_ffgain_adap(void) {
-  static float miac_covariance_roll = 1;
-  static float miac_covariance_pitch = 1;
-  static float miac_covariance_yaw = 1;
-
-  static float miac_alpha_roll = 0.005;
-  static float miac_alpha_pitch = 0.005;
-  static float miac_alpha_yaw = 0.005;
+void booz_stabilization_attitude_run(bool_t enable_integrator) {
   
-  static float miac_command_roll = 0;
-  static float miac_command_pitch = 0;
-  static float miac_command_yaw = 0;
-
-  float update[COMMANDS_NB];
-
-  /* Roll */
-  /* Update the feedforward gains based on how well we can predict the
-     vehicle's response (MIAC); see Slotine Ch. 8.7-8 */
-  update[COMMAND_ROLL] = -1/miac_covariance_roll * miac_command_roll 
-    * (booz_ahrs_float.body_rate.p - miac_command_roll * 
booz_stabilization_att_ff_adap_gain[COMMAND_ROLL]);
-
-  /* Update the feedforward gains based on how well we have tracked
-     the reference trajectory (MRAC); see Slotine Ch. 8.2-4 */
-  update[COMMAND_ROLL] += CMD_SCALE * 
booz_stabilization_att_ff_adap_gain[COMMAND_ROLL] * 
-    copysign(booz_stabilization_att_fb_cmd[COMMAND_ROLL], 
-            booz_stabilization_att_fb_cmd[COMMAND_ROLL] * 
booz_stabilization_att_ff_cmd[COMMAND_ROLL]);
-
-  /* Update the gain for the MIAC adaptive controller.  This is a
-     crude approximation of the parameter error covariance. */
-  miac_covariance_roll += booz_ahrs_float.body_rate.p * 
booz_ahrs_float.body_rate.p 
-    - miac_alpha_roll * miac_covariance_roll;
-
-  /* Low-pass filter the axis commands so that we don't need to
-     measure rotational accelerations to learn the command-to-torque
-     coupling; see Slotine example 8.9 pg. 360 */
-  miac_command_roll = 
booz_stabilization_cmd[COMMAND_ROLL]*booz_stab_att_ff_lambda 
-    + miac_command_roll*(1 - booz_stab_att_ff_lambda);
-
-  /* Calculate a dynamic forgetting factor so we can learn faster when
-     signals are more persistently exciting; see Slotine 8.7.6 */
-  miac_alpha_roll = booz_stab_att_ff_alpha0 * (1 - 1/(booz_stab_att_ff_k0 * 
miac_covariance_roll));
-
-  /* Remove noisy and excessive updates and actually update the
-     feedforward gain */ 
-  if (fabs(update[COMMAND_ROLL]) < booz_stab_att_ff_update_min)
-    update[COMMAND_ROLL] = 0;
-  else if (fabs(update[COMMAND_ROLL]) > booz_stab_att_ff_update_max)
-    update[COMMAND_ROLL] = copysign(booz_stab_att_ff_update_max, 
update[COMMAND_ROLL]);
-  booz_stabilization_att_ff_gain_wish[COMMAND_ROLL] += update[COMMAND_ROLL];
-
-  /* Pitch */
-  update[COMMAND_PITCH] = -1/miac_covariance_pitch * miac_command_pitch 
-    * (booz_ahrs_float.body_rate.q - miac_command_pitch * 
booz_stabilization_att_ff_adap_gain[COMMAND_PITCH]);
-  update[COMMAND_PITCH] += CMD_SCALE * 
booz_stabilization_att_ff_adap_gain[COMMAND_PITCH] * 
-    copysign(booz_stabilization_att_fb_cmd[COMMAND_PITCH], 
-            booz_stabilization_att_fb_cmd[COMMAND_PITCH] * 
booz_stabilization_att_ff_cmd[COMMAND_PITCH]);
-  miac_covariance_pitch += booz_ahrs_float.body_rate.q * 
booz_ahrs_float.body_rate.q 
-    - miac_alpha_pitch * miac_covariance_pitch;
-  miac_command_pitch = 
booz_stabilization_cmd[COMMAND_PITCH]*booz_stab_att_ff_lambda 
-    + miac_command_pitch*(1 - booz_stab_att_ff_lambda);
-  miac_alpha_pitch = booz_stab_att_ff_alpha0 * (1 - 1/(booz_stab_att_ff_k0 * 
miac_covariance_pitch));
-  if (fabs(update[COMMAND_PITCH]) < booz_stab_att_ff_update_min)
-    update[COMMAND_PITCH] = 0;
-  else if (fabs(update[COMMAND_PITCH]) > booz_stab_att_ff_update_max)
-    update[COMMAND_PITCH] = copysign(booz_stab_att_ff_update_max, 
update[COMMAND_PITCH]);
-  booz_stabilization_att_ff_gain_wish[COMMAND_PITCH] += update[COMMAND_PITCH];
-
-  /* Yaw */
-  update[COMMAND_YAW] = -1/miac_covariance_yaw * miac_command_yaw 
-    * (booz_ahrs_float.body_rate.r - miac_command_yaw * 
booz_stabilization_att_ff_adap_gain[COMMAND_YAW]);
-  update[COMMAND_YAW] += CMD_SCALE * 
booz_stabilization_att_ff_adap_gain[COMMAND_YAW] * 
-    copysign(booz_stabilization_att_fb_cmd[COMMAND_YAW], 
-            booz_stabilization_att_fb_cmd[COMMAND_YAW] * 
booz_stabilization_att_ff_cmd[COMMAND_YAW]);
-  miac_covariance_yaw += booz_ahrs_float.body_rate.r * 
booz_ahrs_float.body_rate.r 
-    - miac_alpha_yaw * miac_covariance_yaw;
-  miac_command_yaw = 
booz_stabilization_cmd[COMMAND_YAW]*booz_stab_att_ff_lambda 
-    + miac_command_yaw*(1 - booz_stab_att_ff_lambda);
-  miac_alpha_yaw = booz_stab_att_ff_alpha0 * (1 - 1/(booz_stab_att_ff_k0 * 
miac_covariance_yaw));
-  if (fabs(update[COMMAND_YAW]) < booz_stab_att_ff_update_min)
-    update[COMMAND_YAW] = 0;
-  else if (fabs(update[COMMAND_YAW]) > booz_stab_att_ff_update_max)
-    update[COMMAND_YAW] = copysign(booz_stab_att_ff_update_max, 
update[COMMAND_YAW]);
-  booz_stabilization_att_ff_gain_wish[COMMAND_YAW] += update[COMMAND_YAW];
-
-}
-
-
-#define IERROR_SCALE 1024
-
-#define MAX_SUM_ERR RadOfDeg(56000)
-#include <stdio.h>
-void booz_stabilization_attitude_run(bool_t  in_flight) {
-#ifdef BOOZ_AHRS_FIXED_POINT
-  BOOZ_AHRS_FLOAT_OF_INT32();
-#endif 
-
-  
   /* 
    * Update reference
    */
   booz_stabilization_attitude_ref_update();
 
-  /* 
-   * Compute feedforward
-   */
-  /* ref accel bfp is 2^12 and int controller offsets by 5 */
-  booz_stabilization_att_ff_cmd[COMMAND_ROLL] = 
-    booz_stabilization_ddgain.x * BFP_OF_REAL(booz_stab_att_ref_accel.p, 
(12-5));
-  booz_stabilization_att_ff_cmd[COMMAND_PITCH] = 
-    booz_stabilization_ddgain.y * BFP_OF_REAL(booz_stab_att_ref_accel.q, 
(12-5));
-  booz_stabilization_att_ff_cmd[COMMAND_YAW] = 
-    booz_stabilization_ddgain.z * BFP_OF_REAL(booz_stab_att_ref_accel.r, 
(12-5));
-
   /*
-   * Compute feedback                        
+   * Compute errors for feedback                        
    */
 
   /* attitude error                          */
@@ -468,70 +162,33 @@
   /* wrap it in the shortest direction       */
   FLOAT_QUAT_WRAP_SHORTEST(att_err);  
 
-  if (in_flight) {
+  /*  rate error                */
+  struct FloatRates rate_err;
+  RATES_DIFF(rate_err, booz_ahrs_float.body_rate, booz_stab_att_ref_rate);
+
+  /* integrated error */
+  if (enable_integrator) {
     struct FloatQuat new_sum_err, scaled_att_err;
     /* update accumulator */
-    FLOAT_QUAT_COPY(scaled_att_err, att_err);
-    scaled_att_err.qx /= IERROR_SCALE;
-    scaled_att_err.qy /= IERROR_SCALE;
-    scaled_att_err.qz /= IERROR_SCALE;
-    FLOAT_QUAT_COMP_INV(new_sum_err, booz_stabilization_sum_err, 
scaled_att_err);
+    scaled_att_err.qi = att_err.qi;
+    scaled_att_err.qx = att_err.qx / IERROR_SCALE;
+    scaled_att_err.qy = att_err.qy / IERROR_SCALE;
+    scaled_att_err.qz = att_err.qz / IERROR_SCALE;
+    FLOAT_QUAT_COMP_INV(new_sum_err, booz_stabilization_att_sum_err_quat, 
scaled_att_err);
     FLOAT_QUAT_NORMALISE(new_sum_err);
-    FLOAT_QUAT_COPY(booz_stabilization_sum_err, new_sum_err);
-  }
-  else {
+    FLOAT_QUAT_COPY(booz_stabilization_att_sum_err_quat, new_sum_err);
+    FLOAT_EULERS_OF_QUAT(booz_stabilization_att_sum_err_eulers, 
booz_stabilization_att_sum_err_quat);
+  } else {
     /* reset accumulator */
-    FLOAT_EULERS_ZERO(booz_stabilization_att_sum_err);
-    FLOAT_QUAT_ZERO( booz_stabilization_sum_err );
+    FLOAT_QUAT_ZERO( booz_stabilization_att_sum_err_quat );
+    FLOAT_EULERS_ZERO( booz_stabilization_att_sum_err_eulers );
   }
-  
-  /*  rate error                */
-  struct FloatRates rate_err;
-  RATES_DIFF(rate_err, booz_ahrs_float.body_rate, booz_stab_att_ref_rate);
-  
-  /*  what the quaternion controller would have commanded in
-      alpha-vane mode  */
-  booz_stabilization_attitude_pitch_wish = 
-    -2. * booz_stabilization_pgain.y  * QUAT1_BFP_OF_REAL(att_err.qy)+
-    booz_stabilization_dgain.y  * RATE_BFP_OF_REAL(rate_err.q) +
-    booz_stabilization_igain.y  * 
QUAT1_BFP_OF_REAL(booz_stabilization_sum_err.qy);
 
-#ifdef USE_VANE
-  uint32_t rate_stick_mode = radio_control.values[RADIO_CONTROL_MODE] < -150;
+  attitude_run_ff(booz_stabilization_att_ff_cmd, 
&booz_stabilization_gains[gain_idx], &booz_stab_att_ref_accel);
 
-  /*  override qy in alpha mode  */
-  if (rate_stick_mode) {
-    if (radio_control.values[RADIO_CONTROL_AUX4] < 0) {
-      att_err.qy = alpha_error;
-    }
-  }
-  FLOAT_QUAT_NORMALISE(att_err);
-#endif // USE_VANE
+  attitude_run_fb(booz_stabilization_att_fb_cmd, 
&booz_stabilization_gains[gain_idx], &att_err, &rate_err, 
&booz_stabilization_att_sum_err_quat);
 
-  /*  PID                  */
-  booz_stabilization_att_fb_cmd[COMMAND_ROLL] = 
-    -2. * booz_stabilization_pgain.x  * QUAT1_BFP_OF_REAL(att_err.qx)+
-    booz_stabilization_dgain.x  * RATE_BFP_OF_REAL(rate_err.p) +
-    booz_stabilization_igain.x  * 
QUAT1_BFP_OF_REAL(booz_stabilization_sum_err.qx);
-
-  booz_stabilization_att_fb_cmd[COMMAND_PITCH] = 
-    -2. * booz_stabilization_pgain.y  * QUAT1_BFP_OF_REAL(att_err.qy)+
-    booz_stabilization_dgain.y  * RATE_BFP_OF_REAL(rate_err.q) +
-    booz_stabilization_igain.y  * 
QUAT1_BFP_OF_REAL(booz_stabilization_sum_err.qy);
-  
-  booz_stabilization_att_fb_cmd[COMMAND_YAW] = 
-    -2. * booz_stabilization_pgain.z  * QUAT1_BFP_OF_REAL(att_err.qz)+
-    booz_stabilization_dgain.z  * RATE_BFP_OF_REAL(rate_err.r) +
-    booz_stabilization_igain.z  * 
QUAT1_BFP_OF_REAL(booz_stabilization_sum_err.qz);
-
-  booz_stabilization_cmd[COMMAND_ROLL] = 
-    
((booz_stabilization_att_fb_cmd[COMMAND_ROLL]+booz_stabilization_att_ff_cmd[COMMAND_ROLL]))/(1<<16);
-  booz_stabilization_cmd[COMMAND_PITCH] = 
-    
((booz_stabilization_att_fb_cmd[COMMAND_PITCH]+booz_stabilization_att_ff_cmd[COMMAND_PITCH]))/(1<<16);
-  booz_stabilization_cmd[COMMAND_YAW] = 
-    
((booz_stabilization_att_fb_cmd[COMMAND_YAW]+booz_stabilization_att_ff_cmd[COMMAND_YAW]))/(1<<16);
-    
-  if (in_flight) {
-    booz_stabilization_attitude_ffgain_adap();
+  for (int i = COMMAND_ROLL; i <= COMMAND_YAW; 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_quat_float.c
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
        2010-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
        2010-04-20 03:37:55 UTC (rev 4820)
@@ -21,9 +21,16 @@
  * Boston, MA 02111-1307, USA. 
  */
 
+/** \file booz_stabilization_attitude_ref_float.c
+ *  \brief Booz attitude reference generation (quaternion float version)
+ *
+ */
+
 #include "booz_stabilization.h"
+#include "booz_ahrs.h"
 
 #include "booz_stabilization_attitude_ref_float.h"
+#include "quat_setpoint.h"
 
 struct FloatEulers booz_stab_att_sp_euler;
 struct FloatQuat   booz_stab_att_sp_quat;
@@ -34,6 +41,24 @@
 
 struct FloatRefModel booz_stab_att_ref_model;
 
+static void reset_psi_ref_from_body(void) {
+    booz_stab_att_sp_euler.psi = booz_ahrs_float.ltp_to_body_euler.psi;
+    booz_stab_att_ref_euler.psi = booz_ahrs_float.ltp_to_body_euler.psi;
+    booz_stab_att_ref_rate.r = 0;
+    booz_stab_att_ref_accel.r = 0;
+}
+
+static void update_ref_quat_from_eulers(void) {
+    struct FloatRMat ref_rmat;
+
+#ifdef STICKS_RMAT312
+    FLOAT_RMAT_OF_EULERS_312(ref_rmat, booz_stab_att_ref_euler);
+#else
+    FLOAT_RMAT_OF_EULERS_321(ref_rmat, booz_stab_att_ref_euler);
+#endif
+    FLOAT_QUAT_OF_RMAT(booz_stab_att_ref_quat, ref_rmat);
+}
+
 void booz_stabilization_attitude_ref_init(void) {
 
   FLOAT_EULERS_ZERO(booz_stab_att_sp_euler);
@@ -52,6 +77,13 @@
 
 }
 
+void booz_stabilization_attitude_ref_enter()
+{
+  reset_psi_ref_from_body();
+  update_ref_quat_from_eulers();
+  booz_stabilization_attitude_sp_enter();
+}
+
 /*
  * Reference
  */
@@ -91,7 +123,4 @@
 
   /* compute ref_euler */
   FLOAT_EULERS_OF_QUAT(booz_stab_att_ref_euler, booz_stab_att_ref_quat);
-
 }
-
-

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-04-20 03:34:53 UTC (rev 4819)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.h
        2010-04-20 03:37:55 UTC (rev 4820)
@@ -52,7 +52,6 @@
   (radio_control.values[RADIO_CONTROL_YAW] >  
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_R || \
    radio_control.values[RADIO_CONTROL_YAW] < 
-BOOZ_STABILIZATION_ATTITUDE_DEADBAND_R)
 
+void booz_stabilization_attitude_ref_enter(void);
 
 #endif /* BOOZ_STABILIZATION_ATTITUDE_REF_QUAT_FLOAT_H */
-
-





reply via email to

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