robust noise in place - test fails due to non-isotropic covariance?

release/4.3a0
lcarlone 2020-09-24 16:35:41 -04:00
parent 6aed1685ed
commit 001a55ad3a
3 changed files with 26 additions and 32 deletions

View File

@ -820,15 +820,13 @@ template class ShonanAveraging<2>;
ShonanAveraging2::ShonanAveraging2(const Measurements &measurements,
const Parameters &parameters)
: ShonanAveraging<2>(measurements, parameters) {
if (parameters.useHuber == true)
std::cout << "Parameter useHuber is disregarded when you pass measurements to ShonanAveraging2."
"Pass g2o file as input to enable this functionality" << std::endl;
}
: ShonanAveraging<2>(parameters.useHuber?
makeNoiseModelRobust(measurements) : measurements, parameters) {}
ShonanAveraging2::ShonanAveraging2(string g2oFile, const Parameters &parameters)
: ShonanAveraging<2>(parseMeasurements<Rot2>(g2oFile,
parameters.useHuber? nullptr : nullptr), parameters) {}
: ShonanAveraging<2>(parameters.useHuber?
makeNoiseModelRobust( parseMeasurements<Rot2>(g2oFile) ) :
parseMeasurements<Rot2>(g2oFile), parameters) {}
/* ************************************************************************* */
// Explicit instantiation for d=3
@ -836,22 +834,20 @@ template class ShonanAveraging<3>;
ShonanAveraging3::ShonanAveraging3(const Measurements &measurements,
const Parameters &parameters)
: ShonanAveraging<3>(measurements, parameters) {
if (parameters.useHuber == true)
std::cout << "Parameter useHuber is disregarded when you pass measurements to ShonanAveraging2."
"Pass g2o file as input to enable this functionality" << std::endl;
}
: ShonanAveraging<3>(parameters.useHuber?
makeNoiseModelRobust(measurements) : measurements, parameters) {}
ShonanAveraging3::ShonanAveraging3(string g2oFile, const Parameters &parameters)
: ShonanAveraging<3>(parseMeasurements<Rot3>(g2oFile,
parameters.useHuber? nullptr : nullptr), parameters) {}
: ShonanAveraging<3>(parameters.useHuber?
makeNoiseModelRobust( parseMeasurements<Rot3>(g2oFile) ) :
parseMeasurements<Rot3>(g2oFile), parameters) {}
// TODO(frank): Deprecate after we land pybind wrapper
// Extract Rot3 measurement from Pose3 betweenfactors
// Modeled after similar function in dataset.cpp
static BinaryMeasurement<Rot3> convert(
const BetweenFactor<Pose3>::shared_ptr &f, bool useHuber = false) {
const BetweenFactor<Pose3>::shared_ptr &f) {
auto gaussian =
boost::dynamic_pointer_cast<noiseModel::Gaussian>(f->noiseModel());
if (!gaussian)
@ -859,32 +855,23 @@ static BinaryMeasurement<Rot3> convert(
"parseMeasurements<Rot3> can only convert Pose3 measurements "
"with Gaussian noise models.");
const Matrix6 M = gaussian->covariance();
if(!useHuber){
return BinaryMeasurement<Rot3>(
f->key1(), f->key2(), f->measured().rotation(),
noiseModel::Gaussian::Covariance(M.block<3, 3>(3, 3), true));
}else{ // wrap noise mode in Huber loss
std::cout << "setting robust huber loss " << std::endl;
return BinaryMeasurement<Rot3>(
f->key1(), f->key2(), f->measured().rotation(),
noiseModel::Robust::Create(
noiseModel::mEstimator::Huber::Create(1.345),
noiseModel::Gaussian::Covariance(M.block<3, 3>(3, 3), true)));
}
return BinaryMeasurement<Rot3>(
f->key1(), f->key2(), f->measured().rotation(),
noiseModel::Gaussian::Covariance(M.block<3, 3>(3, 3), true));
}
static ShonanAveraging3::Measurements extractRot3Measurements(
const BetweenFactorPose3s &factors, bool useHuber = false) {
const BetweenFactorPose3s &factors) {
ShonanAveraging3::Measurements result;
result.reserve(factors.size());
for (auto f : factors) result.push_back(convert(f,useHuber));
for (auto f : factors) result.push_back(convert(f));
return result;
}
ShonanAveraging3::ShonanAveraging3(const BetweenFactorPose3s &factors,
const Parameters &parameters)
: ShonanAveraging<3>(parameters.useHuber?
extractRot3Measurements(factors) :
makeNoiseModelRobust( extractRot3Measurements(factors) ):
extractRot3Measurements(factors), parameters) {}
/* ************************************************************************* */

View File

@ -164,6 +164,15 @@ class GTSAM_EXPORT ShonanAveraging {
return measurements_[k];
}
/// wrap factors with robust Huber loss
static Measurements makeNoiseModelRobust(Measurements measurements){
Measurements robustMeasurements = measurements;
for (auto &measurement : robustMeasurements) {
measurement.makeNoiseModelRobust();
}
return robustMeasurements;
}
/// k^th measurement, as a Rot.
const Rot &measured(size_t k) const { return measurements_[k].measured(); }

View File

@ -328,10 +328,8 @@ TEST(ShonanAveraging2, noisyToyGraphWithHuber) {
string g2oFile = findExampleDataFile("noisyToyGraph.txt");
ShonanAveraging2::Parameters parameters(lmParams);
auto measurements = parseMeasurements<Rot2>(g2oFile);
std::cout << "----- changing huber before " << std::endl;
parameters.setUseHuber(true);
parameters.print();
std::cout << "----- changing huber after " << std::endl;
ShonanAveraging2 shonan(measurements, parameters);
EXPECT_LONGS_EQUAL(4, shonan.nrUnknowns());