cleanup Kalman filter parameters, add/fix comments/units
Change-Id: Iedcae7164af8f7ea0e048ea7c72d0f35d16d739f
This commit is contained in:
parent
010e422301
commit
eaf2d0bfe3
@ -24,10 +24,28 @@ namespace android {
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
static const float gyroSTDEV = 3.16e-4; // rad/s^3/2
|
/*
|
||||||
|
* gyroVAR gives the measured variance of the gyro's output per
|
||||||
|
* Hz (or variance at 1 Hz). This is an "intrinsic" parameter of the gyro,
|
||||||
|
* which is independent of the sampling frequency.
|
||||||
|
*
|
||||||
|
* The variance of gyro's output at a given sampling period can be
|
||||||
|
* calculated as:
|
||||||
|
* variance(T) = gyroVAR / T
|
||||||
|
*
|
||||||
|
* The variance of the INTEGRATED OUTPUT at a given sampling period can be
|
||||||
|
* calculated as:
|
||||||
|
* variance_integrate_output(T) = gyroVAR * T
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static const float gyroVAR = 1e-7; // (rad/s)^2 / Hz
|
||||||
|
static const float biasVAR = 1e-8; // (rad/s)^2 / s (guessed)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard deviations of accelerometer and magnetometer
|
||||||
|
*/
|
||||||
static const float accSTDEV = 0.05f; // m/s^2 (measured 0.08 / CDD 0.05)
|
static const float accSTDEV = 0.05f; // m/s^2 (measured 0.08 / CDD 0.05)
|
||||||
static const float magSTDEV = 0.5f; // uT (measured 0.7 / CDD 0.5)
|
static const float magSTDEV = 0.5f; // uT (measured 0.7 / CDD 0.5)
|
||||||
static const float biasSTDEV = 3.16e-5; // rad/s^1/2 (guessed)
|
|
||||||
|
|
||||||
static const float FREE_FALL_THRESHOLD = 0.981f;
|
static const float FREE_FALL_THRESHOLD = 0.981f;
|
||||||
|
|
||||||
@ -129,23 +147,34 @@ void Fusion::initFusion(const vec4_t& q, float dT)
|
|||||||
x0 = q;
|
x0 = q;
|
||||||
x1 = 0;
|
x1 = 0;
|
||||||
|
|
||||||
// process noise covariance matrix
|
// process noise covariance matrix: G.Q.Gt, with
|
||||||
// G = | -1 0 |
|
//
|
||||||
// | 0 1 |
|
// G = | -1 0 | Q = | q00 q10 |
|
||||||
|
// | 0 1 | | q01 q11 |
|
||||||
|
//
|
||||||
|
// q00 = sv^2.dt + 1/3.su^2.dt^3
|
||||||
|
// q10 = q01 = 1/2.su^2.dt^2
|
||||||
|
// q11 = su^2.dt
|
||||||
|
//
|
||||||
|
|
||||||
const float v = gyroSTDEV;
|
// variance of integrated output at 1/dT Hz
|
||||||
const float u = biasSTDEV;
|
// (random drift)
|
||||||
const float q00 = v*v*dT + 0.33333f*(dT*dT*dT)*u*u;
|
const float q00 = gyroVAR * dT;
|
||||||
const float q10 = 0.5f*(dT*dT) *u*u;
|
|
||||||
|
// variance of drift rate ramp
|
||||||
|
const float q11 = biasVAR * dT;
|
||||||
|
|
||||||
|
const float u = q11 / dT;
|
||||||
|
const float q10 = 0.5f*u*dT*dT;
|
||||||
const float q01 = q10;
|
const float q01 = q10;
|
||||||
const float q11 = u*u*dT;
|
|
||||||
GQGt[0][0] = q00;
|
GQGt[0][0] = q00; // rad^2
|
||||||
GQGt[1][0] = -q10;
|
GQGt[1][0] = -q10;
|
||||||
GQGt[0][1] = -q01;
|
GQGt[0][1] = -q01;
|
||||||
GQGt[1][1] = q11;
|
GQGt[1][1] = q11; // (rad/s)^2
|
||||||
|
|
||||||
|
|
||||||
// initial covariance: Var{ x(t0) }
|
// initial covariance: Var{ x(t0) }
|
||||||
|
// TODO: initialize P correctly
|
||||||
P = 0;
|
P = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user