1 #ifndef _MAVLINK_CONVERSIONS_H_ 2 #define _MAVLINK_CONVERSIONS_H_ 6 #ifndef _USE_MATH_DEFINES 7 #define _USE_MATH_DEFINES 13 #define M_PI_2 ((float)asin(1)) 40 double a = quaternion[0];
41 double b = quaternion[1];
42 double c = quaternion[2];
43 double d = quaternion[3];
48 dcm[0][0] = aSq + bSq - cSq - dSq;
49 dcm[0][1] = 2 * (b * c - a * d);
50 dcm[0][2] = 2 * (a * c + b * d);
51 dcm[1][0] = 2 * (b * c + a * d);
52 dcm[1][1] = aSq - bSq + cSq - dSq;
53 dcm[1][2] = 2 * (c * d - a * b);
54 dcm[2][0] = 2 * (b * d - a * c);
55 dcm[2][1] = 2 * (a * b + c * d);
56 dcm[2][2] = aSq - bSq - cSq + dSq;
70 float phi, theta, psi;
71 theta = asin(-dcm[2][0]);
73 if (fabsf(theta - (
float)
M_PI_2) < 1.0e-3
f) {
75 psi = (atan2f(dcm[1][2] - dcm[0][1],
76 dcm[0][2] + dcm[1][1]) + phi);
78 }
else if (fabsf(theta + (
float)M_PI_2) < 1.0e-3
f) {
80 psi = atan2f(dcm[1][2] - dcm[0][1],
81 dcm[0][2] + dcm[1][1] - phi);
84 phi = atan2f(dcm[2][1], dcm[2][2]);
85 psi = atan2f(dcm[1][0], dcm[0][0]);
120 float cosPhi_2 = cosf(roll / 2);
121 float sinPhi_2 = sinf(roll / 2);
122 float cosTheta_2 = cosf(pitch / 2);
123 float sinTheta_2 = sinf(pitch / 2);
124 float cosPsi_2 = cosf(yaw / 2);
125 float sinPsi_2 = sinf(yaw / 2);
126 quaternion[0] = (cosPhi_2 * cosTheta_2 * cosPsi_2 +
127 sinPhi_2 * sinTheta_2 * sinPsi_2);
128 quaternion[1] = (sinPhi_2 * cosTheta_2 * cosPsi_2 -
129 cosPhi_2 * sinTheta_2 * sinPsi_2);
130 quaternion[2] = (cosPhi_2 * sinTheta_2 * cosPsi_2 +
131 sinPhi_2 * cosTheta_2 * sinPsi_2);
132 quaternion[3] = (cosPhi_2 * cosTheta_2 * sinPsi_2 -
133 sinPhi_2 * sinTheta_2 * cosPsi_2);
148 float tr = dcm[0][0] + dcm[1][1] + dcm[2][2];
150 float s = sqrtf(tr + 1.0
f);
151 quaternion[0] = s * 0.5f;
153 quaternion[1] = (dcm[2][1] - dcm[1][2]) * s;
154 quaternion[2] = (dcm[0][2] - dcm[2][0]) * s;
155 quaternion[3] = (dcm[1][0] - dcm[0][1]) * s;
161 for (i = 1; i < 3; i++) {
162 if (dcm[i][i] > dcm[dcm_i][dcm_i]) {
167 int dcm_j = (dcm_i + 1) % 3;
168 int dcm_k = (dcm_i + 2) % 3;
170 float s = sqrtf((dcm[dcm_i][dcm_i] - dcm[dcm_j][dcm_j] -
171 dcm[dcm_k][dcm_k]) + 1.0
f);
172 quaternion[dcm_i + 1] = s * 0.5f;
174 quaternion[dcm_j + 1] = (dcm[dcm_i][dcm_j] + dcm[dcm_j][dcm_i]) * s;
175 quaternion[dcm_k + 1] = (dcm[dcm_k][dcm_i] + dcm[dcm_i][dcm_k]) * s;
176 quaternion[0] = (dcm[dcm_k][dcm_j] - dcm[dcm_j][dcm_k]) * s;
191 float cosPhi = cosf(roll);
192 float sinPhi = sinf(roll);
193 float cosThe = cosf(pitch);
194 float sinThe = sinf(pitch);
195 float cosPsi = cosf(yaw);
196 float sinPsi = sinf(yaw);
198 dcm[0][0] = cosThe * cosPsi;
199 dcm[0][1] = -cosPhi * sinPsi + sinPhi * sinThe * cosPsi;
200 dcm[0][2] = sinPhi * sinPsi + cosPhi * sinThe * cosPsi;
202 dcm[1][0] = cosThe * sinPsi;
203 dcm[1][1] = cosPhi * cosPsi + sinPhi * sinThe * sinPsi;
204 dcm[1][2] = -sinPhi * cosPsi + cosPhi * sinThe * sinPsi;
207 dcm[2][1] = sinPhi * cosThe;
208 dcm[2][2] = cosPhi * cosThe;
MAVLINK_HELPER void mavlink_euler_to_dcm(float roll, float pitch, float yaw, float dcm[3][3])
MAVLINK_HELPER void mavlink_dcm_to_euler(const float dcm[3][3], float *roll, float *pitch, float *yaw)
MAVLINK_HELPER void mavlink_quaternion_to_euler(const float quaternion[4], float *roll, float *pitch, float *yaw)
MAVLINK_HELPER void mavlink_quaternion_to_dcm(const float quaternion[4], float dcm[3][3])
MAVLINK_HELPER void mavlink_euler_to_quaternion(float roll, float pitch, float yaw, float quaternion[4])
MAVLINK_HELPER void mavlink_dcm_to_quaternion(const float dcm[3][3], float quaternion[4])