214 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			214 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
|  | /* ----------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation,  | ||
|  |  * Atlanta, Georgia 30332-0415 | ||
|  |  * All Rights Reserved | ||
|  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | ||
|  | 
 | ||
|  |  * See LICENSE for the license information | ||
|  | 
 | ||
|  |  * -------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @file testSerializationSLAM.cpp | ||
|  |  * @brief test serialization | ||
|  |  * @author Richard Roberts | ||
|  |  * @date Feb 7, 2012 | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <tests/smallExample.h>
 | ||
|  | 
 | ||
|  | #include <gtsam/slam/planarSLAM.h>
 | ||
|  | #include <gtsam/slam/visualSLAM.h>
 | ||
|  | #include <gtsam/nonlinear/Symbol.h>
 | ||
|  | #include <gtsam/linear/GaussianISAM.h>
 | ||
|  | #include <gtsam/linear/GaussianMultifrontalSolver.h>
 | ||
|  | #include <gtsam/base/serializationTestHelpers.h>
 | ||
|  | #include <CppUnitLite/TestHarness.h>
 | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | using namespace gtsam; | ||
|  | using namespace gtsam::serializationTestHelpers; | ||
|  | 
 | ||
|  | // Convenience for named keys
 | ||
|  | using symbol_shorthand::X; | ||
|  | using symbol_shorthand::L; | ||
|  | 
 | ||
|  | /* Create GUIDs for factors */ | ||
|  | /* ************************************************************************* */ | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::JacobianFactor, "gtsam::JacobianFactor"); | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::HessianFactor , "gtsam::HessianFactor"); | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | // Export Noisemodels
 | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Constrained, "gtsam_noiseModel_Constrained"); | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Diagonal, "gtsam_noiseModel_Diagonal"); | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Gaussian, "gtsam_noiseModel_Gaussian"); | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Unit, "gtsam_noiseModel_Unit"); | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Isotropic, "gtsam_noiseModel_Isotropic"); | ||
|  | 
 | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::SharedNoiseModel, "gtsam_SharedNoiseModel"); | ||
|  | BOOST_CLASS_EXPORT_GUID(gtsam::SharedDiagonal, "gtsam_SharedDiagonal"); | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST (Serialization, smallExample_linear) { | ||
|  |   using namespace example; | ||
|  | 
 | ||
|  |   Ordering ordering; ordering += X(1),X(2),L(1); | ||
|  |   GaussianFactorGraph fg = createGaussianFactorGraph(ordering); | ||
|  |   EXPECT(equalsObj(ordering)); | ||
|  |   EXPECT(equalsXML(ordering)); | ||
|  | 
 | ||
|  |   EXPECT(equalsObj(fg)); | ||
|  |   EXPECT(equalsXML(fg)); | ||
|  | 
 | ||
|  |   GaussianBayesNet cbn = createSmallGaussianBayesNet(); | ||
|  |   EXPECT(equalsObj(cbn)); | ||
|  |   EXPECT(equalsXML(cbn)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST (Serialization, gaussianISAM) { | ||
|  |   using namespace example; | ||
|  |   Ordering ordering; | ||
|  |   GaussianFactorGraph smoother; | ||
|  |   boost::tie(smoother, ordering) = createSmoother(7); | ||
|  |   BayesTree<GaussianConditional> bayesTree = *GaussianMultifrontalSolver(smoother).eliminate(); | ||
|  |   GaussianISAM isam(bayesTree); | ||
|  | 
 | ||
|  |   EXPECT(equalsObj(isam)); | ||
|  |   EXPECT(equalsXML(isam)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | /* Create GUIDs for factors in simulated2D */ | ||
|  | BOOST_CLASS_EXPORT_GUID(simulated2D::Prior,       "gtsam::simulated2D::Prior"      ) | ||
|  | BOOST_CLASS_EXPORT_GUID(simulated2D::Odometry,    "gtsam::simulated2D::Odometry"   ) | ||
|  | BOOST_CLASS_EXPORT_GUID(simulated2D::Measurement, "gtsam::simulated2D::Measurement") | ||
|  | BOOST_CLASS_EXPORT(gtsam::Point2) | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST (Serialization, smallExample) { | ||
|  |   using namespace example; | ||
|  |   Graph nfg = createNonlinearFactorGraph(); | ||
|  |   Values c1 = createValues(); | ||
|  |   EXPECT(equalsObj(nfg)); | ||
|  |   EXPECT(equalsXML(nfg)); | ||
|  | 
 | ||
|  |   EXPECT(equalsObj(c1)); | ||
|  |   EXPECT(equalsXML(c1)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | /* Create GUIDs for factors */ | ||
|  | BOOST_CLASS_EXPORT_GUID(planarSLAM::Prior,       "gtsam::planarSLAM::Prior"); | ||
|  | BOOST_CLASS_EXPORT_GUID(planarSLAM::Bearing,     "gtsam::planarSLAM::Bearing"); | ||
|  | BOOST_CLASS_EXPORT_GUID(planarSLAM::Range,       "gtsam::planarSLAM::Range"); | ||
|  | BOOST_CLASS_EXPORT_GUID(planarSLAM::BearingRange,"gtsam::planarSLAM::BearingRange"); | ||
|  | BOOST_CLASS_EXPORT_GUID(planarSLAM::Odometry,    "gtsam::planarSLAM::Odometry"); | ||
|  | BOOST_CLASS_EXPORT_GUID(planarSLAM::Constraint,  "gtsam::planarSLAM::Constraint"); | ||
|  | 
 | ||
|  | BOOST_CLASS_EXPORT(gtsam::Pose2) | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST (Serialization, planar_system) { | ||
|  |   using namespace planarSLAM; | ||
|  |   planarSLAM::Values values; | ||
|  | 	Symbol i2('x',2), i3('x',3), i4('x',4), i9('x',9), j3('l',3), j5('l',5), j9('l',9); | ||
|  |   values.insert(j3, Point2(1.0, 2.0)); | ||
|  |   values.insert(i4, Pose2(1.0, 2.0, 0.3)); | ||
|  | 
 | ||
|  |   SharedNoiseModel model1 = noiseModel::Isotropic::Sigma(1, 0.3); | ||
|  |   SharedNoiseModel model2 = noiseModel::Isotropic::Sigma(2, 0.3); | ||
|  |   SharedNoiseModel model3 = noiseModel::Isotropic::Sigma(3, 0.3); | ||
|  | 
 | ||
|  |   Prior prior(i3, Pose2(0.1,-0.3, 0.2), model1); | ||
|  |   Bearing bearing(i3, j5, Rot2::fromDegrees(0.5), model1); | ||
|  |   Range range(i2, j9, 7.0, model1); | ||
|  |   BearingRange bearingRange(i2, j3, Rot2::fromDegrees(0.6), 2.0, model2); | ||
|  |   Odometry odometry(i2, i3, Pose2(1.0, 2.0, 0.3), model3); | ||
|  |   Constraint constraint(i9, Pose2(2.0,-1.0, 0.2)); | ||
|  | 
 | ||
|  |   Graph graph; | ||
|  |   graph.add(prior); | ||
|  |   graph.add(bearing); | ||
|  |   graph.add(range); | ||
|  |   graph.add(bearingRange); | ||
|  |   graph.add(odometry); | ||
|  |   graph.add(constraint); | ||
|  | 
 | ||
|  |   // text
 | ||
|  |   EXPECT(equalsObj<Symbol>(i2)); | ||
|  |   EXPECT(equalsObj<Symbol>(j3)); | ||
|  |   EXPECT(equalsObj<planarSLAM::Values>(values)); | ||
|  |   EXPECT(equalsObj<Prior>(prior)); | ||
|  |   EXPECT(equalsObj<Bearing>(bearing)); | ||
|  |   EXPECT(equalsObj<BearingRange>(bearingRange)); | ||
|  |   EXPECT(equalsObj<Range>(range)); | ||
|  |   EXPECT(equalsObj<Odometry>(odometry)); | ||
|  |   EXPECT(equalsObj<Constraint>(constraint)); | ||
|  |   EXPECT(equalsObj<Graph>(graph)); | ||
|  | 
 | ||
|  |   // xml
 | ||
|  |   EXPECT(equalsXML<Symbol>(i2)); | ||
|  |   EXPECT(equalsXML<Symbol>(j3)); | ||
|  |   EXPECT(equalsXML<planarSLAM::Values>(values)); | ||
|  |   EXPECT(equalsXML<Prior>(prior)); | ||
|  |   EXPECT(equalsXML<Bearing>(bearing)); | ||
|  |   EXPECT(equalsXML<BearingRange>(bearingRange)); | ||
|  |   EXPECT(equalsXML<Range>(range)); | ||
|  |   EXPECT(equalsXML<Odometry>(odometry)); | ||
|  |   EXPECT(equalsXML<Constraint>(constraint)); | ||
|  |   EXPECT(equalsXML<Graph>(graph)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | /* Create GUIDs for factors */ | ||
|  | BOOST_CLASS_EXPORT_GUID(visualSLAM::PoseConstraint,  "gtsam::visualSLAM::PoseConstraint"); | ||
|  | BOOST_CLASS_EXPORT_GUID(visualSLAM::PointConstraint, "gtsam::visualSLAM::PointConstraint"); | ||
|  | BOOST_CLASS_EXPORT_GUID(visualSLAM::PosePrior,       "gtsam::visualSLAM::PosePrior"); | ||
|  | BOOST_CLASS_EXPORT_GUID(visualSLAM::PointPrior,      "gtsam::visualSLAM::PointPrior"); | ||
|  | BOOST_CLASS_EXPORT_GUID(visualSLAM::ProjectionFactor,"gtsam::visualSLAM::ProjectionFactor"); | ||
|  | BOOST_CLASS_EXPORT_GUID(visualSLAM::StereoFactor,    "gtsam::visualSLAM::StereoFactor"); | ||
|  | 
 | ||
|  | BOOST_CLASS_EXPORT(gtsam::Pose3) | ||
|  | BOOST_CLASS_EXPORT(gtsam::Point3) | ||
|  | 
 | ||
|  | Point3 pt3(1.0, 2.0, 3.0); | ||
|  | Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); | ||
|  | Pose3 pose3(rt3, pt3); | ||
|  | Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST (Serialization, visual_system) { | ||
|  |   using namespace visualSLAM; | ||
|  |   visualSLAM::Values values; | ||
|  |   Symbol x1('x',1), x2('x',2); | ||
|  |   Symbol l1('l',1), l2('l',2); | ||
|  |   Pose3 pose1 = pose3, pose2 = pose3.inverse(); | ||
|  |   Point3 pt1(1.0, 2.0, 3.0), pt2(4.0, 5.0, 6.0); | ||
|  |   values.insert(x1, pose1); | ||
|  |   values.insert(l1, pt1); | ||
|  |   SharedNoiseModel model2 = noiseModel::Isotropic::Sigma(2, 0.3); | ||
|  |   SharedNoiseModel model3 = noiseModel::Isotropic::Sigma(3, 0.3); | ||
|  |   SharedNoiseModel model6 = noiseModel::Isotropic::Sigma(6, 0.3); | ||
|  |   boost::shared_ptr<Cal3_S2> K(new Cal3_S2(cal1)); | ||
|  | 
 | ||
|  |   Graph graph; | ||
|  |   graph.addMeasurement(Point2(1.0, 2.0), model2, x1, l1, K); | ||
|  |   graph.addPointConstraint(l1, pt1); | ||
|  |   graph.addPointPrior(l1, pt2, model3); | ||
|  |   graph.addPoseConstraint(x1, pose1); | ||
|  |   graph.addPosePrior(x1, pose2, model6); | ||
|  | 
 | ||
|  |   EXPECT(equalsObj(values)); | ||
|  |   EXPECT(equalsObj(graph)); | ||
|  | 
 | ||
|  |   EXPECT(equalsXML(values)); | ||
|  |   EXPECT(equalsXML(graph)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | ||
|  | /* ************************************************************************* */ |