diff --git a/gtsam/sfm/ShonanAveraging.cpp b/gtsam/sfm/ShonanAveraging.cpp index 1e6fcf6da..8fcfbeb26 100644 --- a/gtsam/sfm/ShonanAveraging.cpp +++ b/gtsam/sfm/ShonanAveraging.cpp @@ -337,14 +337,24 @@ double ShonanAveraging::cost(const Values &values) const { // Get kappa from noise model template static double Kappa(const BinaryMeasurement &measurement) { - const auto &isotropic = boost::dynamic_pointer_cast( - measurement.noiseModel()); - if (!isotropic) { - throw std::invalid_argument( - "Shonan averaging noise models must be isotropic."); - } - const double sigma = isotropic->sigma(); - return 1.0 / (sigma * sigma); + const auto &isotropic = boost::dynamic_pointer_cast( + measurement.noiseModel()); + double sigma; + if (isotropic) { + sigma = isotropic->sigma(); + } else{ + const auto &robust = boost::dynamic_pointer_cast( + measurement.noiseModel()); + if (robust) { + std::cout << "Verification of optimality does not work with robust cost function" << std::endl; + sigma = 1; // setting arbitrary value + }else{ + throw std::invalid_argument( + "Shonan averaging noise models must be isotropic (but robust losses are allowed)."); + + } + } + return 1.0 / (sigma * sigma); } /* ************************************************************************* */ diff --git a/gtsam/sfm/tests/testShonanAveraging.cpp b/gtsam/sfm/tests/testShonanAveraging.cpp index ae24094de..e2fa9c22a 100644 --- a/gtsam/sfm/tests/testShonanAveraging.cpp +++ b/gtsam/sfm/tests/testShonanAveraging.cpp @@ -338,7 +338,7 @@ TEST(ShonanAveraging2, noisyToyGraphWithHuber) { graph.print(); EXPECT_LONGS_EQUAL(6, graph.size()); auto initial = shonan.initializeRandomly(kRandomNumberGenerator); - auto result = shonan.run(initial, 2); + auto result = shonan.run(initial, 2, 3); EXPECT_DOUBLES_EQUAL(0.0008211, shonan.cost(result.first), 1e-6); EXPECT_DOUBLES_EQUAL(0, result.second, 1e-10); // certificate! }