dcm.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #pragma once
  2. #include <math.h>
  3. /**
  4. * @brief 通过四元数构造旋转矩阵
  5. *
  6. * @param Q
  7. * @param dcm
  8. */
  9. static inline void DCM_ByQuaternion(const float Q[4], float dcm[3][3])
  10. {
  11. float Q0 = Q[0], Q1 = Q[1], Q2 = Q[2], Q3 = Q[3];
  12. float Q0s = Q[0] * Q[0];
  13. float Q1s = Q[1] * Q[1];
  14. float Q2s = Q[2] * Q[2];
  15. float Q3s = Q[3] * Q[3];
  16. dcm[0][0] = Q0s + Q1s - Q2s - Q3s;
  17. dcm[0][1] = 2.0f * (Q1 * Q2 - Q0 * Q3);
  18. dcm[0][2] = 2.0f * (Q0 * Q2 + Q1 * Q3);
  19. dcm[1][0] = 2.0f * (Q1 * Q2 + Q0 * Q3);
  20. dcm[1][1] = Q0s - Q1s + Q2s - Q3s;
  21. dcm[1][2] = 2.0f * (Q2 * Q3 - Q0 * Q1);
  22. dcm[2][0] = 2.0f * (Q1 * Q3 - Q0 * Q2);
  23. dcm[2][1] = 2.0f * (Q0 * Q1 + Q2 * Q3);
  24. dcm[2][2] = Q0s - Q1s - Q2s + Q3s;
  25. }
  26. /**
  27. * @brief 通过欧拉角构造旋转矩阵
  28. * 欧拉角定义顺序必须为 航向->俯仰->横滚 rad
  29. * @param yaw 航向角
  30. * @param pitch 俯仰角
  31. * @param roll 横滚角
  32. * @param dcm 旋转矩阵, TbN阵
  33. */
  34. static inline void DCM_ByEuler(float yaw, float pitch, float roll, float dcm[3][3])
  35. {
  36. dcm[0][0] = cosf(roll) * cosf(yaw) - sinf(pitch) * sinf(roll) * sinf(yaw);
  37. dcm[0][1] = -cosf(pitch) * sinf(yaw);
  38. dcm[0][2] = sinf(roll) * cosf(yaw) + cosf(roll) * sinf(pitch) * sinf(yaw);
  39. dcm[1][0] = cosf(roll) * sinf(yaw) + sinf(roll) * sinf(pitch) * cosf(yaw);
  40. dcm[1][1] = cosf(pitch) * cosf(yaw);
  41. dcm[1][2] = sinf(roll) * sinf(yaw) - cosf(roll) * sinf(pitch) * cosf(yaw);
  42. dcm[2][0] = -sinf(roll) * cosf(pitch);
  43. dcm[2][1] = sinf(pitch);
  44. dcm[2][2] = cosf(roll) * cosf(pitch);
  45. }
  46. /**
  47. * @brief 使用 frame1 xyz轴向量 在 frame2 下的坐标,构建旋转矩阵
  48. * x, y, z 必须为互相正交的单位向量
  49. * @param x frame1 x 轴在 frame2 系下的单位坐标
  50. * @param y frame1 y 轴在 frame2 系下的单位坐标
  51. * @param z frame1 z 轴在 frame2 系下的单位坐标
  52. */
  53. static inline void DCM_ByXYZAxis(const float X[3], const float Y[3], const float Z[3], float dcm[3][3])
  54. {
  55. for (int i = 0; i < 3; ++i)
  56. {
  57. dcm[i][0] = X[i];
  58. dcm[i][1] = Y[i];
  59. dcm[i][2] = Z[i];
  60. }
  61. }