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
31#include "embedded_math.h"
32
33#define __PROGRAM_START 0
34#include "arm_math.h"
35
37
39{
40 float present_heading = q.get_heading();
41 if( present_heading <0.0f)
43
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] > 1e19)
70 return false; // some observations are still missing
71
72 return true; // complete
73}
74
76{
77// if( calibration_successful)
78// return false;
79
82 solution.numCols=PARAMETERS;
83 solution.numRows=PARAMETERS;
84 solution.pData = (float *)temporary_solution_matrix;
85
89
95
101
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
121
124
127
130
132 target_vector_inst.numCols=1;
134 target_vector_inst.pData=&(target_vector[axis][0]);
135
137 axis_parameter_set.numCols=1;
139 axis_parameter_set.pData=&(c[axis][0]);
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
163 {
164 if( ! calibration_successful)
165 return float3vector();
166
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 }
bool learn(const float3vector &observed_induction, const float3vector &expected_induction, const quaternion< float > &q, bool turning_right, float error_margin)
float3vector calibrate(const float3vector &induction, const quaternion< float > &q)
ROM float RECIP_SECTOR_SIZE
induction sensor calibration and magnetic disturbance compensation
defines platform-dependent algorithms and constants
#define TWO
#define M_PI_F
#define ROM
vector< float, 3 > float3vector
#define assert(x)
Definition vector.h:29