1 #ifndef ADAPTIVE_ATTITUDE_COV_HPP
2 #define ADAPTIVE_ATTITUDE_COV_HPP
4 #include <Eigen/Geometry>
5 #include <Eigen/StdVector>
17 template <
typename _Scalar,
size_t _DoFState,
size_t _MeasurementSize>
32 std::vector < MeasurementMatrix, Eigen::aligned_allocator < MeasurementMatrix > >
RHist;
43 for (
typename std::vector<
MeasurementMatrix, Eigen::aligned_allocator < MeasurementMatrix > >::iterator it =
RHist.begin()
44 ; it !=
RHist.end(); ++it)
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";
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)
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();
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";
93 r1count = (r1count+1)%(
m1);
98 for (
register int j=0; j<static_cast<int>(
m1); ++j)
103 Uk = Uk/
static_cast<_Scalar
>(
m1);
105 fooR = H*Pk*H.transpose() + R;
110 Eigen::JacobiSVD <Eigen::MatrixXd > svdOfUk(Uk, Eigen::ComputeThinU);
112 s = svdOfUk.singularValues();
113 u = svdOfUk.matrixU();
115 for (
size_t i=0; i<_MeasurementSize; ++i)
118 mu(i) = u.col(i).transpose() * fooR * u.col(i);
121 #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
122 std::cout<<
"[ADAPTIVE_ATTITUDE] (lambda - mu) is:\n"<<(lambda - mu)<<
"\n";
125 if ((lambda - mu).maxCoeff() >
gamma)
128 #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
129 std::cout<<
"[ADAPTIVE_ATTITUDE] "<<(lambda - mu).maxCoeff() <<
" Bigger than Gamma("<<
gamma<<
")\n";
133 Eigen::Matrix<_Scalar, _MeasurementSize, 1> auxvector;
134 for(
size_t i=0; i<_MeasurementSize; ++i)
136 auxvector(i) = std::max(lambda(i)-mu(i),static_cast<double>(0.00));
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();
143 #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
144 std::cout<<
"[ADAPTIVE_ATTITUDE] "<<(lambda - mu).maxCoeff() <<
" Lower than Gamma("<<
gamma<<
") r2count: "<<
r2count<<
"\n";
150 Eigen::Matrix<_Scalar, _MeasurementSize, 1> auxvector;
151 for(
size_t i=0; i<_MeasurementSize; ++i)
153 auxvector(i) = std::max(lambda(i)-mu(i),static_cast<double>(0.00));
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();
159 Qstar = MeasurementMatrix::Zero();
162 #ifdef ADAPTIVE_ATTITUDE_COV_DEBUG_PRINTS
163 std::cout<<
"[ADAPTIVE_ATTITUDE] Qstar:\n"<<Qstar<<
"\n";
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