| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-11 22:39:48 +08:00
										 |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | 
					
						
							| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  |  * 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2012-03-15 10:10:37 +08:00
										 |  |  |  *  @file   testGaussianFactorGraphB.cpp | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |  *  @brief  Unit tests for Linear Factor Graph | 
					
						
							|  |  |  |  *  @author Christian Potthast | 
					
						
							|  |  |  |  **/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-10 04:15:44 +08:00
										 |  |  | #include <tests/smallExample.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-19 23:32:16 +08:00
										 |  |  | #include <gtsam/inference/Symbol.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:33 +08:00
										 |  |  | #include <gtsam/linear/GaussianBayesNet.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  | #include <gtsam/linear/GaussianBayesTree.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:33 +08:00
										 |  |  | #include <gtsam/linear/GaussianFactorGraph.h>
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:05:38 +08:00
										 |  |  | #include <gtsam/base/numericalDerivative.h>
 | 
					
						
							|  |  |  | #include <gtsam/base/Matrix.h>
 | 
					
						
							|  |  |  | #include <gtsam/base/Testable.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <boost/tuple/tuple.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2010-05-24 16:57:22 +08:00
										 |  |  | #include <boost/assign/std/set.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2009-12-27 06:48:41 +08:00
										 |  |  | #include <boost/assign/std/vector.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | using namespace boost::assign; | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  | #include <boost/range/adaptor/map.hpp>
 | 
					
						
							|  |  |  | namespace br { using namespace boost::range; using namespace boost::adaptors; } | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:05:38 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2010-07-08 05:41:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:05:38 +08:00
										 |  |  | using namespace std; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | using namespace gtsam; | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | using namespace example; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-27 12:39:35 +08:00
										 |  |  | double tol=1e-5; | 
					
						
							| 
									
										
										
										
											2009-10-25 07:14:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  | using symbol_shorthand::X; | 
					
						
							|  |  |  | using symbol_shorthand::L; | 
					
						
							| 
									
										
										
										
											2012-02-21 08:53:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | static auto kUnit2 = noiseModel::Unit::Create(2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | TEST( GaussianFactorGraph, equals ) { | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   GaussianFactorGraph fg2 = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(fg.equals(fg2)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | TEST( GaussianFactorGraph, error ) { | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   VectorValues cfg = createZeroDelta(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-04 02:00:26 +08:00
										 |  |  |   // note the error is the same as in testNonlinearFactorGraph as a
 | 
					
						
							|  |  |  |   // zero delta config in the linear graph is equivalent to noisy in
 | 
					
						
							|  |  |  |   // non-linear, which is really linear under the hood
 | 
					
						
							|  |  |  |   double actual = fg.error(cfg); | 
					
						
							|  |  |  |   DOUBLES_EQUAL( 5.625, actual, 1e-9 ); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | TEST(GaussianFactorGraph, eliminateOne_x1) { | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianConditional::shared_ptr conditional; | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   auto result = fg.eliminatePartialSequential(Ordering(list_of(X(1)))); | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   conditional = result.first->front(); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected Conditional Gaussian
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   Matrix I = 15 * I_2x2, R11 = I, S12 = -0.111111 * I, S13 = -0.444444 * I; | 
					
						
							| 
									
										
										
										
											2014-11-24 02:22:25 +08:00
										 |  |  |   Vector d = Vector2(-0.133333, -0.0222222); | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   GaussianConditional expected(X(1), 15 * d, R11, L(1), S12, X(2), S13); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   EXPECT(assert_equal(expected, *conditional, tol)); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | TEST(GaussianFactorGraph, eliminateOne_x2) { | 
					
						
							|  |  |  |   Ordering ordering; | 
					
						
							|  |  |  |   ordering += X(2), L(1), X(1); | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   auto actual = EliminateQR(fg, Ordering(list_of(X(2)))).first; | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected Conditional Gaussian
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   double sigma = 0.0894427; | 
					
						
							|  |  |  |   Matrix I = I_2x2 / sigma, R11 = I, S12 = -0.2 * I, S13 = -0.8 * I; | 
					
						
							|  |  |  |   Vector d = Vector2(0.2, -0.14) / sigma; | 
					
						
							|  |  |  |   GaussianConditional expected(X(2), d, R11, L(1), S12, X(1), S13, kUnit2); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   EXPECT(assert_equal(expected, *actual, tol)); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | TEST(GaussianFactorGraph, eliminateOne_l1) { | 
					
						
							|  |  |  |   Ordering ordering; | 
					
						
							|  |  |  |   ordering += L(1), X(1), X(2); | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   auto actual = EliminateQR(fg, Ordering(list_of(L(1)))).first; | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected Conditional Gaussian
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   double sigma = sqrt(2.0) / 10.; | 
					
						
							|  |  |  |   Matrix I = I_2x2 / sigma, R11 = I, S12 = -0.5 * I, S13 = -0.5 * I; | 
					
						
							|  |  |  |   Vector d = Vector2(-0.1, 0.25) / sigma; | 
					
						
							|  |  |  |   GaussianConditional expected(L(1), d, R11, X(1), S12, X(2), S13, kUnit2); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   EXPECT(assert_equal(expected, *actual, tol)); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | TEST(GaussianFactorGraph, eliminateOne_x1_fast) { | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianConditional::shared_ptr conditional; | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   JacobianFactor::shared_ptr remaining; | 
					
						
							|  |  |  |   boost::tie(conditional, remaining) = EliminateQR(fg, Ordering(list_of(X(1)))); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected Conditional Gaussian
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   Matrix I = 15 * I_2x2, R11 = I, S12 = -0.111111 * I, S13 = -0.444444 * I; | 
					
						
							|  |  |  |   Vector d = Vector2(-0.133333, -0.0222222); | 
					
						
							|  |  |  |   GaussianConditional expected(X(1), 15 * d, R11, L(1), S12, X(2), S13, kUnit2); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Create expected remaining new factor
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   JacobianFactor expectedFactor( | 
					
						
							|  |  |  |       L(1), (Matrix(4, 2) << 6.87184, 0, 0, 6.87184, 0, 0, 0, 0).finished(), | 
					
						
							|  |  |  |       X(2), | 
					
						
							|  |  |  |       (Matrix(4, 2) << -5.25494, 0, 0, -5.25494, -7.27607, 0, 0, -7.27607) | 
					
						
							|  |  |  |           .finished(), | 
					
						
							|  |  |  |       (Vector(4) << -1.21268, 1.73817, -0.727607, 1.45521).finished(), | 
					
						
							|  |  |  |       noiseModel::Unit::Create(4)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, *conditional, tol)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expectedFactor, *remaining, tol)); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | TEST(GaussianFactorGraph, eliminateOne_x2_fast) { | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   auto actual = EliminateQR(fg, Ordering(list_of(X(2)))).first; | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected Conditional Gaussian
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   double sigma = 0.0894427; | 
					
						
							|  |  |  |   Matrix I = I_2x2 / sigma, R11 = -I, S12 = 0.2 * I, S13 = 0.8 * I; | 
					
						
							|  |  |  |   Vector d = Vector2(-0.2, 0.14) / sigma; | 
					
						
							|  |  |  |   GaussianConditional expected(X(2), d, R11, L(1), S12, X(1), S13, kUnit2); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   EXPECT(assert_equal(expected, *actual, tol)); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  | TEST(GaussianFactorGraph, eliminateOne_l1_fast) { | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   auto actual = EliminateQR(fg, Ordering(list_of(L(1)))).first; | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected Conditional Gaussian
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   double sigma = sqrt(2.0) / 10.; | 
					
						
							|  |  |  |   Matrix I = I_2x2 / sigma, R11 = -I, S12 = 0.5 * I, S13 = 0.5 * I; | 
					
						
							|  |  |  |   Vector d = Vector2(0.1, -0.25) / sigma; | 
					
						
							|  |  |  |   GaussianConditional expected(L(1), d, R11, X(1), S12, X(2), S13, kUnit2); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   EXPECT(assert_equal(expected, *actual, tol)); | 
					
						
							| 
									
										
										
										
											2012-03-04 04:23:03 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, copying) { | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |   // Create a graph
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   GaussianFactorGraph actual = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Copy the graph !
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph copy = actual; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // now eliminate the copy
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianBayesNet actual1 = *copy.eliminateSequential(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Create the same graph, but not by copying
 | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   GaussianFactorGraph expected = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // and check that original is still the same graph
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, CONSTRUCTOR_GaussianBayesNet) { | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // render with a given ordering
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianBayesNet CBN = *fg.eliminateSequential(); | 
					
						
							| 
									
										
										
										
											2009-11-05 12:56:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  |   // True GaussianFactorGraph
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph fg2(CBN); | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianBayesNet CBN2 = *fg2.eliminateSequential(); | 
					
						
							|  |  |  |   EXPECT(assert_equal(CBN, CBN2)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, optimize_Cholesky) { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create a graph
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // optimize the graph
 | 
					
						
							| 
									
										
										
										
											2019-10-20 13:15:20 +08:00
										 |  |  |   VectorValues actual = fg.optimize(EliminateCholesky); | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   VectorValues expected = createCorrectDelta(); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | TEST( GaussianFactorGraph, optimize_QR ) | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   // create a graph
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // optimize the graph
 | 
					
						
							| 
									
										
										
										
											2019-10-20 13:15:20 +08:00
										 |  |  |   VectorValues actual = fg.optimize(EliminateQR); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   VectorValues expected = createCorrectDelta(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, combine) { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // create a test graph
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianFactorGraph fg1 = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // create another factor graph
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianFactorGraph fg2 = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // get sizes
 | 
					
						
							|  |  |  |   size_t size1 = fg1.size(); | 
					
						
							|  |  |  |   size_t size2 = fg2.size(); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // combine them
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   fg1.push_back(fg2); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   EXPECT(size1 + size2 == fg1.size()); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-10-22 13:02:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // print a vector of ints if needed for debugging
 | 
					
						
							|  |  |  | void print(vector<int> v) { | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   for (size_t k = 0; k < v.size(); k++) cout << v[k] << " "; | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   cout << endl; | 
					
						
							| 
									
										
										
										
											2009-10-22 13:02:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-27 21:34:36 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, createSmoother) { | 
					
						
							|  |  |  |   GaussianFactorGraph fg1 = createSmoother(2); | 
					
						
							|  |  |  |   LONGS_EQUAL(3, fg1.size()); | 
					
						
							|  |  |  |   GaussianFactorGraph fg2 = createSmoother(3); | 
					
						
							|  |  |  |   LONGS_EQUAL(5, fg2.size()); | 
					
						
							| 
									
										
										
										
											2009-10-27 21:34:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 04:19:15 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | double error(const VectorValues& x) { | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   return fg.error(x); | 
					
						
							| 
									
										
										
										
											2009-12-12 12:44:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-27 06:48:41 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, multiplication) { | 
					
						
							|  |  |  |   GaussianFactorGraph A = createGaussianFactorGraph(); | 
					
						
							|  |  |  |   VectorValues x = createCorrectDelta(); | 
					
						
							| 
									
										
										
										
											2009-12-27 06:48:41 +08:00
										 |  |  |   Errors actual = A * x; | 
					
						
							|  |  |  |   Errors expected; | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   expected += Vector2(-1.0, -1.0); | 
					
						
							|  |  |  |   expected += Vector2(2.0, -1.0); | 
					
						
							| 
									
										
										
										
											2014-11-24 02:22:25 +08:00
										 |  |  |   expected += Vector2(0.0, 1.0); | 
					
						
							|  |  |  |   expected += Vector2(-1.0, 1.5); | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-12-26 23:06:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | // Extra test on elimination prompted by Michael's email to Frank 1/4/2010
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | TEST(GaussianFactorGraph, elimination) { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // Create Gaussian Factor Graph
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph fg; | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   Matrix Ap = I_1x1, An = I_1x1 * -1; | 
					
						
							| 
									
										
										
										
											2014-11-23 08:35:27 +08:00
										 |  |  |   Vector b = (Vector(1) << 0.0).finished(); | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   SharedDiagonal sigma = noiseModel::Isotropic::Sigma(1, 2.0); | 
					
						
							|  |  |  |   fg += JacobianFactor(X(1), An, X(2), Ap, b, sigma); | 
					
						
							|  |  |  |   fg += JacobianFactor(X(1), Ap, b, sigma); | 
					
						
							|  |  |  |   fg += JacobianFactor(X(2), Ap, b, sigma); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Eliminate
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   Ordering ordering; | 
					
						
							|  |  |  |   ordering += X(1), X(2); | 
					
						
							|  |  |  |   GaussianBayesNet bayesNet = *fg.eliminateSequential(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Check matrix
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |   Matrix R; | 
					
						
							|  |  |  |   Vector d; | 
					
						
							|  |  |  |   boost::tie(R, d) = bayesNet.matrix(); | 
					
						
							|  |  |  |   Matrix expected = | 
					
						
							|  |  |  |       (Matrix(2, 2) << 0.707107, -0.353553, 0.0, 0.612372).finished(); | 
					
						
							|  |  |  |   Matrix expected2 = | 
					
						
							|  |  |  |       (Matrix(2, 2) << 0.707107, -0.353553, 0.0, -0.612372).finished(); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, R, 1e-6)); | 
					
						
							|  |  |  |   EXPECT(equal_with_abs_tol(expected, R, 1e-6) || | 
					
						
							|  |  |  |          equal_with_abs_tol(expected2, R, 1e-6)); | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | // Tests ported from ConstrainedGaussianFactorGraph
 | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:33:23 +08:00
										 |  |  | TEST(GaussianFactorGraph, constrained_simple) { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // get a graph with a constraint in it
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph fg = createSimpleConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(hasConstraints(fg)); | 
					
						
							| 
									
										
										
										
											2011-11-11 03:44:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // eliminate and solve
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:33:23 +08:00
										 |  |  |   VectorValues actual = fg.eliminateSequential()->optimize(); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   VectorValues expected = createSimpleConstraintValues(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:33:23 +08:00
										 |  |  | TEST(GaussianFactorGraph, constrained_single) { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // get a graph with a constraint in it
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph fg = createSingleConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(hasConstraints(fg)); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // eliminate and solve
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:33:23 +08:00
										 |  |  |   VectorValues actual = fg.eliminateSequential()->optimize(); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   VectorValues expected = createSingleConstraintValues(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2019-05-16 08:33:23 +08:00
										 |  |  | TEST(GaussianFactorGraph, constrained_multi1) { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // get a graph with a constraint in it
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph fg = createMultiConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(hasConstraints(fg)); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // eliminate and solve
 | 
					
						
							| 
									
										
										
										
											2019-05-16 08:33:23 +08:00
										 |  |  |   VectorValues actual = fg.eliminateSequential()->optimize(); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   VectorValues expected = createMultiConstraintValues(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-14 07:59:46 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-21 02:32:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-04 02:00:26 +08:00
										 |  |  | static SharedDiagonal model = noiseModel::Isotropic::Sigma(2,1); | 
					
						
							| 
									
										
										
										
											2010-01-09 03:07:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | TEST(GaussianFactorGraph, replace) | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   Ordering ord; ord += X(1),X(2),X(3),X(4),X(5),X(6); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   SharedDiagonal noise(noiseModel::Isotropic::Sigma(3, 1.0)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph::sharedFactor f1(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |       X(1), I_3x3, X(2), I_3x3, Z_3x1, noise)); | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph::sharedFactor f2(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |       X(2), I_3x3, X(3), I_3x3, Z_3x1, noise)); | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph::sharedFactor f3(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |       X(3), I_3x3, X(4), I_3x3, Z_3x1, noise)); | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph::sharedFactor f4(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2019-05-16 08:10:46 +08:00
										 |  |  |       X(5), I_3x3, X(6), I_3x3, Z_3x1, noise)); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph actual; | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   actual.push_back(f1); | 
					
						
							|  |  |  |   actual.push_back(f2); | 
					
						
							|  |  |  |   actual.push_back(f3); | 
					
						
							|  |  |  |   actual.replace(0, f4); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph expected; | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   expected.push_back(f4); | 
					
						
							|  |  |  |   expected.push_back(f2); | 
					
						
							|  |  |  |   expected.push_back(f3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-11 03:44:03 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | TEST(GaussianFactorGraph, hasConstraints) | 
					
						
							| 
									
										
										
										
											2011-11-11 03:44:03 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   FactorGraph<GaussianFactor> fgc1 = createMultiConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(hasConstraints(fgc1)); | 
					
						
							| 
									
										
										
										
											2011-11-11 03:44:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   FactorGraph<GaussianFactor> fgc2 = createSimpleConstraintGraph() ; | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(hasConstraints(fgc2)); | 
					
						
							| 
									
										
										
										
											2011-11-11 03:44:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(!hasConstraints(fg)); | 
					
						
							| 
									
										
										
										
											2011-11-11 03:44:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  | #include <gtsam/slam/ProjectionFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam/geometry/Pose3.h>
 | 
					
						
							| 
									
										
										
										
											2015-07-13 03:06:55 +08:00
										 |  |  | #include <gtsam/sam/RangeFactor.h>
 | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  | TEST( GaussianFactorGraph, conditional_sigma_failure) { | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  |   // This system derives from a failure case in DDF in which a Bayes Tree
 | 
					
						
							|  |  |  |   // has non-unit sigmas for conditionals in the Bayes Tree, which
 | 
					
						
							|  |  |  |   // should never happen by construction
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Reason for the failure: using Vector_() is dangerous as having a non-float gets set to zero, resulting in constraints
 | 
					
						
							|  |  |  |   gtsam::Key xC1 = 0, l32 = 1, l41 = 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // noisemodels at nonlinear level
 | 
					
						
							| 
									
										
										
										
											2014-11-23 08:35:27 +08:00
										 |  |  |   gtsam::SharedNoiseModel priorModel = noiseModel::Diagonal::Sigmas((Vector(6) << 0.05, 0.05, 3.0, 0.2, 0.2, 0.2).finished()); | 
					
						
							| 
									
										
										
										
											2019-05-16 05:40:57 +08:00
										 |  |  |   gtsam::SharedNoiseModel measModel = kUnit2; | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  |   gtsam::SharedNoiseModel elevationModel = noiseModel::Isotropic::Sigma(1, 3.0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   double fov = 60; // degrees
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   int imgW = 640; // pixels
 | 
					
						
							|  |  |  |   int imgH = 480; // pixels
 | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  |   gtsam::Cal3_S2::shared_ptr K(new gtsam::Cal3_S2(fov, imgW, imgH)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   typedef GenericProjectionFactor<Pose3, Point3> ProjectionFactor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   double relElevation = 6; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Values initValues; | 
					
						
							|  |  |  |   initValues.insert(xC1, | 
					
						
							|  |  |  |       Pose3(Rot3( | 
					
						
							|  |  |  |           -1.,           0.0,  1.2246468e-16, | 
					
						
							|  |  |  |           0.0,             1.,           0.0, | 
					
						
							|  |  |  |           -1.2246468e-16,           0.0,            -1.), | 
					
						
							|  |  |  |           Point3(0.511832102, 8.42819594, 5.76841725))); | 
					
						
							|  |  |  |   initValues.insert(l32,  Point3(0.364081507, 6.89766221, -0.231582751) ); | 
					
						
							|  |  |  |   initValues.insert(l41,  Point3(1.61051523, 6.7373052, -0.231582751)   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   NonlinearFactorGraph factors; | 
					
						
							| 
									
										
										
										
											2020-04-13 01:10:09 +08:00
										 |  |  |   factors.addPrior(xC1, | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  |       Pose3(Rot3( | 
					
						
							|  |  |  |           -1.,           0.0,  1.2246468e-16, | 
					
						
							|  |  |  |           0.0,             1.,           0.0, | 
					
						
							|  |  |  |           -1.2246468e-16,           0.0,            -1), | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |           Point3(0.511832102, 8.42819594, 5.76841725)), priorModel); | 
					
						
							|  |  |  |   factors += ProjectionFactor(Point2(333.648615, 98.61535), measModel, xC1, l32, K); | 
					
						
							|  |  |  |   factors += ProjectionFactor(Point2(218.508, 83.8022039), measModel, xC1, l41, K); | 
					
						
							|  |  |  |   factors += RangeFactor<Pose3,Point3>(xC1, l32, relElevation, elevationModel); | 
					
						
							|  |  |  |   factors += RangeFactor<Pose3,Point3>(xC1, l41, relElevation, elevationModel); | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Check that sigmas are correct (i.e., unit)
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   GaussianFactorGraph lfg = *factors.linearize(initValues); | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |   GaussianBayesTree actBT = *lfg.eliminateMultifrontal(); | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Check that all sigmas in an unconstrained bayes tree are set to one
 | 
					
						
							| 
									
										
										
										
											2016-05-21 09:29:02 +08:00
										 |  |  |   for(const GaussianBayesTree::sharedClique& clique: actBT.nodes() | br::map_values) { | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |     GaussianConditional::shared_ptr conditional = clique->conditional(); | 
					
						
							| 
									
										
										
										
											2013-10-26 02:27:43 +08:00
										 |  |  |     //size_t dim = conditional->rows();
 | 
					
						
							| 
									
										
										
										
											2016-04-16 05:30:54 +08:00
										 |  |  |     //EXPECT(assert_equal(gtsam::Vector::Ones(dim), conditional->get_model()->sigmas(), tol));
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  |     EXPECT(!conditional->get_model()); | 
					
						
							| 
									
										
										
										
											2012-10-05 04:23:45 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { TestResult tr; return TestRegistry::runAllTests(tr);} | 
					
						
							|  |  |  | /* ************************************************************************* */ |