26 Q(*new
dspm::Mat(w, w))
33 this->
HP =
new float[this->
NUMX];
34 this->
Km =
new float[this->
NUMX];
35 for (
size_t i = 0; i < this->
NUMX; i++) {
63 float dt2 = dt / 2.0f;
67 x = Xlast + (K1 * dt2);
78 x = Xlast + (K1 + 2.0f * K2 + 2.0f * K3 + K4) * (dt / 6.0f);
90 result.
data[1] = -w[0];
91 result.
data[2] = -w[1];
92 result.
data[3] = -w[2];
94 result.
data[4] = w[0];
96 result.
data[6] = w[2];
97 result.
data[7] = -w[1];
99 result.
data[8] = w[1];
100 result.
data[9] = -w[2];
102 result.
data[11] = w[0];
104 result.
data[12] = w[2];
105 result.
data[13] = w[1];
106 result.
data[14] = -w[0];
116 result.
data[0] = q[0];
117 result.
data[1] = -q[1];
118 result.
data[2] = -q[2];
119 result.
data[3] = -q[3];
121 result.
data[4] = q[1];
122 result.
data[5] = q[0];
123 result.
data[6] = -q[3];
124 result.
data[7] = q[2];
126 result.
data[8] = q[2];
127 result.
data[9] = q[3];
128 result.
data[10] = q[0];
129 result.
data[11] = -q[1];
131 result.
data[12] = q[3];
132 result.
data[13] = -q[2];
133 result.
data[14] = q[1];
134 result.
data[15] = q[0];
146 this->
P = ((f * this->
P) * f_t) + (dt * dt) * ((
G *
Q) *
G.t());
155 for (
int m = 0;
m < H.
rows;
m++) {
156 for (
int j = 0; j < this->
NUMX; j++) {
160 for (
int k = 0;
k < this->NUMX;
k++) {
161 for (
int j = 0; j < this->NUMX; j++) {
163 HP[j] += H(
m,
k) *
P(
k, j);
167 for (
int k = 0;
k < this->NUMX;
k++) {
168 HPHR +=
HP[
k] * H(
m,
k);
170 float invHPHR = 1.0f / HPHR;
171 for (
int k = 0;
k < this->NUMX;
k++) {
174 for (
int i = 0; i < this->NUMX; i++) {
176 for (
int j = i; j <
NUMX; j++) {
177 P(i, j) =
P(j, i) =
P(i, j) -
Km[i] *
HP[j];
181 Error = Y(
m, 0) - Z(
m, 0);
182 for (
int i = 0; i < this->NUMX; i++) {
184 X(i, 0) =
X(i, 0) +
Km[i] * Error;
193 for (
size_t i = 0; i < H.
rows; i++) {
206 this->
X += (
K * Err);
217 Rm(0, 0) = q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3;
218 Rm(1, 0) = 2.0f * (q1 * q2 + q0 * q3);
219 Rm(2, 0) = 2.0f * (q1 * q3 - q0 * q2);
220 Rm(0, 1) = 2.0f * (q1 * q2 - q0 * q3);
221 Rm(1, 1) = (q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3);
222 Rm(2, 1) = 2.0f * (q2 * q3 + q0 * q1);
223 Rm(0, 2) = 2.0f * (q1 * q3 + q0 * q2);
224 Rm(1, 2) = 2.0f * (q2 * q3 - q0 * q1);
225 Rm(2, 2) = (q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3);
233 float R13, R11, R12, R23, R33;
234 float q0s = q[0] * q[0];
235 float q1s = q[1] * q[1];
236 float q2s = q[2] * q[2];
237 float q3s = q[3] * q[3];
239 R13 = 2.0f * (q[1] * q[3] + q[0] * q[2]);
240 R11 = q0s + q1s - q2s - q3s;
241 R12 = -2.0f * (q[1] * q[2] - q[0] * q[3]);
242 R23 = -2.0f * (q[2] * q[3] - q[0] * q[1]);
243 R33 = q0s - q1s - q2s + q3s;
245 result.
data[1] = (asinf(R13));
246 result.
data[2] = (atan2f(R12, R11));
247 result.
data[0] = (atan2f(R23, R33));
254 float Cx = std::cos(xyz[0]);
255 float Sx = std::sin(xyz[0]);
256 float Cy = std::cos(xyz[1]);
257 float Sy = std::sin(xyz[1]);
258 float Cz = std::cos(xyz[2]);
259 float Sz = std::sin(xyz[2]);
261 result(0, 0) = Cy * Cz;
262 result(0, 1) = -Cy * Sz;
265 result(1, 0) = Cz * Sx * Sy + Cx * Sz;
266 result(1, 1) = Cx * Cz - Sx * Sy * Sz;
267 result(1, 2) = -Cy * Sx;
269 result(2, 0) = -Cx * Cz * Sy + Sx * Sz;
270 result(2, 1) = Cz * Sx + Cx * Sy * Sz;
271 result(2, 2) = Cx * Cy;
276#define FLT_EPSILON 1.192092896e-07F
284 float cy = sqrtf(rotm(2, 2) * rotm(2, 2) + rotm(1, 2) * rotm(1, 2));
286 x = -atan2f(rotm(1, 2), rotm(2, 2));
287 y = -atan2f(-rotm(0, 2), (
float)cy);
288 z = -atan2f(rotm(0, 1), rotm(0, 0));
290 z = -atan2f(-rotm(1, 0), rotm(1, 1));
291 y = -atan2f(-rotm(0, 2), (
float)cy);
302 return (
x >= 0.0f) ? +1.0f : -1.0f;
316 float q0 = (r11 + r22 + r33 + 1.0f) / 4.0f;
317 float q1 = (r11 - r22 - r33 + 1.0f) / 4.0f;
318 float q2 = (-r11 + r22 - r33 + 1.0f) / 4.0f;
319 float q3 = (-r11 - r22 + r33 + 1.0f) / 4.0f;
336 if (q0 >= q1 && q0 >= q2 && q0 >= q3) {
338 q1 *=
SIGN(r32 - r23);
339 q2 *=
SIGN(r13 - r31);
340 q3 *=
SIGN(r21 - r12);
341 }
else if (q1 >= q0 && q1 >= q2 && q1 >= q3) {
342 q0 *=
SIGN(r32 - r23);
344 q2 *=
SIGN(r21 + r12);
345 q3 *=
SIGN(r13 + r31);
346 }
else if (q2 >= q0 && q2 >= q1 && q2 >= q3) {
347 q0 *=
SIGN(r13 - r31);
348 q1 *=
SIGN(r21 + r12);
350 q3 *=
SIGN(r32 + r23);
351 }
else if (q3 >= q0 && q3 >= q1 && q3 >= q2) {
352 q0 *=
SIGN(r21 - r12);
353 q1 *=
SIGN(r31 + r13);
354 q2 *=
SIGN(r32 + r23);
virtual dspm::Mat StateXdot(dspm::Mat &x, float *u)
static dspm::Mat rotm2quat(dspm::Mat &R)
static dspm::Mat dFdq(dspm::Mat &vector, dspm::Mat &quat)
virtual void LinearizeFG(dspm::Mat &x, float *u)=0
static dspm::Mat dFdq_inv(dspm::Mat &vector, dspm::Mat &quat)
virtual void Process(float *u, float dt)
static dspm::Mat quat2rotm(float q[4])
virtual void CovariancePrediction(float dt)
static dspm::Mat eul2rotm(float xyz[3])
static dspm::Mat rotm2eul(dspm::Mat &rotm)
virtual void Update(dspm::Mat &H, float *measured, float *expected, float *R)
void RungeKutta(dspm::Mat &x, float *u, float dt)
static dspm::Mat quat2eul(const float q[4])
virtual void UpdateRef(dspm::Mat &H, float *measured, float *expected, float *R)
static dspm::Mat qProduct(float *q)
static dspm::Mat SkewSym4x4(float *w)
static float SIGN(float x)