From 0a4594884adcdef15abe861fc64d74b7511c6055 Mon Sep 17 00:00:00 2001 From: Martin Miller Date: Wed, 5 Apr 2017 14:08:25 -0500 Subject: Improved process noise modeling --- src/body.cpp | 39 ++++++++++++++++++++++++++++++++------- src/body.h | 4 ++++ src/feature.cpp | 2 +- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/body.cpp b/src/body.cpp index 0bbe18f..a94c8a2 100644 --- a/src/body.cpp +++ b/src/body.cpp @@ -117,16 +117,41 @@ Body::Q (double dt) { Matrix Q; Q = Matrix::Zero(); - Q.block<3,3>(0,0) = 0.25*dt*dt*dt*dt*Matrix::Identity(); - Q.block<3,3>(3,0) = 0.5*dt*dt*dt*Matrix::Identity(); - Q.block<3,3>(0,3) = 0.5*dt*dt*dt*Matrix::Identity(); - Q.block<3,3>(3,3) = dt*dt*Matrix::Identity(); - Q *= IMU_NOISE; + // Qxx + Q.block<3,3>(0,0) = 0.25*dt*dt*dt*dt*ACC_STD*ACC_STD*Matrix::Identity(); + + // Qxv, Qvx + Q.block<3,3>(3,0) = 0.5*dt*dt*dt*Matrix3d::Identity()-0.25*dt*dt*ACC_STD*ACC_BIAS_STD*Matrix3d::Identity(); + Q.block<3,3>(0,3) = 0.5*dt*dt*dt*Matrix3d::Identity()-0.25*dt*dt*ACC_STD*ACC_BIAS_STD*Matrix3d::Identity(); + + //Qvv + Q.block<3,3>(3,3) = dt*dt*(ACC_STD*ACC_STD+0.25*ACC_BIAS_STD*ACC_BIAS_STD)*Matrix::Identity(); + #if STATESIZE==13 + // Qbb + Q.block<3,3>(10,10) = dt*dt*ACC_BIAS_STD*ACC_BIAS_STD*Matrix::Identity(); + + // Qxb, Qbx + Q.block<3,3>(10,0) = 0.5*dt*dt*dt*ACC_STD*ACC_BIAS_STD*Matrix3d::Identity(); + Q.block<3,3>(0,10) = 0.5*dt*dt*dt*ACC_STD*ACC_BIAS_STD*Matrix3d::Identity(); + + // Qvb, Qbv + Q.block<3,3>(3,10) = dt*dt*(ACC_STD*ACC_BIAS_STD-0.5*ACC_BIAS_STD*ACC_BIAS_STD)*Matrix3d::Identity(); + Q.block<3,3>(10,3) = dt*dt*(ACC_STD*ACC_BIAS_STD-0.5*ACC_BIAS_STD*ACC_BIAS_STD)*Matrix3d::Identity(); + + // Qqq Q.block<4,4>(6,6) = 0.25*dt*dt*IMU_NOISE*Matrix::Identity(); - Q.block<3,3>(10,10) = dt*dt*IMU_RANDOMWALK*Matrix::Identity(); #else - Q.block<3,3>(6,6) = dt*dt*IMU_RANDOMWALK*Matrix::Identity(); + // Qbb + Q.block<3,3>(6,6) = dt*dt*ACC_BIAS_STD*ACC_BIAS_STD*Matrix::Identity(); + + // Qxb, Qbx + Q.block<3,3>(6,0) = 0.5*dt*dt*dt*ACC_STD*ACC_BIAS_STD*Matrix3d::Identity(); + Q.block<3,3>(0,6) = 0.5*dt*dt*dt*ACC_STD*ACC_BIAS_STD*Matrix3d::Identity(); + + // Qvb, Qbv + 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 ----- */ diff --git a/src/body.h b/src/body.h index 4653588..1db9215 100644 --- a/src/body.h +++ b/src/body.h @@ -4,6 +4,10 @@ #include #include "types.h" #define R_HEIGHT 2.5e-3 /* measurement noise of height measurement */ +#define ACC_STD 28e-3 +#define ANG_STD 80e-6 +#define ACC_BIAS_STD 22e-3 +#define ANG_BIAS_STD 7e-6 #define IMU_NOISE 800e-6 /* IMU process noise */ #define IMU_RANDOMWALK 50e-6 /* Bias process noise */ //#define DOCLAMP diff --git a/src/feature.cpp b/src/feature.cpp index 85396e3..22bf776 100644 --- a/src/feature.cpp +++ b/src/feature.cpp @@ -148,7 +148,7 @@ Feature::Q ( const double dt ) { Matrix Q; Q = Matrix::Identity(); - Q *= dt*dt*dt*dt*FEATURE_NOISE;//*1e-1; + Q *= 0.5*dt*dt*dt*dt*FEATURE_NOISE*FEATURE_NOISE;//*1e-1; return Q; } /* ----- end of method Feature::q ----- */ -- cgit v1.1