robust noise in place - test fails due to non-isotropic covariance?
							parent
							
								
									6aed1685ed
								
							
						
					
					
						commit
						001a55ad3a
					
				|  | @ -820,15 +820,13 @@ template class ShonanAveraging<2>; | |||
| 
 | ||||
| ShonanAveraging2::ShonanAveraging2(const Measurements &measurements, | ||||
|                                    const Parameters ¶meters) | ||||
|     : 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 ¶meters) | ||||
|     : 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 ¶meters) | ||||
|     : 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 ¶meters) | ||||
|     : 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 ¶meters) | ||||
|     : ShonanAveraging<3>(parameters.useHuber? | ||||
|     		extractRot3Measurements(factors) : | ||||
|     		makeNoiseModelRobust( extractRot3Measurements(factors) ): | ||||
| 			extractRot3Measurements(factors), parameters) {} | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  |  | |||
|  | @ -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(); } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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()); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue