euler.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "euler.h"
  2. #include "dcm.h"
  3. #include "helpler_funtions.h"
  4. #include <math.h>
  5. void Euler_ByDcmEnu(const float dcm[3][3], euler_angle_t *euler) {
  6. const float eps = 1e-4f;
  7. float phi_val = atan2f(-dcm[2][0], dcm[2][2]);
  8. float theta_val = asinf(dcm[2][1]);
  9. float psi_val = atan2f(-dcm[0][1], dcm[1][1]);
  10. const float pi = M_PI;
  11. /* 对 pitch 为 +-pi/2 的奇异点进行处理 */
  12. if ((fabsf(theta_val - pi / 2)) < eps) {
  13. /* 若 pitch 为 pi/2 */
  14. phi_val = 0;
  15. psi_val = atan2f(-dcm[0][2], -dcm[1][2]);
  16. } else if ((fabsf(theta_val + pi / 2)) < eps) {
  17. /* 若 pitch 为 -pi/2 */
  18. phi_val = 0;
  19. psi_val = atan2f(dcm[0][2], dcm[1][2]);
  20. }
  21. euler->roll = phi_val;
  22. euler->pitch = theta_val;
  23. euler->yaw = psi_val;
  24. }
  25. void Euler_ByDcmNed(const float dcm[3][3], euler_angle_t *euler) {
  26. const float eps = 1e-4f;
  27. float phi_val = atan2f(dcm[2][1], dcm[2][2]);
  28. float theta_val = asinf(-dcm[2][0]);
  29. float psi_val = atan2f(dcm[1][0], dcm[0][0]);
  30. const float pi = M_PI;
  31. /* 对 pitch 为 +-pi/2 的奇异点进行处理 */
  32. if ((fabsf(theta_val - pi / 2)) < eps) {
  33. /* 若 pitch 为 pi/2 */
  34. phi_val = (0);
  35. psi_val = (atan2f(dcm[1][2], dcm[0][2]));
  36. } else if ((fabsf(theta_val + pi / 2)) < eps) {
  37. /* 若 pitch 为 -pi/2 */
  38. phi_val = (0);
  39. psi_val = (atan2f(-dcm[1][2], -dcm[0][2]));
  40. }
  41. euler->roll = phi_val;
  42. euler->pitch = theta_val;
  43. euler->yaw = psi_val;
  44. }
  45. void Euler_ByQuaternionEnu(const float Q[4], euler_angle_t *euler) {
  46. float dcm[3][3] = {0};
  47. DCM_ByQuaternion(Q, dcm);
  48. Euler_ByDcmEnu(dcm, euler);
  49. }
  50. void Euler_ByQuaternionNed(const float Q[4], euler_angle_t *euler) {
  51. float dcm[3][3] = {0};
  52. DCM_ByQuaternion(Q, dcm);
  53. Euler_ByDcmNed(dcm, euler);
  54. }