]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/Algorithms/KalmanFilter.h
...
[cpPlugins.git] / lib / cpExtensions / Algorithms / KalmanFilter.h
1 // -------------------------------------------------------------------------
2 // @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
3 // -------------------------------------------------------------------------
4
5 #ifndef __CPEXTENSIONS__ALGORITHMS__KALMANFILTER__H__
6 #define __CPEXTENSIONS__ALGORITHMS__KALMANFILTER__H__
7
8 #include <cpExtensions/cpExtensions_Export.h>
9
10 #include <itkObject.h>
11 #include <itkObjectFactory.h>
12 #include <vnl/vnl_matrix.h>
13 #include <vnl/vnl_vector.h>
14
15 // -------------------------------------------------------------------------
16 #define kalmanGetSetMacro( type, name )         \
17   itkGetConstMacro( name, type );               \
18   itkSetMacro( name, type );
19
20 // -------------------------------------------------------------------------
21 #define kalmanGetMatrixMacro( var, name )       \
22   virtual const TMatrix& Get##name( ) const     \
23   { return( this->m_##var ); }
24
25 // -------------------------------------------------------------------------
26 #define kalmanSetMatrixMacro( var, name )       \
27   virtual void Set##name( const TMatrix& m )    \
28   { this->Set##var( m ); }
29
30 // -------------------------------------------------------------------------
31 #define kalmanGetSetMatrixMacro( var, name )    \
32   kalmanGetMatrixMacro( var, name );            \
33   kalmanSetMatrixMacro( var, name );
34
35 // -------------------------------------------------------------------------
36 #define kalmanGetVectorMacro( var, name )       \
37   virtual const TVector& Get##name( ) const     \
38   { return( this->m_##var ); }
39
40 // -------------------------------------------------------------------------
41 #define kalmanSetVectorMacro( var, name )       \
42   virtual void Set##name( const TVector& v )    \
43   { this->Set##var( v ); }
44
45 // -------------------------------------------------------------------------
46 #define kalmanGetSetVectorMacro( var, name )    \
47   kalmanGetVectorMacro( var, name );            \
48   kalmanSetVectorMacro( var, name );
49
50 namespace cpExtensions
51 {
52   namespace Algorithms
53   {
54     /**
55      * Abstract class implementing the classical kalman filter. See
56      * http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf
57      * for a description of this algorithm.
58      */
59     template< typename T >
60     class cpExtensions_EXPORT KalmanFilter
61       : public itk::Object
62     {
63     public:
64       typedef KalmanFilter                    Self;
65       typedef itk::Object                     Superclass;
66       typedef itk::SmartPointer< Self >       Pointer;
67       typedef itk::SmartPointer< const Self > ConstPointer;
68
69       // Template parameters types
70       typedef T TScalar;
71
72       // VNL types
73       typedef vnl_matrix< TScalar > TMatrix;
74       typedef vnl_vector< TScalar > TVector;
75
76       //  stage identificators
77       enum
78       {
79         StPred,
80         StInno,
81         StFilt
82       };
83
84     public:
85       itkNewMacro( Self );
86       itkTypeMacro( KalmanFilter, itkObject );
87
88       // Values
89       itkGetConstMacro( StateSize, unsigned int );
90       itkGetConstMacro( InputSize, unsigned int );
91       itkGetConstMacro( MeasureSize, unsigned int );
92
93       // Matrices
94       kalmanGetSetMacro( TMatrix, A );
95       kalmanGetSetMacro( TMatrix, B );
96       kalmanGetSetMacro( TMatrix, H );
97       kalmanGetSetMacro( TMatrix, Q );
98       kalmanGetSetMacro( TMatrix, R );
99       kalmanGetSetMacro( TMatrix, P0 );
100       kalmanGetSetMacro( TMatrix, K );
101       kalmanGetSetMacro( TMatrix, Pm );
102       kalmanGetSetMacro( TMatrix, Pp );
103
104       // Vectors
105       kalmanGetSetMacro( TVector, x0 );
106       kalmanGetSetMacro( TVector, u );
107       kalmanGetSetMacro( TVector, m );
108       kalmanGetSetMacro( TVector, xm );
109       kalmanGetSetMacro( TVector, xp );
110
111       // Human-readable matrices
112       kalmanGetSetMatrixMacro( A, TransitionMatrix );
113       kalmanGetSetMatrixMacro( B, InputControlMatrix );
114       kalmanGetSetMatrixMacro( H, MeasureMatrix );
115       kalmanGetSetMatrixMacro( Q, ProcessNoise );
116       kalmanGetSetMatrixMacro( R, MeasureNoise );
117       kalmanGetSetMatrixMacro( P0, InitialNoise );
118       kalmanGetSetMatrixMacro( K, Gain );
119       kalmanGetSetMatrixMacro( Pm, APrioriNoise );
120       kalmanGetSetMatrixMacro( Pp, APosterioriNoise );
121
122       // Human-readable vectors
123       kalmanGetSetVectorMacro( x0, InitialState );
124       kalmanGetSetVectorMacro( u, Input );
125       kalmanGetSetVectorMacro( m, Measure );
126       kalmanGetSetVectorMacro( xm, APrioriState );
127       kalmanGetSetVectorMacro( xp, APosterioriState );
128
129     public:
130
131       void Configure( unsigned int s, unsigned int i, unsigned int m );
132
133       /// Iteration methods
134         virtual void Initialize( );
135         virtual void Predict( );
136         virtual void Innovate( );
137         virtual void Filtrate( );
138         virtual void OneStep( )
139         {
140           this->Predict( );
141           this->Innovate( );
142           this->Filtrate( );
143         }
144         virtual void NSteps( unsigned int n )
145         {
146           for( unsigned int i = 0; i < n; i++ )
147             this->OneStep( );
148         }
149         unsigned int CurrentIteration( ) const
150         { return( this->m_I ); }
151         unsigned char CurrentStep( ) const
152         { return( this->m_Step ); }
153
154     protected:
155         KalmanFilter( );
156         virtual ~KalmanFilter( );
157
158     private:
159         // Purposely not implemented
160         KalmanFilter( const Self& );
161         void operator=( const Self& );
162
163     protected:
164         // Filter dimensions
165         unsigned int m_StateSize;
166         unsigned int m_InputSize;
167         unsigned int m_MeasureSize;
168
169         // Transition matrices
170         TMatrix m_A;  /// Transition
171           TMatrix m_B;  /// Input control
172             TMatrix m_H;  /// Measure
173               TMatrix m_Id; /// Identity matrix
174
175                 // Noise matrices
176                 TMatrix m_Q; /// Process noise covariance
177                   TMatrix m_R; /// Measure noise covariance
178
179                     // Initial values
180                     TVector m_x0; /// Initial state
181                       TMatrix m_P0; /// Initial error covariance
182
183                         // Loop vectors
184                         TVector m_u;  /// Last real input
185                           TVector m_m;  /// Last real measure
186                             TVector m_xm; /// A priori state
187                               TVector m_xp; /// A posteriori state
188
189                                 // Loop matrices
190                                 TMatrix m_K; /// kalman gain
191                                   TMatrix m_Pm; /// A priori error
192                                     TMatrix m_Pp; /// A posteriori error
193
194                                       // Loop values
195                                       unsigned int  m_I;    /// Current iteration
196                                         unsigned char m_Step; /// Current step within current iteration
197
198                                           // -----------------------------------------------------------------
199                                           // Classic kronecker product operator
200                                           // -----------------------------------------------------------------
201                                           template< class M >
202                                             static void Kronecker( M& AkB, const M& A, const M& B );
203     };
204
205   } // ecapseman
206
207 } // ecapseman
208
209 #include <cpExtensions/Algorithms/KalmanFilter.hxx>
210
211 #endif // __CPEXTENSIONS__ALGORITHMS__KALMANFILTER__H__
212
213 // eof - $RCSfile$