Larus glider flight sensor system
3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
compass_calibrator_3D.cpp
Go to the documentation of this file.
1
/***********************************************************************/
25
#define PRINT_PARAMETERS 1
26
#if PRINT_PARAMETERS
27
#include "stdio.h"
28
#endif
29
30
#include "
compass_calibrator_3D.h
"
31
#include "
embedded_math.h
"
32
33
#define __PROGRAM_START 0
34
#include "arm_math.h"
35
36
ROM
float
RECIP_SECTOR_SIZE
=
compass_calibrator_3D::OBSERVATIONS
/
M_PI_F
/
TWO
/
TWO
;
37
38
bool
compass_calibrator_3D::learn
(
const
float3vector
&
observed_induction
,
const
float3vector
&
expected_induction
,
const
quaternion<float>
&q,
bool
turning_right
,
float
error_margin
)
39
{
40
float
present_heading
= q.get_heading();
41
if
(
present_heading
<0.0f)
42
present_heading
+=
M_PI_F
*
TWO
;
43
44
unsigned
sector_index
= (
turning_right
?
OBSERVATIONS
/
TWO
: 0) + (
unsigned
)(
present_heading
*
RECIP_SECTOR_SIZE
);
45
46
if
( heading_sector_error[
sector_index
] <
error_margin
)
47
return
false
;
// we have collected more precise data for this observation earlier
48
49
heading_sector_error[
sector_index
] =
error_margin
;
50
51
for
(
unsigned
axis
= 0;
axis
<
AXES
; ++
axis
)
52
{
53
target_vector[
axis
][
sector_index
] =
expected_induction
[
axis
];
54
55
observation_matrix[
axis
][
sector_index
][0] = 1.0f;
56
observation_matrix[
axis
][
sector_index
][1] =
observed_induction
[
axis
];
57
observation_matrix[
axis
][
sector_index
][2] = q[0] * q[1];
58
observation_matrix[
axis
][
sector_index
][3] = q[0] * q[2];
59
observation_matrix[
axis
][
sector_index
][4] = q[0] * q[3];
60
observation_matrix[
axis
][
sector_index
][5] = q[1] * q[1];
61
observation_matrix[
axis
][
sector_index
][6] = q[1] * q[2];
62
observation_matrix[
axis
][
sector_index
][7] = q[1] * q[3];
63
observation_matrix[
axis
][
sector_index
][8] = q[2] * q[2];
64
observation_matrix[
axis
][
sector_index
][9] = q[2] * q[3];
65
observation_matrix[
axis
][
sector_index
][10]= q[3] * q[3];
66
}
67
68
for
(
unsigned
i
= 0;
i
<
OBSERVATIONS
; ++
i
)
69
if
( heading_sector_error[
i
] > 1
e19
)
70
return
false
;
// some observations are still missing
71
72
return
true
;
// complete
73
}
74
75
bool
compass_calibrator_3D::calculate
(
void
)
76
{
77
// if( calibration_successful)
78
// return false;
79
80
float
temporary_solution_matrix
[
PARAMETERS
][
PARAMETERS
];
81
arm_matrix_instance_f32
solution
;
82
solution
.numCols=
PARAMETERS
;
83
solution
.numRows=
PARAMETERS
;
84
solution
.pData = (
float
*)
temporary_solution_matrix
;
85
86
arm_matrix_instance_f32
observations
;
87
observations
.numCols=
PARAMETERS
;
88
observations
.numRows=
OBSERVATIONS
;
89
90
float
transposed_matrix
[
PARAMETERS
][
OBSERVATIONS
];
91
arm_matrix_instance_f32
observations_transposed
;
92
observations_transposed
.numCols=
OBSERVATIONS
;
93
observations_transposed
.numRows=
PARAMETERS
;
94
observations_transposed
.pData = (
float
*)
transposed_matrix
;
95
96
float
matrix_to_be_inverted_data
[
PARAMETERS
][
PARAMETERS
];
97
arm_matrix_instance_f32
matrix_to_be_inverted
;
98
matrix_to_be_inverted
.numCols=
PARAMETERS
;
99
matrix_to_be_inverted
.numRows=
PARAMETERS
;
100
matrix_to_be_inverted
.pData = (
float
*)
matrix_to_be_inverted_data
;
101
102
float
solution_mapping_data
[
PARAMETERS
][
OBSERVATIONS
];
103
arm_matrix_instance_f32
solution_mapping
;
104
solution_mapping
.numCols=
OBSERVATIONS
;
105
solution_mapping
.numRows=
PARAMETERS
;
106
solution_mapping
.pData = (
float
*)
solution_mapping_data
;
107
108
for
(
unsigned
axis
= 0;
axis
<
AXES
; ++
axis
)
109
{
110
observations
.pData = &(observation_matrix[
axis
][0][0]);
111
112
// calculation, once per axis (FRONT, RIGHT, DOWN):
113
// target vector: T = ideal induction values for all observations
114
// single measurement: < 1 induction q0q1 q0q2 q0q3 q1q1 q1q2 q1q3 q2q2 q2q3 q3q3 > (single row)
115
// measurement matrix: M = single measurement * # OBSERVATIONS
116
// solution matrix: S = inverse( M_transposed * M) * M_transposed
117
// axis parameter set: P = S * T
118
119
arm_status
result
=
arm_mat_trans_f32
( &
observations
, &
observations_transposed
);
120
assert
(
result
==
ARM_MATH_SUCCESS
);
121
122
result
=
arm_mat_mult_f32
( &
observations_transposed
, &
observations
, &
matrix_to_be_inverted
);
123
assert
(
result
==
ARM_MATH_SUCCESS
);
124
125
result
=
arm_mat_inverse_f32
( &
matrix_to_be_inverted
, &
solution
);
126
assert
(
result
==
ARM_MATH_SUCCESS
);
127
128
result
=
arm_mat_mult_f32
( &
solution
, &
observations_transposed
, &
solution_mapping
);
129
assert
(
result
==
ARM_MATH_SUCCESS
);
130
131
arm_matrix_instance_f32
target_vector_inst
;
132
target_vector_inst
.numCols=1;
133
target_vector_inst
.numRows=
OBSERVATIONS
;
134
target_vector_inst
.pData=&(target_vector[
axis
][0]);
135
136
arm_matrix_instance_f32
axis_parameter_set
;
137
axis_parameter_set
.numCols=1;
138
axis_parameter_set
.numRows=
PARAMETERS
;
139
axis_parameter_set
.pData=&(c[
axis
][0]);
140
result
=
arm_mat_mult_f32
( &
solution_mapping
, &
target_vector_inst
, &
axis_parameter_set
);
141
assert
(
result
==
ARM_MATH_SUCCESS
);
142
}
143
144
calibration_successful =
true
;
145
146
#if PRINT_PARAMETERS
147
148
for
(
unsigned
k
=0;
k
<3; ++
k
)
149
{
150
for
(
unsigned
i
=0;
i
<
PARAMETERS
; ++
i
)
151
printf
(
"%e\t"
, (
double
)(c[
k
][
i
]));
152
printf
(
"\n"
);
153
}
154
printf
(
"\n"
);
155
#endif
156
157
start_learning
();
// ... again
158
159
return
true
;
160
}
161
162
float3vector
compass_calibrator_3D::calibrate
(
const
float3vector
&
induction
,
const
quaternion<float>
&q)
163
{
164
if
( ! calibration_successful)
165
return
float3vector
();
166
167
float3vector
retv
;
168
for
(
int
i
= 0;
i
< 3; ++
i
)
169
{
170
retv
[
i
] =
171
c[
i
][0] + c[
i
][1] *
induction
[
i
] +
172
c[
i
][2] * q[0] * q[1] + c[
i
][3] * q[0] * q[2] + c[
i
][4] * q[0] * q[3] +
173
c[
i
][5] * q[1] * q[1] + c[
i
][6] * q[1] * q[2] + c[
i
][7] * q[1] * q[3] +
174
c[
i
][8] * q[2] * q[2] + c[
i
][9] * q[2] * q[3] + c[
i
][10]* q[3] * q[3] ;
175
}
176
return
retv
;
177
}
compass_calibrator_3D::PARAMETERS
@ PARAMETERS
Definition
compass_calibrator_3D.h:37
compass_calibrator_3D::OBSERVATIONS
@ OBSERVATIONS
Definition
compass_calibrator_3D.h:37
compass_calibrator_3D::AXES
@ AXES
Definition
compass_calibrator_3D.h:37
compass_calibrator_3D::calculate
bool calculate(void)
Definition
compass_calibrator_3D.cpp:75
compass_calibrator_3D::learn
bool learn(const float3vector &observed_induction, const float3vector &expected_induction, const quaternion< float > &q, bool turning_right, float error_margin)
Definition
compass_calibrator_3D.cpp:38
compass_calibrator_3D::start_learning
void start_learning(void)
Definition
compass_calibrator_3D.h:45
compass_calibrator_3D::calibrate
float3vector calibrate(const float3vector &induction, const quaternion< float > &q)
Definition
compass_calibrator_3D.cpp:162
vector< float, 3 >
RECIP_SECTOR_SIZE
ROM float RECIP_SECTOR_SIZE
Definition
compass_calibrator_3D.cpp:36
compass_calibrator_3D.h
induction sensor calibration and magnetic disturbance compensation
embedded_math.h
defines platform-dependent algorithms and constants
TWO
#define TWO
Definition
embedded_math.h:51
M_PI_F
#define M_PI_F
Definition
embedded_math.h:54
ROM
#define ROM
Definition
embedded_memory.h:30
float3vector
vector< float, 3 > float3vector
Definition
float3vector.h:12
assert
#define assert(x)
Definition
vector.h:29
lib
NAV_Algorithms
compass_calibrator_3D.cpp
Generated by
1.9.8