56 float wx = u[0] -
x(4, 0);
57 float wy = u[1] -
x(5, 0);
58 float wz = u[2] -
x(6, 0);
60 float w[] = {wx, wy, wz};
68 Xdot.
Copy(qdot, 0, 0);
77 float w[3] = {(u[0] -
x(4, 0)), (u[1] -
x(5, 0)), (u[2] -
x(6, 0))};
107 for (
size_t i = 0; i < 7; i++) {
110 printf(
"Allocate data = %i\n", this->
NUMU);
111 float *test_u =
new float[this->
NUMU];
112 for (
size_t i = 0; i < this->
NUMU; i++) {
122 float pi = std::atan(1) * 4;
123 float gyro_err_data[] = {0.1, 0.2, 0.3};
126 for (
size_t i = 0; i < 10; i++) {
130 float accel0_data[] = {0, 0, 1};
131 float magn0_data[] = {1, 0, 0};
147 std::cout <<
"Gyro error: " << gyro_err.
t() << std::endl;
148 for (
size_t n = 1;
n < total_N * 3;
n++) {
149 if ((
n % 1000) == 0) {
150 std::cout <<
"Loop " <<
n <<
" from " << total_N * 16;
151 std::cout <<
", State data : " << this->
X.t();
154 if ((
n >= (total_N / 2)) && (
n < total_N * 12)) {
155 gyro_data(0, 0) = 1 / pi * std::cos(-pi / 2 + pi / 2 * count * 2 / (total_N / 10));
156 gyro_data(1, 0) = 2 / pi * std::cos(-pi / 2 + pi / 2 * count * 2 / (total_N / 10));
157 gyro_data(2, 0) = 3 / pi * std::cos(-pi / 2 + pi / 2 * count * 2 / (total_N / 10));
160 dspm::Mat gyro_sample = gyro_data + gyro_err;
173 float input_u[] = {gyro_sample(0, 0), gyro_sample(1, 0), gyro_sample(2, 0)};
177 q_norm /= q_norm.
norm();
179 if (
true == enable_att) {
185 std::cout <<
"Final State data : " << this->
X.t() << std::endl;
196 H.
Copy(dAccel_dq, 3, 0);
200 dspm::Mat magn_offset(&this->
X.data[10], 3, 1);
202 H.
Copy(dMagn_dq, 0, 0);
204 dspm::Mat expected_magn = Re * magn + magn_offset;
207 float measured_data[6];
208 float expected_data[6];
209 for (
size_t i = 0; i < 3; i++) {
210 measured_data[i] = magn_data[i];
211 expected_data[i] = expected_magn.
data[i];
212 measured_data[i + 3] = accel_data[i];
213 expected_data[i + 3] = expected_accel.
data[i];
216 this->
Update(H, measured_data, expected_data, R);
232 H.
Copy(dAccel_dq, 3, 0);
236 dspm::Mat magn_offset(&this->
X.data[10], 3, 1);
238 H.
Copy(dMagn_dq, 0, 0);
240 dspm::Mat expected_magn = Re * magn + magn_offset;
243 float measured_data[6];
244 float expected_data[6];
245 for (
size_t i = 0; i < 3; i++) {
246 measured_data[i] = magn_data[i];
247 expected_data[i] = expected_magn.
data[i];
248 measured_data[i + 3] = accel_data[i];
249 expected_data[i + 3] = expected_accel.
data[i];
252 this->
Update(H, measured_data, expected_data, R);
266 H.
Copy(dAccel_dq, 3, 0);
269 dspm::Mat magn_offset(&this->
X.data[10], 3, 1);
271 H.
Copy(dMagn_dq, 0, 0);
276 dspm::Mat expected_magn = Re * magn + magn_offset;
279 float measured_data[10];
280 float expected_data[10];
281 for (
size_t i = 0; i < 3; i++) {
282 measured_data[i] = magn_data[i];
283 expected_data[i] = expected_magn.
data[i];
284 measured_data[i + 3] = accel_data[i];
285 expected_data[i + 3] = expected_accel.
data[i];
287 for (
size_t i = 0; i < 4; i++) {
288 measured_data[i + 6] = attitude[i];
289 expected_data[i + 6] = this->
X.data[i];
292 this->
Update(H, measured_data, expected_data, R);
Mat Get(int row_start, int row_size, int col_start, int col_size)
void Copy(const Mat &src, int row_pos, int col_pos)
void TestFull(bool enable_att)
virtual ~ekf_imu13states()
void UpdateRefMeasurement(float *accel_data, float *magn_data, float R[6])
virtual void LinearizeFG(dspm::Mat &x, float *u)
void UpdateRefMeasurementMagn(float *accel_data, float *magn_data, float R[6])
virtual dspm::Mat StateXdot(dspm::Mat &x, float *u)
static dspm::Mat rotm2quat(dspm::Mat &R)
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])
static dspm::Mat eul2rotm(float xyz[3])
virtual void Update(dspm::Mat &H, float *measured, float *expected, float *R)
static dspm::Mat qProduct(float *q)
static dspm::Mat SkewSym4x4(float *w)