72 int16
solve(
const std::array<floating_point, N> &initial_guess,
75 const std::array<floating_point, M> *measurements_pointer,
76 const floating_point *time_pointer,
77 const std::array<floating_point, O> *obs_state_pointer,
78 const uint32 num_measurements,
79 const uint32 max_iterations,
80 const floating_point tolerance,
81 const floating_point max_step_size,
83 std::array<floating_point, N> *state_estimate);
85 std::array<floating_point, N + N*N> _full_state_initial;
86 std::array<floating_point, N + N*N> _full_state_post;
88 floating_point _max_shift;
94 floating_point t_start;
95 floating_point t_current;
96 floating_point t_next;
109 std::array<floating_point, N> _dx_plus;
112 std::array<floating_point, N> _x0;
113 std::array<floating_point, N> _x_prop;
119 std::array<floating_point, M> _residual;
122 std::array<floating_point, M*N> _tmp_H_array;
127 floating_point _I_flat[N * N];
128 floating_point _y_temp[N];
158 const std::array<floating_point, N> &initial_guess,
161 const std::array<floating_point, M> *measurements_pointer,
162 const floating_point *time_pointer,
163 const std::array<floating_point, O> *obs_state_pointer,
164 const uint32 num_measurements,
165 const uint32 max_iterations,
166 const floating_point tolerance,
167 const floating_point max_step_size,
169 std::array<floating_point, N> *state_estimate) {
172 if(state_estimate ==
nullptr || covariance_estimate ==
nullptr) {
177 _max_shift = tolerance + 1.0;
182 for(uint32 i = 0; i < N; i++) {
183 _x0[i] = initial_guess[i];
187 for(uint32 i = 0; i < N; i++) {
192 _ekf_meas_update.setMeasurementNoiseMatrix(R);
207 while(_max_shift > tolerance && _num_iter < max_iterations) {
210 _error = P0.
chol(_tmp_chol);
211 if(_error) {
return _error;}
212 _error = _tmp_chol.inverse(_tmp_chol_inv);
213 if(_error) {
return _error;}
216 _I_matrix = _tmp_chol_inv*_tmp_chol_inv.transpose();
217 _N_vector = _I_matrix*_dx_minus;
220 for(_meas_idx = 0; _meas_idx < num_measurements; _meas_idx++) {
225 unsigned int one_idx = N;
226 for(
unsigned int i = 0; i < N + N*N; i++) {
228 _full_state_initial[i] = _x_prop[i];
229 }
else if(i == one_idx) {
230 _full_state_initial[i] = 1.0;
231 one_idx = one_idx + N + 1;
233 _full_state_initial[i] = 0.0;
235 _full_state_post[i] = _full_state_initial[i];
239 for(
unsigned int i = 0; i < N + N*N; i++) {
240 _full_state_initial[i] = _full_state_post[i];
245 if (_meas_idx == 0) {
246 t_start = time_pointer[0];
248 t_start = time_pointer[_meas_idx - 1];
253 while(t_current < time_pointer[_meas_idx]) {
254 if (time_pointer[_meas_idx] - t_current > max_step_size) {
255 t_next = t_current + max_step_size;
257 t_next = time_pointer[_meas_idx];
260 _error = _integrator.step(t_current, t_next, _full_state_initial, _full_state_post);
266 for(
unsigned int i = 0; i < N + N*N; i++) {
267 _full_state_initial[i] = _full_state_post[i];
273 for(uint32 i = 0; i < N; i++) {
274 _x_prop[i] = _full_state_post[i];
278 _phi.setFromArray(&_full_state_post[N]);
279 _phi.transpose(_phi_transpose);
282 _error = _ekf_meas_update.generateResidual(
283 time_pointer[_meas_idx],
285 obs_state_pointer[_meas_idx],
286 measurements_pointer[_meas_idx],
294 _error = _measurement.calculateMeasurementsMatrix(
295 time_pointer[_meas_idx],
297 obs_state_pointer[_meas_idx],
303 _H.setFromArray(&_tmp_H_array[0]);
304 _H.transpose(_H_transpose);
324 _tmp_m_1.setFromArray(&_residual[0]);
334 for(uint32 i = 0; i < N; i++) {
335 _N_vector[i] += _tmp_n_1.get(i, 0);
340 _error = _I_matrix.chol(_tmp_chol);
341 if(_error) {
return _error;}
342 _error = _tmp_chol.inverse(_tmp_chol_inv);
343 if(_error) {
return _error;}
344 _tmp_n_n_1 = _tmp_chol_inv*_tmp_chol_inv.transpose();
347 for(uint32 i = 0; i < N; i++) {
349 for(uint32 j = 0; j < N; j++) {
350 _dx_plus[i] += _tmp_n_n_1[i][j]*_N_vector[j];
355 for(uint32 i = 0; i < N; i++) {
356 _x0[i] = initial_guess[i] + _dx_plus[i];
360 for(uint32 i = 0; i < N; i++) {
361 _dx_minus[i] = _dx_minus[i] + _dx_plus[i];
366 for(uint32 i = 0; i < N; i++) {
367 floating_point abs_shift = _dx_plus[i] >= 0.0 ? _dx_plus[i] : -_dx_plus[i];
368 if(abs_shift > _max_shift) {
369 _max_shift = abs_shift;
377 for(uint32 i = 0; i < N; i++) {
378 (*state_estimate)[i] = _x0[i]-initial_guess[i];
382 _error = _I_matrix.chol(_tmp_chol);
383 if(_error) {
return _error;}
384 _error = _tmp_chol.inverse(_tmp_chol_inv);
385 if(_error) {
return _error;}
386 *covariance_estimate = _tmp_chol_inv*_tmp_chol_inv.
transpose();
int16 solve(const std::array< floating_point, N > &initial_guess, const clockwerk::Matrix< N, N > &P0, const clockwerk::Matrix< M, M > &R, const std::array< floating_point, M > *measurements_pointer, const floating_point *time_pointer, const std::array< floating_point, O > *obs_state_pointer, const uint32 num_measurements, const uint32 max_iterations, const floating_point tolerance, const floating_point max_step_size, clockwerk::Matrix< N, N > *covariance_estimate, std::array< floating_point, N > *state_estimate)
Function to solve the nonlinear least squares problem.
Definition NonlinearLeastSquares.hpp:157