Some debugging of zeta
parent
242a387ef1
commit
97a8d21ebf
|
|
@ -168,6 +168,13 @@ void AggregateImuReadings::integrateMeasurement(const Vector3& measuredAcc,
|
||||||
deltaTij_ += dt;
|
deltaTij_ += dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector9 AggregateImuReadings::zeta() const {
|
||||||
|
Vector9 zeta;
|
||||||
|
zeta << values.at<Vector3>(T(k_)), values.at<Vector3>(P(k_)),
|
||||||
|
values.at<Vector3>(V(k_));
|
||||||
|
return zeta;
|
||||||
|
}
|
||||||
|
|
||||||
NavState AggregateImuReadings::predict(const NavState& state_i,
|
NavState AggregateImuReadings::predict(const NavState& state_i,
|
||||||
const Bias& bias_i,
|
const Bias& bias_i,
|
||||||
OptionalJacobian<9, 9> H1,
|
OptionalJacobian<9, 9> H1,
|
||||||
|
|
@ -179,12 +186,14 @@ NavState AggregateImuReadings::predict(const NavState& state_i,
|
||||||
Vector3 pos = values.at<Vector3>(P(k_));
|
Vector3 pos = values.at<Vector3>(P(k_));
|
||||||
Vector3 vel = values.at<Vector3>(V(k_));
|
Vector3 vel = values.at<Vector3>(V(k_));
|
||||||
|
|
||||||
// Correct for initial velocity and gravity
|
// Correct for initial velocity and gravity
|
||||||
|
#if 0
|
||||||
Rot3 Ri = state_i.attitude();
|
Rot3 Ri = state_i.attitude();
|
||||||
Matrix3 Rit = Ri.transpose();
|
Matrix3 Rit = Ri.transpose();
|
||||||
Vector3 gt = deltaTij_ * p_->n_gravity;
|
Vector3 gt = deltaTij_ * p_->n_gravity;
|
||||||
pos += Rit * (state_i.velocity() * deltaTij_ + 0.5 * deltaTij_ * gt);
|
pos += Rit * (state_i.velocity() * deltaTij_ + 0.5 * deltaTij_ * gt);
|
||||||
vel += Rit * gt;
|
vel += Rit * gt;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Convert local coordinates to manifold near state_i
|
// Convert local coordinates to manifold near state_i
|
||||||
Vector9 zeta;
|
Vector9 zeta;
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,8 @@ class AggregateImuReadings {
|
||||||
void integrateMeasurement(const Vector3& measuredAcc,
|
void integrateMeasurement(const Vector3& measuredAcc,
|
||||||
const Vector3& measuredOmega, double dt);
|
const Vector3& measuredOmega, double dt);
|
||||||
|
|
||||||
|
Vector9 zeta() const;
|
||||||
|
|
||||||
/// Predict state at time j
|
/// Predict state at time j
|
||||||
NavState predict(const NavState& state_i, const Bias& estimatedBias_i,
|
NavState predict(const NavState& state_i, const Bias& estimatedBias_i,
|
||||||
OptionalJacobian<9, 9> H1 = boost::none,
|
OptionalJacobian<9, 9> H1 = boost::none,
|
||||||
|
|
|
||||||
|
|
@ -59,9 +59,15 @@ Matrix9 ScenarioRunner::estimateCovariance(double T, size_t N,
|
||||||
Matrix samples(9, N);
|
Matrix samples(9, N);
|
||||||
Vector9 sum = Vector9::Zero();
|
Vector9 sum = Vector9::Zero();
|
||||||
for (size_t i = 0; i < N; i++) {
|
for (size_t i = 0; i < N; i++) {
|
||||||
NavState sampled = predict(integrate(T, estimatedBias, true));
|
auto pim = integrate(T, estimatedBias, true);
|
||||||
samples.col(i) = sampled.localCoordinates(prediction);
|
#if 0
|
||||||
sum += samples.col(i);
|
NavState sampled = predict(pim);
|
||||||
|
Vector9 zeta = sampled.localCoordinates(prediction);
|
||||||
|
#else
|
||||||
|
Vector9 xi = pim.zeta();
|
||||||
|
#endif
|
||||||
|
samples.col(i) = xi;
|
||||||
|
sum += xi;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute MC covariance
|
// Compute MC covariance
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ class ScenarioRunner {
|
||||||
const Bias& estimatedBias = Bias()) const;
|
const Bias& estimatedBias = Bias()) const;
|
||||||
|
|
||||||
/// Compute a Monte Carlo estimate of the predict covariance using N samples
|
/// Compute a Monte Carlo estimate of the predict covariance using N samples
|
||||||
Matrix9 estimateCovariance(double T, size_t N = 1000,
|
Matrix9 estimateCovariance(double T, size_t N = 10000,
|
||||||
const Bias& estimatedBias = Bias()) const;
|
const Bias& estimatedBias = Bias()) const;
|
||||||
|
|
||||||
/// Estimate covariance of sampled noise for sanity-check
|
/// Estimate covariance of sampled noise for sanity-check
|
||||||
|
|
|
||||||
|
|
@ -61,17 +61,17 @@ TEST(ScenarioRunner, Spin) {
|
||||||
EXPECT(assert_equal(p->gyroscopeCovariance / kDt,
|
EXPECT(assert_equal(p->gyroscopeCovariance / kDt,
|
||||||
pim.discreteGyroscopeNoiseModel(kDt)->covariance()));
|
pim.discreteGyroscopeNoiseModel(kDt)->covariance()));
|
||||||
|
|
||||||
#ifdef SANITY_CHECK_SAMPLER
|
#if 0
|
||||||
// Check sampled noise is kosher
|
// Check sampled noise is kosher
|
||||||
Matrix6 expected;
|
Matrix6 expected;
|
||||||
expected << p->accelerometerCovariance / kDt, Z_3x3, //
|
expected << p->accelerometerCovariance / kDt, Z_3x3, //
|
||||||
Z_3x3, p->gyroscopeCovariance / kDt;
|
Z_3x3, p->gyroscopeCovariance / kDt;
|
||||||
Matrix6 actual = runner.estimateNoiseCovariance(100000);
|
Matrix6 actual = runner.estimateNoiseCovariance(10000);
|
||||||
EXPECT(assert_equal(expected, actual, 1e-2));
|
EXPECT(assert_equal(expected, actual, 1e-2));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Check calculated covariance against Monte Carlo estimate
|
// Check calculated covariance against Monte Carlo estimate
|
||||||
Matrix9 estimatedCov = runner.estimateCovariance(T, 1000);
|
Matrix9 estimatedCov = runner.estimateCovariance(T);
|
||||||
EXPECT(assert_equal(estimatedCov, pim.preintMeasCov(), 1e-5));
|
EXPECT(assert_equal(estimatedCov, pim.preintMeasCov(), 1e-5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue