From 7cd5d5cb4f7b25d6c6c265b9994a712d09b6c969 Mon Sep 17 00:00:00 2001 From: Martin Miller Date: Tue, 11 Apr 2017 13:50:02 -0500 Subject: Update process noise in body. Process noise is a function of v and q. --- src/body.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/body.h | 4 ++++ 2 files changed, 54 insertions(+) diff --git a/src/body.cpp b/src/body.cpp index edf2047..885b2ad 100644 --- a/src/body.cpp +++ b/src/body.cpp @@ -115,6 +115,43 @@ Body::R() Matrix Body::Q (double dt) { + + Matrix Ga; + Ga.block<3,3>(0,0) = 0.5*dt*dt*Matrix3d::Identity(); + Ga.block<3,3>(3,0) = dt*Matrix3d::Identity(); + Ga.block(6,0) = Matrix::Zero(); + + Matrix Gb; + Gb.block<3,3>(0,0) = -0.5*dt*dt*Matrix3d::Identity(); + Gb.block<3,3>(3,0) = -dt*Matrix3d::Identity(); + Gb.block(6,0) = Matrix::Zero(); + + Matrix Gw; + Gw.block<3,3>(0,0) = 0.5*dt*dt*skewSymmetric(vel()); + Gw.block<3,3>(3,0) = dt*skewSymmetric(vel()); + Gb.block(6,0) = Matrix::Zero(); + +#if STATESIZE==13 + Matrix Gq; + Quaterniond q = qhat(); + + Gq.block<6,3>(0,0) = Matrix::Zero(); + Gq.block<4,3>(6,0) = 0.5*dt*qomega(q); + Gq.block<3,3>(10,0) = Matrix::Zero(); +#endif + Matrix Q; + Q = Matrix::Zero(); + Q = ACC_STD*ACC_STD*Ga*Ga.transpose(); + Q += ACC_BIAS_STD*ACC_BIAS_STD*Gb*Gb.transpose(); + Q += ANG_STD*ANG_STD * Gw * Gw.transpose(); + +#if STATESIZE==13 + Q += ANG_STD*ANG_STD *Gq * Gq.transpose(); +#endif + + + + /* Matrix Q; Q = Matrix::Zero(); // Qxx @@ -153,6 +190,7 @@ Body::Q (double dt) Q.block<3,3>(3,6) = dt*dt*(ACC_STD*ACC_BIAS_STD-0.5*ACC_BIAS_STD*ACC_BIAS_STD)*Matrix3d::Identity(); Q.block<3,3>(6,3) = dt*dt*(ACC_STD*ACC_BIAS_STD-0.5*ACC_BIAS_STD*ACC_BIAS_STD)*Matrix3d::Identity(); #endif +*/ return Q; } /* ----- end of method Body::q ----- */ @@ -249,6 +287,18 @@ Body::F ( const Vector3d &ang, const Quaterniond &q, double dt ) return F; } /* ----- end of method Body::F ----- */ +Matrix +Body::qomega ( const Quaterniond &q ) +{ + Matrix qom; + qom << q.w(), -q.z(), q.y(), + q.z(), q.w(), -q.x(), + -q.y(), q.x(), q.w(), + -q.x(),-q.y(),-q.z(); + + return qom ; +} /* ----- end of method Body::qomega ----- */ + /* *-------------------------------------------------------------------------------------- * Class: Body diff --git a/src/body.h b/src/body.h index 6641ab5..1e64d86 100644 --- a/src/body.h +++ b/src/body.h @@ -16,7 +16,10 @@ using Eigen::Matrix; +using Eigen::Matrix3d; +using Eigen::Matrix4d; using Eigen::Vector3d; +using Eigen::Vector4d; using Eigen::Quaterniond; using std::cout; using std::cerr; @@ -69,6 +72,7 @@ class Body Matrix R(); Matrix skewSymmetric(const Vector3d &x); Matrix omega(const Vector3d &x); + Matrix qomega(const Quaterniond &q); void unicsv(); protected: -- cgit v1.1