quater_ikf
AdaptiveAttitudeCov.hpp
Go to the documentation of this file.
1 #ifndef ADAPTIVE_ATTITUDE_COV_HPP
2 #define ADAPTIVE_ATTITUDE_COV_HPP
3 
4 #include <Eigen/Geometry>
5 #include <Eigen/StdVector>
6 #include <Eigen/LU>
7 #include <Eigen/SVD>
9 #include <vector>
10 
11 //#define ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS 1
12 
13 namespace filter
14 {
17  template <typename _Scalar, size_t _DoFState, size_t _MeasurementSize>
19  {
20 
21  protected:
22 
23  typedef Eigen::Matrix<_Scalar, _MeasurementSize, _MeasurementSize> MeasurementMatrix;
24 
25  unsigned int r1count;
26  unsigned int m1;
27  unsigned int m2;
28  double gamma;
29  unsigned int r2count;
32  std::vector < MeasurementMatrix, Eigen::aligned_allocator < MeasurementMatrix > > RHist;
33 
34  public:
35 
36  AdaptiveAttitudeCov(const unsigned int M1, const unsigned int M2,
37  const double GAMMA)
38  :m1(M1), m2(M2), gamma(GAMMA)
39  {
40  r1count = 0;
41  r2count = M2;
42  RHist.resize(M1);
43  for (typename std::vector< MeasurementMatrix, Eigen::aligned_allocator < MeasurementMatrix > >::iterator it = RHist.begin()
44  ; it != RHist.end(); ++it)
45  (*it).setZero();
46 
47  #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
48  std::cout<<"[INIT ADAPTIVE_ATTITUDE] M1: "<<m1<<"\n";
49  std::cout<<"[INIT ADAPTIVE_ATTITUDE] M2: "<<m2<<"\n";
50  std::cout<<"[INIT ADAPTIVE_ATTITUDE] GAMMA: "<<gamma<<"\n";
51  std::cout<<"[INIT ADAPTIVE_ATTITUDE] r1count: "<<r1count<<"\n";
52  std::cout<<"[INIT ADAPTIVE_ATTITUDE] r2count: "<<r2count<<"\n";
53  std::cout<<"[INIT ADAPTIVE_ATTITUDE] RHist is of size "<<RHist.size()<<"\n";
54  #endif
55 
56  }
57 
59 
60  Eigen::Matrix<_Scalar, _MeasurementSize, _MeasurementSize> matrix(const Eigen::Matrix <_Scalar, _DoFState, 1> xk,
61  const Eigen::Matrix<_Scalar, _DoFState, _DoFState> &Pk,
62  const Eigen::Matrix<_Scalar, _MeasurementSize, 1> &z,
63  const Eigen::Matrix<_Scalar, _MeasurementSize, _DoFState> &H,
64  const Eigen::Matrix<_Scalar, _MeasurementSize, _MeasurementSize> &R)
65  {
66  MeasurementMatrix R1a;
67  MeasurementMatrix fooR;
69  MeasurementMatrix Qstar;
71  Eigen::Matrix<_Scalar, _MeasurementSize, 1> lambda;
72  Eigen::Matrix<_Scalar, _MeasurementSize, 1> mu;
73  Eigen::Matrix<_Scalar, _MeasurementSize, 1> s;
76  R1a = (z - H*xk) * (z - H*xk).transpose();
77 
78  RHist[r1count] = R1a;
79 
80  #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
81  std::cout<<"[ADAPTIVE_ATTITUDE] xk:\n"<<xk<<"\n";
82  std::cout<<"[ADAPTIVE_ATTITUDE] Pk:\n"<<Pk<<"\n";
83  std::cout<<"[ADAPTIVE_ATTITUDE] z:\n"<<z<<"\n";
84  std::cout<<"[ADAPTIVE_ATTITUDE] H:\n"<<H<<"\n";
85  std::cout<<"[ADAPTIVE_ATTITUDE] R:\n"<<R<<"\n";
86  std::cout<<"[ADAPTIVE_ATTITUDE] r1count:\n"<<r1count<<"\n";
87  std::cout<<"[ADAPTIVE_ATTITUDE] R1a:\n"<<R1a<<"\n";
88  std::cout<<"[ADAPTIVE_ATTITUDE] z:\n"<<z<<"\n";
89  #endif
90 
91 
93  r1count = (r1count+1)%(m1);
94 
95  Uk.setZero();
96 
98  for (register int j=0; j<static_cast<int>(m1); ++j)
99  {
100  Uk += RHist[j];
101  }
102 
103  Uk = Uk/static_cast<_Scalar>(m1);
104 
105  fooR = H*Pk*H.transpose() + R;
106 
110  Eigen::JacobiSVD <Eigen::MatrixXd > svdOfUk(Uk, Eigen::ComputeThinU);
111 
112  s = svdOfUk.singularValues();
113  u = svdOfUk.matrixU();
114 
115  for (size_t i=0; i<_MeasurementSize; ++i)
116  {
117  lambda[i] = s(i);
118  mu(i) = u.col(i).transpose() * fooR * u.col(i);
119  }
120 
121  #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
122  std::cout<<"[ADAPTIVE_ATTITUDE] (lambda - mu) is:\n"<<(lambda - mu)<<"\n";
123  #endif
124 
125  if ((lambda - mu).maxCoeff() > gamma)
126  {
127 
128  #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
129  std::cout<<"[ADAPTIVE_ATTITUDE] "<<(lambda - mu).maxCoeff() <<" Bigger than Gamma("<<gamma<<")\n";
130  #endif
131 
132  r2count = 0;
133  Eigen::Matrix<_Scalar, _MeasurementSize, 1> auxvector;
134  for(size_t i=0; i<_MeasurementSize; ++i)
135  {
136  auxvector(i) = std::max(lambda(i)-mu(i),static_cast<double>(0.00));
137  }
138 
139  Qstar = auxvector(0) * u.col(0) * u.col(0).transpose() + auxvector(1) * u.col(1) * u.col(1).transpose() + auxvector(2) * u.col(2) * u.col(2).transpose();
140  }
141  else
142  {
143  #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
144  std::cout<<"[ADAPTIVE_ATTITUDE] "<<(lambda - mu).maxCoeff() <<" Lower than Gamma("<<gamma<<") r2count: "<<r2count<<"\n";
145  #endif
146 
147  r2count ++;
148  if (r2count < m2)
149  {
150  Eigen::Matrix<_Scalar, _MeasurementSize, 1> auxvector;
151  for(size_t i=0; i<_MeasurementSize; ++i)
152  {
153  auxvector(i) = std::max(lambda(i)-mu(i),static_cast<double>(0.00));
154  }
155 
156  Qstar = auxvector(0) * u.col(0) * u.col(0).transpose() + auxvector(1) * u.col(1) * u.col(1).transpose() + auxvector(2) * u.col(2) * u.col(2).transpose();
157  }
158  else
159  Qstar = MeasurementMatrix::Zero();
160  }
161 
162  #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
163  std::cout<<"[ADAPTIVE_ATTITUDE] Qstar:\n"<<Qstar<<"\n";
164  #endif
165 
166  return R + Qstar;
167  }
168  };
169 }
170 #endif
std::vector< MeasurementMatrix, Eigen::aligned_allocator< MeasurementMatrix > > RHist
Definition: AdaptiveAttitudeCov.hpp:32
AdaptiveAttitudeCov(const unsigned int M1, const unsigned int M2, const double GAMMA)
Definition: AdaptiveAttitudeCov.hpp:36
unsigned int m2
Definition: AdaptiveAttitudeCov.hpp:27
Eigen::Matrix< _Scalar, _MeasurementSize, _MeasurementSize > MeasurementMatrix
Definition: AdaptiveAttitudeCov.hpp:23
double gamma
Definition: AdaptiveAttitudeCov.hpp:28
Class for Adaptive measurement matrix for the attitude correction in 3D.
Definition: AdaptiveAttitudeCov.hpp:18
unsigned int r1count
Definition: AdaptiveAttitudeCov.hpp:25
unsigned int m1
Definition: AdaptiveAttitudeCov.hpp:26
Eigen::Matrix< _Scalar, _MeasurementSize, _MeasurementSize > matrix(const Eigen::Matrix< _Scalar, _DoFState, 1 > xk, const Eigen::Matrix< _Scalar, _DoFState, _DoFState > &Pk, const Eigen::Matrix< _Scalar, _MeasurementSize, 1 > &z, const Eigen::Matrix< _Scalar, _MeasurementSize, _DoFState > &H, const Eigen::Matrix< _Scalar, _MeasurementSize, _MeasurementSize > &R)
Definition: AdaptiveAttitudeCov.hpp:60
~AdaptiveAttitudeCov()
Definition: AdaptiveAttitudeCov.hpp:58
unsigned int r2count
Definition: AdaptiveAttitudeCov.hpp:29