paparazzi-commits
[Top][All Lists]
Advanced

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

[paparazzi-commits] [4541] Add ability to change booz attitude stabiliza


From: Allen Ibara
Subject: [paparazzi-commits] [4541] Add ability to change booz attitude stabilization reference omega/ zeta via settings variables, also a few message updates
Date: Fri, 05 Feb 2010 18:11:51 +0000

Revision: 4541
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4541
Author:   aibara
Date:     2010-02-05 18:11:51 +0000 (Fri, 05 Feb 2010)
Log Message:
-----------
Add ability to change booz attitude stabilization reference omega/zeta via 
settings variables, also a few message updates

Modified Paths:
--------------
    paparazzi3/trunk/conf/messages.xml
    
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.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

Modified: paparazzi3/trunk/conf/messages.xml
===================================================================
--- paparazzi3/trunk/conf/messages.xml  2010-02-05 18:08:04 UTC (rev 4540)
+++ paparazzi3/trunk/conf/messages.xml  2010-02-05 18:11:51 UTC (rev 4541)
@@ -1290,14 +1290,12 @@
       <field name="motor_command" type="float"/>
     </message>
 
-    <message name="ASTRO_MOTOR" id="183">
-      <field name="fault"      type="uint16"/>
-      <field name="raw_speed"  type="uint16"/>
-      <field name="raw_dcbus"  type="uint16"/>
+    <message name="BLMC_FAULT_STATUS" id="183">
+      <field name="raw_fault"  type="uint16[]"/>
     </message>
 
     <message name="BLMC_SPEEDS" id="184">
-      <field name="speeds"     type="uint16[]"/>
+      <field name="speeds"     type="int16[]"/>
     </message>
 
     <message name="AHRS_DEBUG_QUAT" id="185">
@@ -1458,6 +1456,28 @@
       <field name="ins_ydd"   type="int32" alt_unit="m/s2" 
alt_unit_coef="0.0009766"/>
       <field name="ins_zdd"   type="int32" alt_unit="m/s2" 
alt_unit_coef="0.0009766"/>
        </message>
+
+  <message name="AFL_COEFFS" id="250">
+      <field name="roll_a"   type="float"/>
+      <field name="roll_b"  type="float"/>
+      <field name="roll_c"  type="float"/>
+      <field name="pitch_a"  type="float"/>
+      <field name="pitch_b"   type="float"/>
+      <field name="pitch_c"   type="float"/>
+      <field name="yaw_a"   type="float"/>
+      <field name="yaw_b"  type="float"/>
+      <field name="yaw_c"  type="float"/>
+  </message>
+
+  <message name="BOOZ_ATT_REF_MODEL" id="251">
+    <field name="omega_p" type="float" />
+    <field name="zeta_p" type="float" />
+    <field name="omega_q" type="float" />
+    <field name="zeta_q" type="float" />
+    <field name="omega_r" type="float" />
+    <field name="zeta_r" type="float" />
+  </message>
+
 </class>
 
 

Modified: 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h
===================================================================
--- 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h   
    2010-02-05 18:08:04 UTC (rev 4540)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude.h   
    2010-02-05 18:11:51 UTC (rev 4541)
@@ -41,6 +41,8 @@
 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_zeta;
 
 #define booz_stabilization_attitude_SetKiPhi(_val) {   \
     booz_stabilization_igain.x = _val;                 \

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-02-05 18:08:04 UTC (rev 4540)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_quat_float.c
    2010-02-05 18:11:51 UTC (rev 4541)
@@ -27,7 +27,6 @@
 #include "math/pprz_algebra_int.h"
 #include "booz_ahrs.h"
 #include "booz_radio_control.h"
-
 #include "airframe.h"
 
 
@@ -44,7 +43,12 @@
 float booz_stabilization_attitude_beta_vane_gain;
 float booz_stabilization_attitude_alpha_vane_gain;
 
+float booz_stabilization_attitude_alpha_alt_dgain;
+float booz_stabilization_attitude_alpha_alt_zeta;
 
+static struct FloatQuat pitch_setpoint_quat = { 1., 0., 0., 0. };
+static struct FloatQuat pr_setpoint_quat = { 1., 0., 0., 0. };
+
 void booz_stabilization_attitude_init(void) {
 
   booz_stabilization_attitude_ref_init();
@@ -75,6 +79,8 @@
 #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_zeta = booz_stab_att_ref_model.zeta_q;
 #endif
 
 }
@@ -95,6 +101,7 @@
   return -atan2f(dcm02, dcm22);
 }
 
+
 // 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)
@@ -170,21 +177,26 @@
   FLOAT_QUAT_COMP(booz_stab_att_sp_quat, prev_sp_quat, sticks_quat);
 }
 
+static void booz_stabilization_attitude_new_setpoint(void)
+{
+      // add integrated stick commands to existing setpoint
+      FLOAT_QUAT_COMP(booz_stab_att_sp_quat, pr_setpoint_quat, 
pitch_setpoint_quat);
+}
+
+// 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)
 {
-  struct FloatEulers sticks_eulers;
-  struct FloatQuat sticks_quat, prev_sp_quat;
-  sticks_eulers.phi = 0;
-  sticks_eulers.theta = booz_stabilization_attitude_alpha_vane_gain * alpha / 
RC_UPDATE_FREQ;
-  sticks_eulers.psi = 0;
-
-  // convert eulers to quaternion
-  FLOAT_QUAT_OF_EULERS(sticks_quat, sticks_eulers);
-  FLOAT_QUAT_COPY(prev_sp_quat, booz_stab_att_sp_quat)
+  // argument alpha is error between measurement and setpoint, I believe
+  struct FloatVect3 y_axis = { 0, 1, 0 };
   
-  // rotate previous setpoint by commanded rotation
-  FLOAT_QUAT_COMP(booz_stab_att_sp_quat, prev_sp_quat, sticks_quat);
+  // make new quaternion of alpha deviation added to current theta angle
+  FLOAT_QUAT_OF_AXIS_ANGLE(pitch_setpoint_quat, y_axis, alpha + 
booz_ahrs_float.ltp_to_body_euler.theta); 
+  
+  // make new trajectory setpoint
+  booz_stabilization_attitude_new_setpoint();
 }
+
 #endif
 
 void booz_stabilization_attitude_read_rc(bool_t in_flight) {
@@ -195,21 +207,79 @@
   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;
+  struct FloatQuat sticks_quat, prev_sp_quat, setpoint_quat_old;
 
+  // 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) {
-    // convert sticks to commanded rates
-    sticks_eulers.phi = APPLY_DEADBAND(roll, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_A) * ROLL_COEF_RATE / RC_UPDATE_FREQ;
-    sticks_eulers.theta = APPLY_DEADBAND(pitch, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_E) * PITCH_COEF_RATE / RC_UPDATE_FREQ;
-    sticks_eulers.psi = APPLY_DEADBAND(yaw, 
BOOZ_STABILIZATION_ATTITUDE_DEADBAND_R) * YAW_COEF_H / RC_UPDATE_FREQ;
+#ifdef USE_VANE
+    struct FloatRMat pitch_rmat, ltp_to_body_rmat, phi_psi_rmat;
 
+    static int vane_transition = 0;
+    static float d_gain_y = 0;
+    static float zeta_y = 0;
+
+    // struct FloatVect3 x_axis = { 1, 0, 0 };
+    struct FloatVect3 y_axis = { 0, 1, 0 };
+    // struct FloatVect3 z_axis = { 0, 0, 1 };
+    
+    // is vane engaged?        
+    if (radio_control.values[RADIO_CONTROL_AUX4] < 0) {
+      sticks_eulers.theta = 0;
+
+      // generate new rotation based on current stick commands
+      FLOAT_QUAT_OF_EULERS(sticks_quat, sticks_eulers);
+
+      // if first time on the vane, set setpoint to existing roll and yaw 
angles
+      if (vane_transition == 0) {
+       // convert current body quat and current pitch rotation to DCMs
+       FLOAT_RMAT_OF_QUAT(ltp_to_body_rmat, booz_ahrs_float.ltp_to_body_quat);
+       FLOAT_RMAT_OF_AXIS_ANGLE(pitch_rmat, y_axis, 
-get_pitch_rotation_angle(&ltp_to_body_rmat));
+
+       // subtract pitch rotation from current body DCM
+       FLOAT_RMAT_COMP(phi_psi_rmat, ltp_to_body_rmat, pitch_rmat);
+       
+       // new phi & psi setpoints come from body DCM minus pitch
+       FLOAT_QUAT_OF_RMAT(pr_setpoint_quat, phi_psi_rmat);
+       vane_transition = 1;
+
+       // swap in new D gain
+       d_gain_y = booz_stabilization_dgain.y;
+       booz_stabilization_dgain.y = 
booz_stabilization_attitude_alpha_alt_dgain;
+
+       // swap in new reference zeta (damping)
+       zeta_y = booz_stab_att_ref_model.zeta_q;
+       booz_stab_att_ref_model.zeta_q = 
booz_stabilization_attitude_alpha_alt_zeta;
+      }
+
+      // integrate stick commands in phi and psi
+      FLOAT_QUAT_COPY(setpoint_quat_old, pr_setpoint_quat);
+      FLOAT_QUAT_COMP(pr_setpoint_quat, sticks_quat, setpoint_quat_old);
+      
+      // make new trajectory setpoint
+      booz_stabilization_attitude_new_setpoint();
+    } else {
+      if (vane_transition == 1) {
+       // just switched out of vane mode
+       booz_stabilization_dgain.y = d_gain_y;
+       booz_stab_att_ref_model.zeta_q = zeta_y; 
+      }
+#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)
+    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
+    vane_transition = 0;
+    }
+#endif // USE_VANE
+
   } else {
     // First time switching from rate to position reset the setpoint based on 
the body
     if (last_rate_stick_mode) {

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-02-05 18:08:04 UTC (rev 4540)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_float.h
     2010-02-05 18:11:51 UTC (rev 4541)
@@ -30,5 +30,16 @@
 extern struct FloatRates  booz_stab_att_ref_rate;
 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;
+};
+
+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-02-05 18:08:04 UTC (rev 4540)
+++ 
paparazzi3/trunk/sw/airborne/booz/stabilization/booz_stabilization_attitude_ref_quat_float.c
        2010-02-05 18:11:51 UTC (rev 4541)
@@ -23,6 +23,7 @@
 
 #include "booz_stabilization.h"
 
+#include "booz_stabilization_attitude_ref_float.h"
 
 struct FloatEulers booz_stab_att_sp_euler;
 struct FloatQuat   booz_stab_att_sp_quat;
@@ -31,6 +32,7 @@
 struct FloatRates  booz_stab_att_ref_rate;
 struct FloatRates  booz_stab_att_ref_accel;
 
+struct FloatRefModel booz_stab_att_ref_model;
 
 void booz_stabilization_attitude_ref_init(void) {
 
@@ -41,6 +43,13 @@
   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;
+
 }
 
 /*
@@ -52,13 +61,6 @@
 #define DT_UPDATE (1./512.)
 #endif
 
-#define OMEGA_P   BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_P
-#define ZETA_P    BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_P
-#define OMEGA_Q   BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_Q
-#define ZETA_Q    BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_Q
-#define OMEGA_R   BOOZ_STABILIZATION_ATTITUDE_REF_OMEGA_R
-#define ZETA_R    BOOZ_STABILIZATION_ATTITUDE_REF_ZETA_R
-
 void booz_stabilization_attitude_ref_update() {
 
   /* integrate reference attitude            */
@@ -80,9 +82,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.*ZETA_P*OMEGA_P*booz_stab_att_ref_rate.p - 
OMEGA_P*OMEGA_P*err.qx;
-  booz_stab_att_ref_accel.q = -2.*ZETA_Q*OMEGA_Q*booz_stab_att_ref_rate.q - 
OMEGA_Q*OMEGA_Q*err.qy;
-  booz_stab_att_ref_accel.r = -2.*ZETA_R*OMEGA_R*booz_stab_att_ref_rate.r - 
OMEGA_R*OMEGA_R*err.qz;
+  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;
 
   /* compute ref_euler */
   FLOAT_EULERS_OF_QUAT(booz_stab_att_ref_euler, booz_stab_att_ref_quat);





reply via email to

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