SigPack - the C++ signal processing library
 
Loading...
Searching...
No Matches
kalman.h
Go to the documentation of this file.
1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4#ifndef KALMAN_H
5#define KALMAN_H
6
7#include <functional>
8
9namespace sp
10{
11#define FCN_XUW [=]( arma::mat x, arma::mat u, arma::mat w ) // Lambda function f(x,u,w) ([capture] by copy)
12using fcn_t = std::function<double( arma::mat, arma::mat, arma::mat )>;
13using fcn_v = std::vector<fcn_t>;
14using fcn_m = std::vector<fcn_v>;
15
24arma_inline arma::mat eval_fcn( const fcn_v f, const arma::mat& x, const arma::mat& u, const arma::mat& w )
25{
26 arma::mat y( ( arma::uword )( f.size() ), 1, arma::fill::zeros );
27 for( arma::uword n = 0; n < y.n_rows; n++ )
28 y( n, 0 ) = f[n]( x, u, w );
29 return y;
30}
31
39arma_inline arma::mat eval_fcn( const fcn_v f, const arma::mat& x, const arma::mat& u )
40{
41 arma::mat w0( 0, 0, arma::fill::zeros );
42 return eval_fcn( f, x, u, w0 );
43}
44
51arma_inline arma::mat eval_fcn( const fcn_v f, const arma::mat& x )
52{
53 arma::mat w0( 0, 0, arma::fill::zeros );
54 arma::mat u0( w0 );
55 return eval_fcn( f, x, u0, w0 );
56}
57
79arma_inline void lti2discr( const arma::mat& F, const arma::mat& W, const arma::mat& Qc, const double dT, arma::mat& A, arma::mat& Q )
80{
81 arma::uword M = F.n_rows;
82
83 // Solve A
84 A = arma::expmat( F * dT );
85
86 // Solve Q by using matrix fraction decomposition
87 arma::mat AB = arma::zeros( 2 * M, M );
88 arma::mat CD = arma::zeros( 2 * M, 2 * M );
89 arma::mat EF = arma::zeros( 2 * M, M );
90 EF.submat( M, 0, 2 * M - 1, M - 1 ) = arma::eye( M, M );
91 CD.submat( 0, 0, M - 1, M - 1 ) = F;
92 CD.submat( M, M, 2 * M - 1, 2 * M - 1 ) = -F.t();
93 CD.submat( 0, M, M - 1, 2 * M - 1 ) = W * Qc * W.t();
94
95 AB = arma::expmat( CD * dT ) * EF;
96
97 Q = AB.rows( 0, M - 1 ) * arma::inv( AB.rows( M, 2 * M - 1 ) );
98}
99
104
124class KF
125{
126 protected:
127 arma::uword N;
128 arma::uword M;
129 arma::uword L;
130 bool lin_proc;
131 bool lin_meas;
132 arma::mat x;
133 arma::mat z_err;
134 arma::mat A;
135 arma::mat B;
136 arma::mat H;
137 arma::mat P;
138 arma::mat Q;
139 arma::mat R;
140 arma::mat K;
143 public:
147 KF( arma::uword _N, arma::uword _M, arma::uword _L )
148 {
149 N = _N; // Nr of states
150 M = _M; // Nr of measurements/observations
151 L = _L; // Nr of inputs
152 lin_proc = true;
153 lin_meas = true;
154 x.set_size( N, 1 );
155 x.zeros();
156 z_err.set_size( M, 1 );
157 z_err.zeros();
158 A.set_size( N, N );
159 A.eye();
160 B.set_size( N, L );
161 B.zeros();
162 H.set_size( M, N );
163 H.zeros();
164 P.set_size( N, N );
165 P.eye();
166 Q.set_size( N, N );
167 Q.eye();
168 R.set_size( M, M );
169 R.eye();
170 K.set_size( N, M );
171 K.zeros();
172 }
173
178 {
179 }
180
184 void clear( void )
185 {
186 K.zeros();
187 P.eye();
188 x.zeros();
189 }
190
192 // Set/get functions
194 void set_state_vec( const arma::mat& _x )
195 {
196 x = _x;
197 } // Set state vector.[Nx1]
198
199 void set_trans_mat( const arma::mat& _A )
200 {
201 A = _A;
202 } // Set state transition matrix.[NxN]
203
204 void set_control_mat( const arma::mat& _B )
205 {
206 B = _B;
207 } // Set input matrix.[NxL]
208
209 void set_meas_mat( const arma::mat& _H )
210 {
211 H = _H;
212 } // Set measurement matrix.[MxN]
213
214 void set_err_cov( const arma::mat& _P )
215 {
216 P = _P;
217 } // Set error covariance matrix.[NxN]
218
219 void set_proc_noise( const arma::mat& _Q )
220 {
221 Q = _Q;
222 } // Set process noise cov. matrix.
223
224 void set_meas_noise( const arma::mat& _R )
225 {
226 R = _R;
227 } // Set meas noise cov. matrix.
228
229 void set_kalman_gain( const arma::mat& _K )
230 {
231 K = _K;
232 } // Set Kalman gain matrix.[NxM]
233
234 void set_trans_fcn( fcn_v _f ) // Set state transition functions
235 {
236 f = _f;
237 lin_proc = false;
238 }
239
240 void set_meas_fcn( fcn_v _h ) // Set measurement functions
241 {
242 h = _h;
243 lin_meas = false;
244 }
245
246 arma::mat get_state_vec( void )
247 {
248 return x;
249 } // Get states [Nx1]
250
251 arma::mat get_err( void )
252 {
253 return z_err;
254 } // Get pred error [Mx1]
255
256 arma::mat get_kalman_gain( void )
257 {
258 return K;
259 } // Get Kalman gain [NxM]
260
261 arma::mat get_err_cov( void )
262 {
263 return P;
264 } // Get error cov matrix [NxN]
265
270 void predict( const arma::mat u )
271 {
272 x = A * x + B * u; // New state
273 P = A * P * A.t() + Q; // New error covariance
274 }
275
279 void predict( void )
280 {
281 arma::mat u0( L, 1, arma::fill::zeros );
282 predict( u0 );
283 }
284
288 void update( const arma::mat z )
289 {
290 // Compute the Kalman gain
291 K = P * H.t() * inv( H * P * H.t() + R );
292
293 // Update estimate with measurement z
294 z_err = z - H * x;
295 x = x + K * z_err;
296
297 // Joseph’s form covariance update
298 arma::mat Jf = arma::eye<arma::mat>( N, N ) - K * H;
299 P = Jf * P * Jf.t() + K * R * K.t();
300 }
301
307 void rts_smooth( const arma::mat& Xf, const arma::cube& Pf, arma::mat& Xs, arma::cube& Ps )
308 {
309 arma::uword Nf = Xf.n_cols;
310 arma::mat X_pred( N, 1 );
311 arma::mat P_pred( N, N );
312 arma::mat C( N, N );
313
314 // Copy forward data
315 Xs = Xf;
316 Ps = Pf;
317
318 // Backward filter
319 for( arma::uword n = Nf - 2; n > 0; n-- )
320 {
321 // Project state and error covariance
322 X_pred = A * Xf.col( n );
323 P_pred = A * Pf.slice( n ) * A.t() + Q;
324
325 // Update
326 C = Pf.slice( n ) * A.t() * inv( P_pred );
327 Xs.col( n ) += C * ( Xs.col( n + 1 ) - X_pred );
328 Ps.slice( n ) += C * ( Ps.slice( n + 1 ) - P_pred ) * C.t();
329 }
330 }
331}; // End class KF
332
355class EKF : public KF
356{
357 protected:
360 double dx;
361 public:
362 EKF( arma::uword _N, arma::uword _M, arma::uword _L ) : KF( _N, _M, _L )
363 {
364 dx = 1e-7; // Default diff step size
365 }
366
368 // Set/get functions
370 void set_diff_step( double _dx )
371 {
372 dx = _dx;
373 } // Set diff step size
374
376 {
377 f_jac = _f;
378 } // Set EKF state transition jacobian
379
381 {
382 h_jac = _h;
383 } // Set EKF measurement transition jacobian
384
395 void jacobian_diff( arma::mat& _F, fcn_v _f, const arma::mat& _x )
396 {
397 arma::uword nC = _F.n_cols;
398 arma::uword nR = static_cast<arma::uword>( _f.size() );
399 arma::mat z0( nC, 1, arma::fill::zeros ); // Zero matrix, assume dim u and w <= states
400
401 if( nR == 0 || nR != _F.n_rows )
402 err_handler( "Function list is empty or wrong size" );
403
404 for( arma::uword c = 0; c < nC; c++ )
405 {
406 arma::mat xp( _x );
407 arma::mat xm( _x );
408 xp( c, 0 ) += dx;
409 xm( c, 0 ) -= dx;
410
411 // Finite diff approx, evaluate at x,u=0,w=0
412 for( arma::uword r = 0; r < nR; r++ )
413 _F( r, c ) = ( _f[r]( xp, z0, z0 ) - _f[r]( xm, z0, z0 ) ) / ( 2 * dx );
414 }
415 }
416
423 void jacobian_diff( arma::mat& _F, fcn_v _f )
424 {
425 jacobian_diff( _F, _f, x ); // Use current state from object
426 }
427
434 void jacobian_analytical( arma::mat& _F, fcn_m _f_m, const arma::mat& _x )
435 {
436 arma::uword nC = _F.n_cols;
437 arma::uword nR = static_cast<arma::uword>( _f_m.size() );
438
439 if( nR == 0 || nR != _F.n_rows )
440 err_handler( "Function list is empty or wrong size" );
441
442 arma::mat z0( nC, 1, arma::fill::zeros ); // Zero matrix, assume dim u and w <= states
443 for( arma::uword c = 0; c < nC; c++ )
444 {
445 for( arma::uword r = 0; r < nR; r++ )
446 _F( r, c ) = _f_m[r][c]( _x, z0, z0 );
447 }
448 }
449
455 void jacobian_analytical( arma::mat& _F, fcn_m _f_m )
456 {
457 jacobian_analytical( _F, _f_m, x ); // Use current state from object
458 }
459
464 void predict( const arma::mat u )
465 {
466 if( !lin_proc )
467 {
468 // Update A with jacobian approx or analytical if set
469 if( f_jac.size() > 0 )
471 else
472 jacobian_diff( A, f );
473
474 // Predict state x+ = f(x,u,0)
475 x = eval_fcn( f, x, u );
476 }
477 else // Linear process
478 x = A * x + B * u;
479
480 // Project error covariance
481 P = A * P * A.t() + Q;
482 }
483
487 void predict( void )
488 {
489 arma::mat u0( L, 1, arma::fill::zeros );
490 predict( u0 );
491 }
492
496 void update( const arma::mat z )
497 {
498 arma::mat z_hat( M, 1 );
499
500 if( !lin_meas ) // Nonlinear measurement
501 {
502 // Update H with jacobian approx or analytical if set
503 if( h_jac.size() > 0 )
505 else
506 jacobian_diff( H, h );
507
508 // Update measurement
509 z_hat = eval_fcn( h, x );
510 }
511 else // Linear meas
512 z_hat = H * x;
513
514 // Calc residual
515 z_err = z - z_hat;
516
517 // Compute the Kalman gain
518 K = P * H.t() * inv( H * P * H.t() + R );
519
520 // Update estimate with measurement residual
521 x = x + K * z_err;
522
523 // Joseph’s form covariance update
524 arma::mat Jf = arma::eye<arma::mat>( N, N ) - K * H;
525 P = Jf * P * Jf.t() + K * R * K.t();
526 }
527
533 void rts_smooth( const arma::mat& Xf, const arma::cube& Pf, arma::mat& Xs, arma::cube& Ps )
534 {
535 arma::uword Nf = Xf.n_cols;
536 arma::mat X_pred( N, 1 );
537 arma::mat P_pred( N, N );
538 arma::mat C( N, N );
539
540 // Copy forward data
541 Xs = Xf;
542 Ps = Pf;
543
544 // Backward filter
545 for( arma::uword n = Nf - 2; n > 0; n-- )
546 {
547 if( !lin_proc )
548 {
549 // Update A with jacobian approx or analytical if set
550 if( f_jac.size() > 0 )
551 jacobian_analytical( A, f_jac, Xf.col( n ) );
552 else
553 jacobian_diff( A, f, Xf.col( n ) );
554
555 // Project state
556 X_pred = eval_fcn( f, Xf.col( n ) );
557 }
558 else // Linear process
559 {
560 // Project state
561 X_pred = A * Xf.col( n );
562 }
563
564 // Project error covariance
565 P_pred = A * Pf.slice( n ) * A.t() + Q;
566
567 // Update
568 C = Pf.slice( n ) * A.t() * inv( P_pred );
569 Xs.col( n ) += C * ( Xs.col( n + 1 ) - X_pred );
570 Ps.slice( n ) += C * ( Ps.slice( n + 1 ) - P_pred ) * C.t();
571 }
572 }
573
574}; // End class EKF
575
590class UKF : public KF
591{
592 protected:
593 double alpha;
594 double beta;
595 double kappa;
596 double lambda;
597
598 arma::mat X;
599 arma::mat S;
600 arma::mat C;
601 arma::vec Wx;
602 arma::vec Wp;
603 public:
604 UKF( arma::uword _N, arma::uword _M, arma::uword _L ) : KF( _N, _M, _L )
605 {
606 alpha = 1e-3;
607 beta = 2.0;
608 kappa = 0;
609 lambda = alpha * alpha * ( _N + kappa ) - _N;
610 X.set_size( _N, 2 * _N + 1 );
611 X.zeros();
612 Wx.set_size( 2 * _N + 1 );
613 Wx.zeros();
614 Wp.set_size( 2 * _N + 1 );
615 Wp.zeros();
616 }
617
619 // Set/get functions
621 void set_alpha( double _a )
622 {
623 alpha = _a;
624 } // Set alpha
625
626 void set_beta( double _b )
627 {
628 beta = _b;
629 } // Set beta
630
631 void set_kappa( double _k )
632 {
633 kappa = _k;
634 } // Set kappa
635
636 void set_lambda( double _l )
637 {
638 lambda = _l;
639 } // Set lambda
640
644 void update_weights( void )
645 {
646 // Update lambda
647 lambda = alpha * alpha * ( N + kappa ) - N;
648
649 // Update weights
650 Wx( 0 ) = lambda / ( N + lambda );
651 Wp( 0 ) = lambda / ( N + lambda ) + ( 1 - alpha * alpha + beta );
652
653 for( arma::uword n = 1; n <= 2 * N; n++ )
654 {
655 Wx( n ) = 1 / ( 2 * ( N + lambda ) );
656 Wp( n ) = Wx( n );
657 }
658 }
659
665 void update_sigma( const arma::mat& _x, const arma::mat& _P )
666 {
667 // Update sigma points using Cholesky decomposition
668 arma::mat _A = sqrt( N + lambda ) * arma::chol( ( _P + _P.t() ) / 2, "lower" );
669
670 X = arma::repmat( _x, 1, 2 * N + 1 );
671 X.cols( 1, N ) += _A;
672 X.cols( N + 1, 2 * N ) -= _A;
673 }
674
678 arma::mat ut( const arma::mat& _x, const arma::mat& _P, const fcn_v _f )
679 {
680 arma::uword Ny = static_cast<arma::uword>( _f.size() );
681 arma::mat y( Ny, 1 );
682 S.set_size( Ny, Ny );
683 C.set_size( N, Ny );
684
686 update_sigma( _x, _P );
687
688 // Propagate sigma points through nonlinear function
689 arma::mat Xy( Ny, 2 * N + 1 );
690 for( arma::uword n = 0; n < 2 * N + 1; n++ )
691 Xy.col( n ) = eval_fcn( _f, X.col( n ) );
692
693 // New mean
694 y = Xy * Wx;
695
696 // New cov
697 S = ( Xy - arma::repmat( y, 1, 2 * N + 1 ) ) * arma::diagmat( Wp ) * ( Xy - arma::repmat( y, 1, 2 * N + 1 ) ).t();
698
699 // New crosscov
700 C = ( X - arma::repmat( _x, 1, 2 * N + 1 ) ) * arma::diagmat( Wp ) * ( Xy - arma::repmat( y, 1, 2 * N + 1 ) ).t();
701
702 return y;
703 }
704
709 void predict( const arma::mat u )
710 {
711 if( !lin_proc ) // Nonlinear process
712 {
713 // Do the Unscented Transform
714 x = ut( x, P, f ) + B * u;
715
716 // Add process noise cov
717 P = S + Q;
718 }
719 else // Linear process
720 {
721 // Project state
722 x = A * x + B * u;
723
724 // Project error covariance
725 P = A * P * A.t() + Q;
726 }
727 }
728
732 void predict( void )
733 {
734 arma::mat u0( L, 1, arma::fill::zeros );
735 predict( u0 );
736 }
737
741 void update( const arma::mat z )
742 {
743 arma::mat z_hat( M, 1 );
744 if( !lin_meas ) // Nonlinear measurement
745 {
746 // Do the Unscented Transform
747 z_hat = ut( x, P, h );
748
749 // Add measurement noise cov
750 S = S + R;
751
752 // Compute the Kalman gain
753 K = C * arma::inv( S );
754
755 // Update estimate with measurement residual
756 z_err = z - z_hat;
757 x = x + K * z_err;
758
759 // Update covariance, TODO: improve numerical perf. Josephs form?
760 P = P - K * S * K.t();
761 }
762 else // Linear measurement
763 {
764 // Calc residual
765 z_err = z - H * x;
766
767 // Compute the Kalman gain
768 K = P * H.t() * inv( H * P * H.t() + R );
769
770 // Update estimate with measurement residual
771 x = x + K * z_err;
772
773 // Joseph’s form covariance update
774 arma::mat Jf = arma::eye<arma::mat>( N, N ) - K * H;
775 P = Jf * P * Jf.t() + K * R * K.t();
776 }
777 }
778
784 void rts_smooth( const arma::mat& Xf, const arma::cube& Pf, arma::mat& Xs, arma::cube& Ps )
785 {
786 arma::uword Nf = Xf.n_cols;
787 arma::mat X_pred( N, 1, arma::fill::zeros );
788 arma::mat P_pred( N, N, arma::fill::zeros );
789 arma::mat D_pred( N, N, arma::fill::zeros );
790
791 // Copy forward data
792 Xs = Xf;
793 Ps = Pf;
794
795 // Backward filter
796 for( arma::uword k = Nf - 2; k > 0; k-- )
797 {
798 if( !lin_proc )
799 {
800 // Do the unscented transform
801 X_pred = ut( Xf.col( k ), Pf.slice( k ), f );
802 P_pred = S + Q;
803
804 // Update
805 D_pred = C * inv( P_pred );
806 Xs.col( k ) += D_pred * ( Xs.col( k + 1 ) - X_pred );
807 Ps.slice( k ) += D_pred * ( Ps.slice( k + 1 ) - P_pred ) * D_pred.t();
808 }
809 else // Linear process
810 {
811 // Project state
812 X_pred = A * Xf.col( k );
813
814 // Project error covariance
815 P_pred = A * Pf.slice( k ) * A.t() + Q;
816
817 // Update
818 D_pred = Pf.slice( k ) * A.t() * inv( P_pred );
819 Xs.col( k ) += D_pred * ( Xs.col( k + 1 ) - X_pred );
820 Ps.slice( k ) += D_pred * ( Ps.slice( k + 1 ) - P_pred ) * D_pred.t();
821 }
822 }
823 }
824}; // End class UKF
825} // namespace sp
826#endif // KALMAN_H
First order Extended Kalman filter class.
Definition kalman.h:356
Kalman filter class.
Definition kalman.h:125
Unscented Kalman filter class.
Definition kalman.h:591
void predict(void)
Predict the internal states, no control. Convenient function.
Definition kalman.h:732
double lambda
Definition kalman.h:596
arma::mat B
Input matrix.
Definition kalman.h:135
void predict(const arma::mat u)
Predict the internal states using a control input.
Definition kalman.h:464
void rts_smooth(const arma::mat &Xf, const arma::cube &Pf, arma::mat &Xs, arma::cube &Ps)
Rauch-Tung-Striebel smoother. See https://users.aalto.fi/~ssarkka/course_k2012/full_course_booklet_20...
Definition kalman.h:784
arma::mat A
State transition matrix.
Definition kalman.h:134
arma::mat get_err_cov(void)
Definition kalman.h:261
arma::vec Wx
Weights states.
Definition kalman.h:601
arma::mat H
Measurement matrix.
Definition kalman.h:136
arma::uword L
Number of measurements/observations.
Definition kalman.h:129
bool lin_proc
Linearity flag for process.
Definition kalman.h:130
void rts_smooth(const arma::mat &Xf, const arma::cube &Pf, arma::mat &Xs, arma::cube &Ps)
Rauch-Tung-Striebel smoother. See https://users.aalto.fi/~ssarkka/course_k2012/full_course_booklet_20...
Definition kalman.h:307
double alpha
Spread factor of sigma points.
Definition kalman.h:593
void jacobian_analytical(arma::mat &_F, fcn_m _f_m)
Evaluate Jacobian matrix using analytical jacobian.
Definition kalman.h:455
arma::mat C
Cross covariance input-output.
Definition kalman.h:600
void set_meas_jac(fcn_m _h)
Definition kalman.h:380
bool lin_meas
Linearity flag for measurement.
Definition kalman.h:131
arma::mat x
State vector.
Definition kalman.h:132
arma::mat Q
Process noise.
Definition kalman.h:138
arma::mat K
Kalman gain vector.
Definition kalman.h:140
KF(arma::uword _N, arma::uword _M, arma::uword _L)
Constructor.
Definition kalman.h:147
arma::mat get_state_vec(void)
Definition kalman.h:246
UKF(arma::uword _N, arma::uword _M, arma::uword _L)
Definition kalman.h:604
void set_beta(double _b)
Definition kalman.h:626
void update(const arma::mat z)
Correct and update the internal states. EKF.
Definition kalman.h:496
void set_state_jac(fcn_m _f)
Definition kalman.h:375
void clear(void)
Clear the internal states and pointer.
Definition kalman.h:184
fcn_m h_jac
Matrix of Extended Kalman measurement transition jacobian.
Definition kalman.h:359
void set_meas_noise(const arma::mat &_R)
Definition kalman.h:224
void set_state_vec(const arma::mat &_x)
Definition kalman.h:194
arma::mat get_err(void)
Definition kalman.h:251
void rts_smooth(const arma::mat &Xf, const arma::cube &Pf, arma::mat &Xs, arma::cube &Ps)
Rauch-Tung-Striebel smoother. See https://users.aalto.fi/~ssarkka/course_k2012/full_course_booklet_20...
Definition kalman.h:533
void set_diff_step(double _dx)
Definition kalman.h:370
void set_meas_mat(const arma::mat &_H)
Definition kalman.h:209
void set_meas_fcn(fcn_v _h)
Definition kalman.h:240
void predict(void)
Predict the internal states, no control.
Definition kalman.h:487
void set_err_cov(const arma::mat &_P)
Definition kalman.h:214
void jacobian_diff(arma::mat &_F, fcn_v _f, const arma::mat &_x)
Calculate and evaluate Jacobian matrix using finite difference approximation.
Definition kalman.h:395
void set_control_mat(const arma::mat &_B)
Definition kalman.h:204
void set_trans_mat(const arma::mat &_A)
Definition kalman.h:199
fcn_m f_jac
Matrix of Extended Kalman state transition jacobian.
Definition kalman.h:358
void jacobian_diff(arma::mat &_F, fcn_v _f)
Calculate and evaluate Jacobian matrix using finite difference approximation.
Definition kalman.h:423
double beta
x distr. prior knowledge factor
Definition kalman.h:594
void set_trans_fcn(fcn_v _f)
Definition kalman.h:234
arma::mat R
Measurement noise.
Definition kalman.h:139
void update(const arma::mat z)
Correct and update the internal states. UKF.
Definition kalman.h:741
void predict(void)
Predict the internal states, no control.
Definition kalman.h:279
void jacobian_analytical(arma::mat &_F, fcn_m _f_m, const arma::mat &_x)
Evaluate Jacobian matrix using analytical jacobian.
Definition kalman.h:434
~KF()
Destructor.
Definition kalman.h:177
fcn_v h
Vector of Kalman measurement functions.
Definition kalman.h:142
arma::mat get_kalman_gain(void)
Definition kalman.h:256
double kappa
Scaling par.
Definition kalman.h:595
arma::uword M
Number of inputs.
Definition kalman.h:128
void set_lambda(double _l)
Definition kalman.h:636
arma::uword N
Number of states.
Definition kalman.h:127
void update_sigma(const arma::mat &_x, const arma::mat &_P)
Calculate sigma points around a reference point.
Definition kalman.h:665
void set_kalman_gain(const arma::mat &_K)
Definition kalman.h:229
void set_proc_noise(const arma::mat &_Q)
Definition kalman.h:219
void update_weights(void)
Calculate sigma point weights.
Definition kalman.h:644
EKF(arma::uword _N, arma::uword _M, arma::uword _L)
Definition kalman.h:362
void predict(const arma::mat u)
Predict the internal states using a control input.
Definition kalman.h:709
arma::mat z_err
Prediction error.
Definition kalman.h:133
void set_kappa(double _k)
Definition kalman.h:631
arma::mat P
Error covariance matrix (estimated accuracy)
Definition kalman.h:137
double dx
Finite difference approximation step size.
Definition kalman.h:360
arma::mat ut(const arma::mat &_x, const arma::mat &_P, const fcn_v _f)
Calculate unscented transform.
Definition kalman.h:678
void predict(const arma::mat u)
Predict the internal states using a control input.
Definition kalman.h:270
arma::mat X
Sigma points.
Definition kalman.h:598
arma::vec Wp
Weights covariance.
Definition kalman.h:602
fcn_v f
Vector of Kalman state transition functions.
Definition kalman.h:141
void update(const arma::mat z)
Correct and update the internal states.
Definition kalman.h:288
arma::mat S
Output covariance.
Definition kalman.h:599
void set_alpha(double _a)
Definition kalman.h:621
#define err_handler(msg)
Definition base.h:212
Definition base.h:8
arma_inline void lti2discr(const arma::mat &F, const arma::mat &W, const arma::mat &Qc, const double dT, arma::mat &A, arma::mat &Q)
Discretize to a state transition and state noise cov matrix from an LTI system.
Definition kalman.h:79
std::vector< fcn_v > fcn_m
Definition kalman.h:14
std::function< double(arma::mat, arma::mat, arma::mat)> fcn_t
Definition kalman.h:12
std::vector< fcn_t > fcn_v
Definition kalman.h:13
arma_inline arma::mat eval_fcn(const fcn_v f, const arma::mat &x, const arma::mat &u, const arma::mat &w)
Evaluate function f(x,u,w)
Definition kalman.h:24