*******************************************************************************/
#include <ekf.hpp>
-
+#include <iostream>
namespace imufusion
{
-Ekf::Ekf(const Eigen::Quaterniond &q0,const Eigen::MatrixXd &P0,const Eigen::MatrixXd &Pw,const Eigen::MatrixXd &Pv,double T): Gz_(9.81), T_(T), x_(7), P_(P0), Pw_(Pw),Pv_(Pv)
+Ekf::Ekf(const Eigen::Quaterniond &q0,const Eigen::MatrixXd &P0,const Eigen::MatrixXd &Pw,const Eigen::MatrixXd &Pv,double T): Gz_(-9.81), T_(T), x_(7), P_(P0), Pw_(Pw),Pv_(Pv)
{
Eigen::Vector3d gyroBias;
gyroBias.setZero();
// Covariance a posteriori
Eigen::MatrixXd P=(Eigen::MatrixXd::Identity(7,7)-K*H())*P_;
- // State prediction
- x_=f(gyro);
+ // Covariance prediction
+ Eigen::Vector3d u=gyro-x_.tail<3>();
+ P_=F(u)*P*F(u).transpose()+Pw_;
- // Covariance propagation
- P_=F(gyro)*P*F(gyro).transpose()+Pw_;
+ // State prediction
+ x_=f(u); // Should be the last operation becuse changes x_
}
Eigen::Quaterniond Ekf::quaternion(void)
return euler;
}
-Eigen::VectorXd Ekf::f(Eigen::Vector3d u)
+Eigen::VectorXd Ekf::f(const Eigen::Vector3d u)
{
Eigen::MatrixXd Xi(4,3);
Xi << -x_(1), -x_(2), -x_(3),
Eigen::MatrixXd G(7,3);
G << T_/2.0*Xi,
Eigen::MatrixXd::Zero(3,3);
-
+
return x_+G*u;
}
-Eigen::MatrixXd Ekf::F(Eigen::Vector3d u)
+Eigen::MatrixXd Ekf::F(const Eigen::Vector3d u)
{
Eigen::MatrixXd Xi(4,3);
Xi << -x_(1), -x_(2), -x_(3),
Omega << 0.0, -u(0), -u(1), -u(2),
u(0), 0.0, u(2), -u(1),
u(1), -u(2), 0.0, u(0),
- u(2), u(1), -u(0),0.0;
+ u(2), u(1), -u(0), 0.0;
Eigen::MatrixXd F(7,7);
F << T_/2.0*Omega, -T_/2.0*Xi,
Eigen::MatrixXd H(6,7);
H << -2*Gz_*x_(2), 2*Gz_*x_(3), -2*Gz_*x_(0), 2*Gz_*x_(1), Eigen::MatrixXd::Zero(1,3),
2*Gz_*x_(1), 2*Gz_*x_(0), 2*Gz_*x_(3), 2*Gz_*x_(2), Eigen::MatrixXd::Zero(1,3),
- 2*Gz_*x_(0), -2*Gz_*x_(1), -2*Gz_*x_(2), 2*Gz_*x_(3), Eigen::MatrixXd::Zero(1,3),
- 2*x_(0), -2*x_(1), -2*x_(2), -2*x_(3), Eigen::MatrixXd::Zero(1,3),
- -2*x_(3), 2*x_(2), 2*x_(1), -2*x_(0), Eigen::MatrixXd::Zero(1,3),
- 2*x_(2), 2*x_(4), -2*x_(0), 2*x_(2), Eigen::MatrixXd::Zero(1,3);
+ 2*Gz_*x_(0), -2*Gz_*x_(1), -2*Gz_*x_(2), 2*Gz_*x_(3), Eigen::MatrixXd::Zero(1,3),
+ 2*x_(0), -2*x_(1), -2*x_(2), -2*x_(3), Eigen::MatrixXd::Zero(1,3),
+ -2*x_(3), 2*x_(2), 2*x_(1), -2*x_(0), Eigen::MatrixXd::Zero(1,3),
+ 2*x_(2), 2*x_(4), -2*x_(0), 2*x_(2), Eigen::MatrixXd::Zero(1,3);
return H;
}