/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.c

https://github.com/AshuLara/lisa · C · 202 lines · 100 code · 35 blank · 67 comment · 0 complexity · 5e5c240a2ac6fbd89227f6b6bb1bc614 MD5 · raw file

  1. /*
  2. * $Id$
  3. *
  4. * Copyright (C) 2008-2009 Antoine Drouin <poinix@gmail.com>
  5. *
  6. * This file is part of paparazzi.
  7. *
  8. * paparazzi is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2, or (at your option)
  11. * any later version.
  12. *
  13. * paparazzi is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with paparazzi; see the file COPYING. If not, write to
  20. * the Free Software Foundation, 59 Temple Place - Suite 330,
  21. * Boston, MA 02111-1307, USA.
  22. */
  23. /** \file stabilization_attitude_ref_int.c
  24. * \brief Booz attitude reference generation (quaternion int version)
  25. *
  26. */
  27. #include "generated/airframe.h"
  28. #include "firmwares/rotorcraft/stabilization.h"
  29. #include "subsystems/ahrs.h"
  30. #include "stabilization_attitude_ref_int.h"
  31. //#include "quat_setpoint.h"
  32. #define REF_ACCEL_MAX_P BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_PDOT, REF_ACCEL_FRAC)
  33. #define REF_ACCEL_MAX_Q BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_QDOT, REF_ACCEL_FRAC)
  34. #define REF_ACCEL_MAX_R BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_RDOT, REF_ACCEL_FRAC)
  35. #define REF_RATE_MAX_P BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_P, REF_RATE_FRAC)
  36. #define REF_RATE_MAX_Q BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_Q, REF_RATE_FRAC)
  37. #define REF_RATE_MAX_R BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_R, REF_RATE_FRAC)
  38. #define OMEGA_P STABILIZATION_ATTITUDE_REF_OMEGA_P
  39. #define ZETA_P STABILIZATION_ATTITUDE_REF_ZETA_P
  40. #define ZETA_OMEGA_P_RES 10
  41. #define ZETA_OMEGA_P BFP_OF_REAL((ZETA_P*OMEGA_P), ZETA_OMEGA_P_RES)
  42. #define OMEGA_2_P_RES 7
  43. #define OMEGA_2_P BFP_OF_REAL((OMEGA_P*OMEGA_P), OMEGA_2_P_RES)
  44. #define OMEGA_Q STABILIZATION_ATTITUDE_REF_OMEGA_Q
  45. #define ZETA_Q STABILIZATION_ATTITUDE_REF_ZETA_Q
  46. #define ZETA_OMEGA_Q_RES 10
  47. #define ZETA_OMEGA_Q BFP_OF_REAL((ZETA_Q*OMEGA_Q), ZETA_OMEGA_Q_RES)
  48. #define OMEGA_2_Q_RES 7
  49. #define OMEGA_2_Q BFP_OF_REAL((OMEGA_Q*OMEGA_Q), OMEGA_2_Q_RES)
  50. #define OMEGA_R STABILIZATION_ATTITUDE_REF_OMEGA_R
  51. #define ZETA_R STABILIZATION_ATTITUDE_REF_ZETA_R
  52. #define ZETA_OMEGA_R_RES 10
  53. #define ZETA_OMEGA_R BFP_OF_REAL((ZETA_R*OMEGA_R), ZETA_OMEGA_R_RES)
  54. #define OMEGA_2_R_RES 7
  55. #define OMEGA_2_R BFP_OF_REAL((OMEGA_R*OMEGA_R), OMEGA_2_R_RES)
  56. struct Int32Eulers stab_att_sp_euler;
  57. struct Int32Quat stab_att_sp_quat;
  58. struct Int32Eulers stab_att_ref_euler;
  59. struct Int32Quat stab_att_ref_quat;
  60. struct Int32Rates stab_att_ref_rate;
  61. struct Int32Rates stab_att_ref_accel;
  62. struct Int32RefModel stab_att_ref_model = {
  63. {STABILIZATION_ATTITUDE_REF_OMEGA_P, STABILIZATION_ATTITUDE_REF_OMEGA_Q, STABILIZATION_ATTITUDE_REF_OMEGA_R},
  64. {STABILIZATION_ATTITUDE_REF_ZETA_P, STABILIZATION_ATTITUDE_REF_ZETA_Q, STABILIZATION_ATTITUDE_REF_ZETA_R}
  65. };
  66. /*
  67. static const float omega_p[] = STABILIZATION_ATTITUDE_REF_OMEGA_P;
  68. static const float zeta_p[] = STABILIZATION_ATTITUDE_REF_ZETA_P;
  69. static const float omega_q[] = STABILIZATION_ATTITUDE_REF_OMEGA_Q;
  70. static const float zeta_q[] = STABILIZATION_ATTITUDE_REF_ZETA_Q;
  71. static const float omega_r[] = STABILIZATION_ATTITUDE_REF_OMEGA_R;
  72. static const float zeta_r[] = STABILIZATION_ATTITUDE_REF_ZETA_R;
  73. */
  74. static void reset_psi_ref_from_body(void) {
  75. stab_att_ref_euler.psi = ahrs.ltp_to_body_euler.psi;
  76. stab_att_ref_rate.r = 0;
  77. stab_att_ref_accel.r = 0;
  78. }
  79. static void update_ref_quat_from_eulers(void) {
  80. struct Int32RMat ref_rmat;
  81. #ifdef STICKS_RMAT312
  82. INT32_RMAT_OF_EULERS_312(ref_rmat, stab_att_ref_euler);
  83. #else
  84. INT32_RMAT_OF_EULERS_321(ref_rmat, stab_att_ref_euler);
  85. #endif
  86. INT32_QUAT_OF_RMAT(stab_att_ref_quat, ref_rmat);
  87. INT32_QUAT_WRAP_SHORTEST(stab_att_ref_quat);
  88. }
  89. void stabilization_attitude_ref_init(void) {
  90. INT_EULERS_ZERO(stab_att_sp_euler);
  91. INT32_QUAT_ZERO( stab_att_sp_quat);
  92. INT_EULERS_ZERO(stab_att_ref_euler);
  93. INT32_QUAT_ZERO( stab_att_ref_quat);
  94. INT_RATES_ZERO( stab_att_ref_rate);
  95. INT_RATES_ZERO( stab_att_ref_accel);
  96. /*
  97. for (int i = 0; i < STABILIZATION_ATTITUDE_GAIN_NB; i++) {
  98. RATES_ASSIGN(stab_att_ref_model[i].omega, omega_p[i], omega_q[i], omega_r[i]);
  99. RATES_ASSIGN(stab_att_ref_model[i].zeta, zeta_p[i], zeta_q[i], zeta_r[i]);
  100. }
  101. */
  102. }
  103. void stabilization_attitude_ref_enter()
  104. {
  105. reset_psi_ref_from_body();
  106. stabilization_attitude_sp_enter();
  107. memcpy(&stab_att_ref_quat, &stab_att_sp_quat, sizeof(struct Int32Quat));
  108. memset(&stab_att_ref_accel, 0, sizeof(struct Int32Rates));
  109. memset(&stab_att_ref_rate, 0, sizeof(struct Int32Rates));
  110. //update_ref_quat_from_eulers();
  111. }
  112. /*
  113. * Reference
  114. */
  115. #define DT_UPDATE (1./512.)
  116. #define F_UPDATE_RES 9
  117. #include "messages.h"
  118. #include "mcu_periph/uart.h"
  119. #include "downlink.h"
  120. void stabilization_attitude_ref_update() {
  121. /* integrate reference attitude */
  122. struct Int32Quat qdot;
  123. INT32_QUAT_DERIVATIVE(qdot, stab_att_ref_rate, stab_att_ref_quat);
  124. //QUAT_SMUL(qdot, qdot, RATE_BFP_OF_REAL(DT_UPDATE));
  125. QUAT_SMUL(qdot, qdot, 4);
  126. QUAT_SMUL(qdot, qdot, DT_UPDATE);
  127. QUAT_ADD(stab_att_ref_quat, qdot);
  128. INT32_QUAT_NORMALIZE(stab_att_ref_quat);
  129. /* integrate reference rotational speeds */
  130. const struct Int32Rates delta_rate = {
  131. stab_att_ref_accel.p >> ( F_UPDATE_RES + REF_ACCEL_FRAC - REF_RATE_FRAC),
  132. stab_att_ref_accel.q >> ( F_UPDATE_RES + REF_ACCEL_FRAC - REF_RATE_FRAC),
  133. stab_att_ref_accel.r >> ( F_UPDATE_RES + REF_ACCEL_FRAC - REF_RATE_FRAC)};
  134. //RATES_SMUL(delta_rate, stab_att_ref_accel, RATE_BFP_OF_REAL(DT_UPDATE));
  135. //RATES_SMUL(delta_rate, stab_att_ref_accel, DT_UPDATE);
  136. RATES_ADD(stab_att_ref_rate, delta_rate);
  137. /* compute reference angular accelerations */
  138. struct Int32Quat err;
  139. /* compute reference attitude error */
  140. INT32_QUAT_INV_COMP(err, stab_att_sp_quat, stab_att_ref_quat);
  141. /* wrap it in the shortest direction */
  142. INT32_QUAT_WRAP_SHORTEST(err);
  143. /* propagate the 2nd order linear model */
  144. const struct Int32Rates accel_rate = {
  145. ((int32_t)(-2.*ZETA_OMEGA_P) * (stab_att_ref_rate.p >> (REF_RATE_FRAC - REF_ACCEL_FRAC))) >> (ZETA_OMEGA_P_RES),
  146. ((int32_t)(-2.*ZETA_OMEGA_Q) * (stab_att_ref_rate.q >> (REF_RATE_FRAC - REF_ACCEL_FRAC))) >> (ZETA_OMEGA_Q_RES),
  147. ((int32_t)(-2.*ZETA_OMEGA_R) * (stab_att_ref_rate.r >> (REF_RATE_FRAC - REF_ACCEL_FRAC))) >> (ZETA_OMEGA_R_RES) };
  148. const struct Int32Rates accel_angle = {
  149. ((int32_t)(-OMEGA_2_P)* (err.qx >> (REF_ANGLE_FRAC - REF_ACCEL_FRAC))) >> (OMEGA_2_P_RES),
  150. ((int32_t)(-OMEGA_2_Q)* (err.qy >> (REF_ANGLE_FRAC - REF_ACCEL_FRAC))) >> (OMEGA_2_Q_RES),
  151. ((int32_t)(-OMEGA_2_R)* (err.qz >> (REF_ANGLE_FRAC - REF_ACCEL_FRAC))) >> (OMEGA_2_R_RES) };
  152. RATES_SUM(stab_att_ref_accel, accel_rate, accel_angle);
  153. /*
  154. stab_att_ref_accel.p = -2.*stab_att_ref_model.zeta.p*stab_att_ref_model.omega.p*stab_att_ref_rate.p
  155. - stab_att_ref_model.omega.p*stab_att_ref_model.omega.p*err.qx;
  156. stab_att_ref_accel.q = -2.*stab_att_ref_model.zeta.q*stab_att_ref_model.omega.q*stab_att_ref_rate.q
  157. - stab_att_ref_model.omega.q*stab_att_ref_model.omega.q*err.qy;
  158. stab_att_ref_accel.r = -2.*stab_att_ref_model.zeta.r*stab_att_ref_model.omega.r*stab_att_ref_rate.r
  159. - stab_att_ref_model.omega.r*stab_att_ref_model.omega.r*err.qz;
  160. */
  161. /* saturate acceleration */
  162. //const struct Int32Rates MIN_ACCEL = { -REF_ACCEL_MAX_P, -REF_ACCEL_MAX_Q, -REF_ACCEL_MAX_R };
  163. //const struct Int32Rates MAX_ACCEL = { REF_ACCEL_MAX_P, REF_ACCEL_MAX_Q, REF_ACCEL_MAX_R };
  164. //RATES_BOUND_BOX(stab_att_ref_accel, MIN_ACCEL, MAX_ACCEL);
  165. /* compute ref_euler */
  166. INT32_EULERS_OF_QUAT(stab_att_ref_euler, stab_att_ref_quat);
  167. }