Merging works great with numerical derivative of keystone block

release/4.3a0
Frank Dellaert 2016-01-31 01:24:30 -08:00
parent ebba015227
commit 77969f97d9
3 changed files with 21 additions and 18 deletions

View File

@ -140,6 +140,7 @@ Vector9 PreintegrationBase::UpdatePreintegrated(const Vector3& a_body,
velocity + a_nav* dt; // velocity
if (A) {
#define USE_NUMERICAL_DERIVATIVE
#ifdef USE_NUMERICAL_DERIVATIVE
// The use of this yields much more accurate derivatives, but it's slow!
// TODO(frank): find a cheap closed form solution (look at Iserles)

View File

@ -792,7 +792,7 @@ struct ImuFactorMergeTest {
p_->accelerometerCovariance = I_3x3 * 0.03;
}
void TestScenarioBiasCase(TestResult& result_, const std::string& name_,
int TestScenario(TestResult& result_, const std::string& name_,
const Scenario& scenario,
const imuBias::ConstantBias& bias01,
const imuBias::ConstantBias& bias12, double tol) {
@ -800,7 +800,7 @@ struct ImuFactorMergeTest {
// then checking the merge of 01-12 matches 02.
PreintegratedImuMeasurements pim01(p_, bias01);
PreintegratedImuMeasurements pim12(p_, bias12);
PreintegratedImuMeasurements expected_pim02(p_, bias01);
PreintegratedImuMeasurements pim02_expected(p_, bias01);
double deltaT = 0.05;
ScenarioRunner runner(&scenario, p_, deltaT);
@ -810,7 +810,7 @@ struct ImuFactorMergeTest {
// integrate the measurements appropriately
Vector3 accel_meas = runner.actualSpecificForce(t);
Vector3 omega_meas = runner.actualAngularVelocity(t);
expected_pim02.integrateMeasurement(accel_meas, omega_meas, deltaT);
pim02_expected.integrateMeasurement(accel_meas, omega_meas, deltaT);
if (i < 50) {
pim01.integrateMeasurement(accel_meas, omega_meas, deltaT);
} else {
@ -818,25 +818,27 @@ struct ImuFactorMergeTest {
}
}
auto actual_pim02 = ImuFactor::Merge(pim01, pim12);
EXPECT(assert_equal(expected_pim02.preintegrated(), actual_pim02.preintegrated(), tol));
EXPECT(assert_equal(expected_pim02, actual_pim02, tol));
EXPECT(assert_equal(pim02_expected.preintegrated(),
actual_pim02.preintegrated(), tol));
EXPECT(assert_equal(pim02_expected, actual_pim02, tol));
ImuFactor::shared_ptr factor_01 =
ImuFactor::shared_ptr factor01 =
boost::make_shared<ImuFactor>(X(0), V(0), X(1), V(1), B(0), pim01);
ImuFactor::shared_ptr factor_12 =
ImuFactor::shared_ptr factor12 =
boost::make_shared<ImuFactor>(X(1), V(1), X(2), V(2), B(0), pim12);
ImuFactor::shared_ptr factor_02_true = boost::make_shared<ImuFactor>(
X(0), V(0), X(2), V(2), B(0), expected_pim02);
ImuFactor::shared_ptr factor02_expected = boost::make_shared<ImuFactor>(
X(0), V(0), X(2), V(2), B(0), pim02_expected);
// ImuFactor::shared_ptr factor_02_merged = factor01.mergeWith(factor_12);
// EXPECT(assert_equal(*factor_02_true, *factor_02_merged, tol));
// ImuFactor::shared_ptr factor02_merged = factor01.mergeWith(factor12);
// EXPECT(assert_equal(*factor02_expected, *factor02_merged, tol));
return result_.getFailureCount();
}
void TestScenarios(TestResult& result_, const std::string& name_,
const imuBias::ConstantBias& bias01,
const imuBias::ConstantBias& bias12, double tol) {
for (auto scenario : {forward_, loop_})
TestScenarioBiasCase(result_, name_, scenario, bias01, bias12, tol);
for (auto scenario : {forward_})
EXPECT_LONGS_EQUAL(0,TestScenario(result_, name_, scenario, bias01, bias12, tol));
}
};
@ -845,7 +847,7 @@ struct ImuFactorMergeTest {
// an exact answer.
TEST(ImuFactor, MergeZeroBias) {
ImuFactorMergeTest mergeTest;
mergeTest.TestScenarios(result_, name_, kZeroBias, kZeroBias, 1e-6);
mergeTest.TestScenarios(result_, name_, kZeroBias, kZeroBias, 1e-5);
}
//// Test case with different biases where we expect there to be some variation.

View File

@ -136,7 +136,7 @@ TEST(PreintegrationBase, Compose) {
EXPECT(assert_equal(numericalDerivative21(f, Z_3x1, Z_3x1),
expected_pim02.preintegrated_H_biasAcc()));
EXPECT(assert_equal(numericalDerivative22(f, Z_3x1, Z_3x1),
expected_pim02.preintegrated_H_biasOmega(), 1e-3));
expected_pim02.preintegrated_H_biasOmega(), 1e-7));
}
/* ************************************************************************* */