makeNoiseModelRobust assumes responsibility for robustifying noise models

release/4.3a0
Varun Agrawal 2020-11-30 17:31:49 -05:00
parent fd74ae9330
commit 9d15afaab1
1 changed files with 32 additions and 10 deletions

View File

@ -83,13 +83,13 @@ struct GTSAM_EXPORT ShonanAveragingParameters {
void setUseHuber(bool value) { useHuber = value; } void setUseHuber(bool value) { useHuber = value; }
bool getUseHuber() { return useHuber; } bool getUseHuber() { return useHuber; }
/// Print the parameters and flags used for rotation averaging.
void print() const { void print() const {
std::cout << " ShonanAveragingParameters: " << std::endl; std::cout << " ShonanAveragingParameters: " << std::endl;
std::cout << " alpha: " << alpha << std::endl; std::cout << " alpha: " << alpha << std::endl;
std::cout << " beta: " << beta << std::endl; std::cout << " beta: " << beta << std::endl;
std::cout << " gamma: " << gamma << std::endl; std::cout << " gamma: " << gamma << std::endl;
std::cout << " useHuber: " << useHuber << std::endl; std::cout << " useHuber: " << useHuber << std::endl;
std::cout << " --------------------------" << std::endl;
} }
}; };
@ -164,11 +164,33 @@ class GTSAM_EXPORT ShonanAveraging {
return measurements_[k]; return measurements_[k];
} }
/// wrap factors with robust Huber loss /**
Measurements makeNoiseModelRobust(const Measurements& measurements) const { * Update factors to use robust Huber loss.
Measurements robustMeasurements = measurements; *
for (auto &measurement : robustMeasurements) { * @param measurements Vector of BinaryMeasurements.
measurement = BinaryMeasurement<Rot>(measurement, true); * @param k Huber noise model threshold.
*/
Measurements makeNoiseModelRobust(const Measurements &measurements,
double k = 1.345) const {
Measurements robustMeasurements;
for (auto &measurement : measurements) {
auto model = measurement.noiseModel();
const auto &robust =
boost::dynamic_pointer_cast<noiseModel::Robust>(model);
SharedNoiseModel robust_model;
// Check if the noise model is already robust
if (robust) {
robust_model = model;
} else {
// make robust
robust_model = noiseModel::Robust::Create(
noiseModel::mEstimator::Huber::Create(k), model);
}
BinaryMeasurement<Rot> meas(measurement.key1(), measurement.key2(),
measurement.measured(), robust_model);
robustMeasurements.push_back(meas);
} }
return robustMeasurements; return robustMeasurements;
} }