Updating unit tests for new NonlinearOptimizer
							parent
							
								
									8748f483b0
								
							
						
					
					
						commit
						9312b0a128
					
				| 
						 | 
					@ -21,7 +21,7 @@
 | 
				
			||||||
					<folderInfo id="cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.2031210194" name="/" resourcePath="">
 | 
										<folderInfo id="cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.2031210194" name="/" resourcePath="">
 | 
				
			||||||
						<toolChain id="cdt.managedbuild.toolchain.gnu.macosx.base.677243255" name="cdt.managedbuild.toolchain.gnu.macosx.base" superClass="cdt.managedbuild.toolchain.gnu.macosx.base">
 | 
											<toolChain id="cdt.managedbuild.toolchain.gnu.macosx.base.677243255" name="cdt.managedbuild.toolchain.gnu.macosx.base" superClass="cdt.managedbuild.toolchain.gnu.macosx.base">
 | 
				
			||||||
							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.MachO64" id="cdt.managedbuild.target.gnu.platform.macosx.base.752782918" name="Debug Platform" osList="macosx" superClass="cdt.managedbuild.target.gnu.platform.macosx.base"/>
 | 
												<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.MachO64" id="cdt.managedbuild.target.gnu.platform.macosx.base.752782918" name="Debug Platform" osList="macosx" superClass="cdt.managedbuild.target.gnu.platform.macosx.base"/>
 | 
				
			||||||
							<builder arguments="" buildPath="${ProjDirPath}/build" command="make" id="cdt.managedbuild.target.gnu.builder.macosx.base.319933862" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="false" parallelizationNumber="5" superClass="cdt.managedbuild.target.gnu.builder.macosx.base"/>
 | 
												<builder arguments="" buildPath="${ProjDirPath}/build" command="make" id="cdt.managedbuild.target.gnu.builder.macosx.base.319933862" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="5" superClass="cdt.managedbuild.target.gnu.builder.macosx.base"/>
 | 
				
			||||||
							<tool id="cdt.managedbuild.tool.macosx.c.linker.macosx.base.457360678" name="MacOS X C Linker" superClass="cdt.managedbuild.tool.macosx.c.linker.macosx.base"/>
 | 
												<tool id="cdt.managedbuild.tool.macosx.c.linker.macosx.base.457360678" name="MacOS X C Linker" superClass="cdt.managedbuild.tool.macosx.c.linker.macosx.base"/>
 | 
				
			||||||
							<tool id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.base.1011140787" name="MacOS X C++ Linker" superClass="cdt.managedbuild.tool.macosx.cpp.linker.macosx.base">
 | 
												<tool id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.base.1011140787" name="MacOS X C++ Linker" superClass="cdt.managedbuild.tool.macosx.cpp.linker.macosx.base">
 | 
				
			||||||
								<inputType id="cdt.managedbuild.tool.macosx.cpp.linker.input.1032375444" superClass="cdt.managedbuild.tool.macosx.cpp.linker.input">
 | 
													<inputType id="cdt.managedbuild.tool.macosx.cpp.linker.input.1032375444" superClass="cdt.managedbuild.tool.macosx.cpp.linker.input">
 | 
				
			||||||
| 
						 | 
					@ -2186,4 +2186,5 @@
 | 
				
			||||||
			</target>
 | 
								</target>
 | 
				
			||||||
		</buildTargets>
 | 
							</buildTargets>
 | 
				
			||||||
	</storageModule>
 | 
						</storageModule>
 | 
				
			||||||
 | 
						<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
 | 
				
			||||||
</cproject>
 | 
					</cproject>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								.project
								
								
								
								
							
							
						
						
									
										2
									
								
								.project
								
								
								
								
							| 
						 | 
					@ -23,7 +23,7 @@
 | 
				
			||||||
				</dictionary>
 | 
									</dictionary>
 | 
				
			||||||
				<dictionary>
 | 
									<dictionary>
 | 
				
			||||||
					<key>org.eclipse.cdt.make.core.buildArguments</key>
 | 
										<key>org.eclipse.cdt.make.core.buildArguments</key>
 | 
				
			||||||
					<value></value>
 | 
										<value>-j5</value>
 | 
				
			||||||
				</dictionary>
 | 
									</dictionary>
 | 
				
			||||||
				<dictionary>
 | 
									<dictionary>
 | 
				
			||||||
					<key>org.eclipse.cdt.make.core.buildCommand</key>
 | 
										<key>org.eclipse.cdt.make.core.buildCommand</key>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,6 +69,7 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * This class performs Gauss-Newton nonlinear optimization
 | 
					 * This class performs Gauss-Newton nonlinear optimization
 | 
				
			||||||
 | 
					 * TODO: use make_shared
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class GaussNewtonOptimizer : public NonlinearOptimizer {
 | 
					class GaussNewtonOptimizer : public NonlinearOptimizer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,9 +108,9 @@ public:
 | 
				
			||||||
   * @param params The optimization parameters
 | 
					   * @param params The optimization parameters
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  GaussNewtonOptimizer(const SharedGraph& graph, const SharedValues& values,
 | 
					  GaussNewtonOptimizer(const SharedGraph& graph, const SharedValues& values,
 | 
				
			||||||
      const SharedGNParams& params = SharedGNParams(),
 | 
					      const GaussNewtonParams& params = GaussNewtonParams(),
 | 
				
			||||||
      const SharedOrdering& ordering = SharedOrdering()) :
 | 
					      const SharedOrdering& ordering = SharedOrdering()) :
 | 
				
			||||||
        NonlinearOptimizer(graph, values, params ? params : SharedGNParams(new GaussNewtonParams())),
 | 
					        NonlinearOptimizer(graph, values, SharedGNParams(new GaussNewtonParams(params))),
 | 
				
			||||||
        gnParams_(boost::static_pointer_cast<const GaussNewtonParams>(params_)),
 | 
					        gnParams_(boost::static_pointer_cast<const GaussNewtonParams>(params_)),
 | 
				
			||||||
        colamdOrdering_(!ordering || ordering->size() == 0),
 | 
					        colamdOrdering_(!ordering || ordering->size() == 0),
 | 
				
			||||||
        ordering_(colamdOrdering_ ? graph_->orderingCOLAMD(*values_) : ordering) {}
 | 
					        ordering_(colamdOrdering_ ? graph_->orderingCOLAMD(*values_) : ordering) {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,6 +90,7 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * This class performs Levenberg-Marquardt nonlinear optimization
 | 
					 * This class performs Levenberg-Marquardt nonlinear optimization
 | 
				
			||||||
 | 
					 * TODO: use make_shared
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class LevenbergMarquardtOptimizer : public NonlinearOptimizer {
 | 
					class LevenbergMarquardtOptimizer : public NonlinearOptimizer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,9 +131,9 @@ public:
 | 
				
			||||||
   * @param params The optimization parameters
 | 
					   * @param params The optimization parameters
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  LevenbergMarquardtOptimizer(const SharedGraph& graph, const SharedValues& values,
 | 
					  LevenbergMarquardtOptimizer(const SharedGraph& graph, const SharedValues& values,
 | 
				
			||||||
      const SharedLMParams& params = SharedLMParams(),
 | 
					      const LevenbergMarquardtParams& params = LevenbergMarquardtParams(),
 | 
				
			||||||
      const SharedOrdering& ordering = SharedOrdering()) :
 | 
					      const SharedOrdering& ordering = SharedOrdering()) :
 | 
				
			||||||
        NonlinearOptimizer(graph, values, params ? params : SharedLMParams(new LevenbergMarquardtParams())),
 | 
					        NonlinearOptimizer(graph, values, SharedLMParams(new LevenbergMarquardtParams(params))),
 | 
				
			||||||
        lmParams_(boost::static_pointer_cast<const LevenbergMarquardtParams>(params_)),
 | 
					        lmParams_(boost::static_pointer_cast<const LevenbergMarquardtParams>(params_)),
 | 
				
			||||||
        colamdOrdering_(!ordering || ordering->size() == 0),
 | 
					        colamdOrdering_(!ordering || ordering->size() == 0),
 | 
				
			||||||
        ordering_(colamdOrdering_ ? graph_->orderingCOLAMD(*values_) : ordering),
 | 
					        ordering_(colamdOrdering_ ? graph_->orderingCOLAMD(*values_) : ordering),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,8 +17,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/slam/planarSLAM.h>
 | 
					#include <gtsam/slam/planarSLAM.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimization.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Use planarSLAM namespace for specific SLAM instance
 | 
					// Use planarSLAM namespace for specific SLAM instance
 | 
				
			||||||
namespace planarSLAM {
 | 
					namespace planarSLAM {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
#include <gtsam/slam/BearingRangeFactor.h>
 | 
					#include <gtsam/slam/BearingRangeFactor.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
					#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimization.h>
 | 
					#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
				
			||||||
#include <gtsam/geometry/Pose2.h>
 | 
					#include <gtsam/geometry/Pose2.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,15 +110,10 @@ namespace planarSLAM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Optimize
 | 
					    /// Optimize
 | 
				
			||||||
    Values optimize(const Values& initialEstimate) {
 | 
					    Values optimize(const Values& initialEstimate) {
 | 
				
			||||||
      typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					      return *LevenbergMarquardtOptimizer(*this, initialEstimate).optimize()->values();
 | 
				
			||||||
      return *Optimizer::optimizeLM(*this, initialEstimate,
 | 
					 | 
				
			||||||
          NonlinearOptimizationParameters::LAMBDA);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Optimizer
 | 
					 | 
				
			||||||
  typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // planarSLAM
 | 
					} // planarSLAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,8 +21,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Use pose2SLAM namespace for specific SLAM instance
 | 
					// Use pose2SLAM namespace for specific SLAM instance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template class gtsam::NonlinearOptimizer<pose2SLAM::Graph, gtsam::GaussianFactorGraph, gtsam::GaussianSequentialSolver>;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace pose2SLAM {
 | 
					namespace pose2SLAM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* ************************************************************************* */
 | 
					  /* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
#include <gtsam/nonlinear/Values.h>
 | 
					#include <gtsam/nonlinear/Values.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
					#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
 | 
				
			||||||
#include <gtsam/linear/GaussianSequentialSolver.h>
 | 
					#include <gtsam/linear/GaussianSequentialSolver.h>
 | 
				
			||||||
#include <gtsam/linear/GaussianMultifrontalSolver.h>
 | 
					#include <gtsam/linear/GaussianMultifrontalSolver.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,20 +97,10 @@ namespace pose2SLAM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Optimize
 | 
					    /// Optimize
 | 
				
			||||||
    Values optimize(const Values& initialEstimate) {
 | 
					    Values optimize(const Values& initialEstimate) {
 | 
				
			||||||
      typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					      return *LevenbergMarquardtOptimizer(*this, initialEstimate).optimize()->values();
 | 
				
			||||||
      return *Optimizer::optimizeLM(*this, initialEstimate,
 | 
					 | 
				
			||||||
                  NonlinearOptimizationParameters::LAMBDA);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// The sequential optimizer
 | 
					 | 
				
			||||||
  typedef NonlinearOptimizer<Graph, GaussianFactorGraph,
 | 
					 | 
				
			||||||
      GaussianSequentialSolver> OptimizerSequential;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /// The multifrontal optimizer
 | 
					 | 
				
			||||||
  typedef NonlinearOptimizer<Graph, GaussianFactorGraph,
 | 
					 | 
				
			||||||
      GaussianMultifrontalSolver> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // pose2SLAM
 | 
					} // pose2SLAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,9 +61,6 @@ namespace gtsam {
 | 
				
			||||||
			void addHardConstraint(Index i, const Pose3& p);
 | 
								void addHardConstraint(Index i, const Pose3& p);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// Optimizer
 | 
					 | 
				
			||||||
		typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	} // pose3SLAM
 | 
						} // pose3SLAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ using namespace boost;
 | 
				
			||||||
#include <gtsam/geometry/Cal3_S2.h>
 | 
					#include <gtsam/geometry/Cal3_S2.h>
 | 
				
			||||||
#include <gtsam/geometry/PinholeCamera.h>
 | 
					#include <gtsam/geometry/PinholeCamera.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
 | 
				
			||||||
#include <gtsam/linear/VectorValues.h>
 | 
					#include <gtsam/linear/VectorValues.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
					#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
				
			||||||
#include <gtsam/slam/GeneralSFMFactor.h>
 | 
					#include <gtsam/slam/GeneralSFMFactor.h>
 | 
				
			||||||
| 
						 | 
					@ -62,8 +62,6 @@ double getGaussian()
 | 
				
			||||||
    return sqrt(-2.0f * (double)log(S) / S) * V1;
 | 
					    return sqrt(-2.0f * (double)log(S) / S) * V1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const SharedNoiseModel sigma1(noiseModel::Unit::Create(1));
 | 
					const SharedNoiseModel sigma1(noiseModel::Unit::Create(1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -175,11 +173,9 @@ TEST( GeneralSFMFactor, optimize_defaultK ) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create an ordering of the variables
 | 
						// Create an ordering of the variables
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
						NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-5, 10, NonlinearOptimizationParameters::SILENT));
 | 
						    LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
	Optimizer optimizer(graph, values, ordering, params);
 | 
						EXPECT(optimizer->error() < 0.5 * 1e-5 * nMeasurements);
 | 
				
			||||||
	Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
	EXPECT(optimizer2.error() < 0.5 * 1e-5 * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -220,11 +216,9 @@ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) {
 | 
				
			||||||
  const double reproj_error = 1e-5;
 | 
					  const double reproj_error = 1e-5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-5, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -263,12 +257,9 @@ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) {
 | 
				
			||||||
  const double reproj_error = 1e-5 ;
 | 
					  const double reproj_error = 1e-5 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-3, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -323,13 +314,9 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) {
 | 
				
			||||||
  const double reproj_error = 1e-5 ;
 | 
					  const double reproj_error = 1e-5 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-3, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -366,12 +353,9 @@ TEST( GeneralSFMFactor, optimize_varK_BA ) {
 | 
				
			||||||
  const double reproj_error = 1e-5 ;
 | 
					  const double reproj_error = 1e-5 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-2, 1e-2, 0.0, 100, 1e-5, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ using namespace boost;
 | 
				
			||||||
#include <gtsam/geometry/Cal3Bundler.h>
 | 
					#include <gtsam/geometry/Cal3Bundler.h>
 | 
				
			||||||
#include <gtsam/geometry/PinholeCamera.h>
 | 
					#include <gtsam/geometry/PinholeCamera.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
 | 
				
			||||||
#include <gtsam/linear/VectorValues.h>
 | 
					#include <gtsam/linear/VectorValues.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
					#include <gtsam/nonlinear/NonlinearEquality.h>
 | 
				
			||||||
#include <gtsam/slam/GeneralSFMFactor.h>
 | 
					#include <gtsam/slam/GeneralSFMFactor.h>
 | 
				
			||||||
| 
						 | 
					@ -63,8 +63,6 @@ double getGaussian()
 | 
				
			||||||
    return sqrt(-2.0f * (double)log(S) / S) * V1;
 | 
					    return sqrt(-2.0f * (double)log(S) / S) * V1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const SharedNoiseModel sigma1(noiseModel::Unit::Create(1));
 | 
					const SharedNoiseModel sigma1(noiseModel::Unit::Create(1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -177,11 +175,9 @@ TEST( GeneralSFMFactor, optimize_defaultK ) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Create an ordering of the variables
 | 
					  // Create an ordering of the variables
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-5, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * 1e-5 * nMeasurements);
 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * 1e-5 * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -222,11 +218,9 @@ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) {
 | 
				
			||||||
  const double reproj_error = 1e-5;
 | 
					  const double reproj_error = 1e-5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-5, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -265,12 +259,9 @@ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) {
 | 
				
			||||||
  const double reproj_error = 1e-5 ;
 | 
					  const double reproj_error = 1e-5 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-3, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -321,12 +312,9 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) {
 | 
				
			||||||
  const double reproj_error = 1e-5 ;
 | 
					  const double reproj_error = 1e-5 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-3, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -363,12 +351,9 @@ TEST( GeneralSFMFactor, optimize_varK_BA ) {
 | 
				
			||||||
  const double reproj_error = 1e-5 ;
 | 
					  const double reproj_error = 1e-5 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
					  shared_ptr<Ordering> ordering = getOrdering(X,L);
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params (
 | 
					  NonlinearOptimizer::auto_ptr optimizer =
 | 
				
			||||||
      new NonlinearOptimizationParameters(1e-5, 1e-5, 0.0, 100, 1e-5, 10, NonlinearOptimizationParameters::SILENT));
 | 
					      LevenbergMarquardtOptimizer(graph, values, LevenbergMarquardtParams(), ordering).optimize();
 | 
				
			||||||
  Optimizer optimizer(graph, values, ordering, params);
 | 
					  EXPECT(optimizer->error() < 0.5 * reproj_error * nMeasurements);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Optimizer optimizer2 = optimizer.levenbergMarquardt();
 | 
					 | 
				
			||||||
  EXPECT(optimizer2.error() < 0.5 * reproj_error * nMeasurements);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -160,17 +160,16 @@ TEST(Pose2Graph, optimize) {
 | 
				
			||||||
  // Choose an ordering and optimize
 | 
					  // Choose an ordering and optimize
 | 
				
			||||||
  shared_ptr<Ordering> ordering(new Ordering);
 | 
					  shared_ptr<Ordering> ordering(new Ordering);
 | 
				
			||||||
  *ordering += kx0, kx1;
 | 
					  *ordering += kx0, kx1;
 | 
				
			||||||
  typedef NonlinearOptimizer<pose2SLAM::Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params = NonlinearOptimizationParameters::newDecreaseThresholds(1e-15, 1e-15);
 | 
					  LevenbergMarquardtParams params;
 | 
				
			||||||
  Optimizer optimizer0(fg, initial, ordering, params);
 | 
					  params.relativeErrorTol = 1e-15;
 | 
				
			||||||
  Optimizer optimizer = optimizer0.levenbergMarquardt();
 | 
					  NonlinearOptimizer::auto_ptr optimizer = LevenbergMarquardtOptimizer(fg, initial, params, ordering).optimize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check with expected config
 | 
					  // Check with expected config
 | 
				
			||||||
  Values expected;
 | 
					  Values expected;
 | 
				
			||||||
  expected.insert(pose2SLAM::PoseKey(0), Pose2(0,0,0));
 | 
					  expected.insert(pose2SLAM::PoseKey(0), Pose2(0,0,0));
 | 
				
			||||||
  expected.insert(pose2SLAM::PoseKey(1), Pose2(1,2,M_PI_2));
 | 
					  expected.insert(pose2SLAM::PoseKey(1), Pose2(1,2,M_PI_2));
 | 
				
			||||||
  CHECK(assert_equal(expected, *optimizer.values()));
 | 
					  CHECK(assert_equal(expected, *optimizer->values()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -200,11 +199,11 @@ TEST(Pose2Graph, optimizeThreePoses) {
 | 
				
			||||||
  *ordering += kx0,kx1,kx2;
 | 
					  *ordering += kx0,kx1,kx2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // optimize
 | 
					  // optimize
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params = NonlinearOptimizationParameters::newDecreaseThresholds(1e-15, 1e-15);
 | 
					  LevenbergMarquardtParams params;
 | 
				
			||||||
  pose2SLAM::Optimizer optimizer0(fg, initial, ordering, params);
 | 
					  params.relativeErrorTol = 1e-15;
 | 
				
			||||||
  pose2SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt();
 | 
					  NonlinearOptimizer::auto_ptr optimizer = LevenbergMarquardtOptimizer(fg, initial, params, ordering).optimize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Values actual = *optimizer.values();
 | 
					  Values actual = *optimizer->values();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check with ground truth
 | 
					  // Check with ground truth
 | 
				
			||||||
  CHECK(assert_equal((const Values&)hexagon, actual));
 | 
					  CHECK(assert_equal((const Values&)hexagon, actual));
 | 
				
			||||||
| 
						 | 
					@ -243,11 +242,11 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) {
 | 
				
			||||||
  *ordering += kx0,kx1,kx2,kx3,kx4,kx5;
 | 
					  *ordering += kx0,kx1,kx2,kx3,kx4,kx5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // optimize
 | 
					  // optimize
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params = NonlinearOptimizationParameters::newDecreaseThresholds(1e-15, 1e-15);
 | 
					  LevenbergMarquardtParams params;
 | 
				
			||||||
  pose2SLAM::Optimizer optimizer0(fg, initial, ordering, params);
 | 
					  params.relativeErrorTol = 1e-15;
 | 
				
			||||||
  pose2SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt();
 | 
					  NonlinearOptimizer::auto_ptr optimizer = LevenbergMarquardtOptimizer(fg, initial, params, ordering).optimize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Values actual = *optimizer.values();
 | 
					  Values actual = *optimizer->values();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check with ground truth
 | 
					  // Check with ground truth
 | 
				
			||||||
  CHECK(assert_equal((const Values&)hexagon, actual));
 | 
					  CHECK(assert_equal((const Values&)hexagon, actual));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@ using namespace boost::assign;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/slam/pose3SLAM.h>
 | 
					#include <gtsam/slam/pose3SLAM.h>
 | 
				
			||||||
#include <gtsam/slam/PartialPriorFactor.h>
 | 
					#include <gtsam/slam/PartialPriorFactor.h>
 | 
				
			||||||
 | 
					#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace gtsam;
 | 
					using namespace gtsam;
 | 
				
			||||||
| 
						 | 
					@ -76,11 +77,9 @@ TEST(Pose3Graph, optimizeCircle) {
 | 
				
			||||||
  // Choose an ordering and optimize
 | 
					  // Choose an ordering and optimize
 | 
				
			||||||
  shared_ptr<Ordering> ordering(new Ordering);
 | 
					  shared_ptr<Ordering> ordering(new Ordering);
 | 
				
			||||||
  *ordering += kx0,kx1,kx2,kx3,kx4,kx5;
 | 
					  *ordering += kx0,kx1,kx2,kx3,kx4,kx5;
 | 
				
			||||||
  NonlinearOptimizationParameters::shared_ptr params = NonlinearOptimizationParameters::newDecreaseThresholds(1e-15, 1e-15);
 | 
					 | 
				
			||||||
  pose3SLAM::Optimizer optimizer0(fg, initial, ordering, params);
 | 
					 | 
				
			||||||
  pose3SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Values actual = *optimizer.values();
 | 
					  Values actual = *LevenbergMarquardtOptimizer(
 | 
				
			||||||
 | 
					      fg, initial, LevenbergMarquardtOptimizer::SharedLMParams(), ordering).optimize()->values();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check with ground truth
 | 
					  // Check with ground truth
 | 
				
			||||||
  CHECK(assert_equal(hexagon, actual,1e-4));
 | 
					  CHECK(assert_equal(hexagon, actual,1e-4));
 | 
				
			||||||
| 
						 | 
					@ -115,7 +114,7 @@ TEST(Pose3Graph, partial_prior_height) {
 | 
				
			||||||
	// linearization
 | 
						// linearization
 | 
				
			||||||
	EXPECT_DOUBLES_EQUAL(2.0, height.error(values), tol);
 | 
						EXPECT_DOUBLES_EQUAL(2.0, height.error(values), tol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Values actual = *pose3SLAM::Optimizer::optimizeLM(graph, values);
 | 
						Values actual = *LevenbergMarquardtOptimizer(graph, values).optimize()->values();
 | 
				
			||||||
	EXPECT(assert_equal(expected, actual.at<Pose3>(key), tol));
 | 
						EXPECT(assert_equal(expected, actual.at<Pose3>(key), tol));
 | 
				
			||||||
	EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol);
 | 
						EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -167,7 +166,7 @@ TEST(Pose3Graph, partial_prior_xy) {
 | 
				
			||||||
	Values values;
 | 
						Values values;
 | 
				
			||||||
	values.insert(key, init);
 | 
						values.insert(key, init);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Values actual = *pose3SLAM::Optimizer::optimizeLM(graph, values);
 | 
						Values actual = *LevenbergMarquardtOptimizer(graph, values).optimize()->values();
 | 
				
			||||||
	EXPECT(assert_equal(expected, actual.at<Pose3>(key), tol));
 | 
						EXPECT(assert_equal(expected, actual.at<Pose3>(key), tol));
 | 
				
			||||||
	EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol);
 | 
						EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@
 | 
				
			||||||
#include <gtsam/geometry/StereoCamera.h>
 | 
					#include <gtsam/geometry/StereoCamera.h>
 | 
				
			||||||
#include <gtsam/geometry/Pose3.h>
 | 
					#include <gtsam/geometry/Pose3.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					#include <gtsam/nonlinear/GaussNewtonOptimizer.h>
 | 
				
			||||||
#include <gtsam/slam/StereoFactor.h>
 | 
					#include <gtsam/slam/StereoFactor.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/slam/visualSLAM.h>
 | 
					#include <gtsam/slam/visualSLAM.h>
 | 
				
			||||||
| 
						 | 
					@ -50,45 +50,34 @@ TEST( StereoFactor, singlePoint)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//Cal3_S2 K(625, 625, 0, 320, 240, 0.5);
 | 
						//Cal3_S2 K(625, 625, 0, 320, 240, 0.5);
 | 
				
			||||||
	boost::shared_ptr<Cal3_S2Stereo> K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5));
 | 
						boost::shared_ptr<Cal3_S2Stereo> K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5));
 | 
				
			||||||
	boost::shared_ptr<visualSLAM::Graph> graph(new visualSLAM::Graph());
 | 
						NonlinearFactorGraph graph;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	graph->add(visualSLAM::PoseConstraint(PoseKey(1),camera1));
 | 
						graph.add(visualSLAM::PoseConstraint(PoseKey(1),camera1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	StereoPoint2 z14(320,320.0-50, 240);
 | 
						StereoPoint2 z14(320,320.0-50, 240);
 | 
				
			||||||
  // arguments: measurement, sigma, cam#, measurement #, K, baseline (m)
 | 
					  // arguments: measurement, sigma, cam#, measurement #, K, baseline (m)
 | 
				
			||||||
	graph->add(visualSLAM::StereoFactor(z14,sigma, PoseKey(1), PointKey(1), K));
 | 
						graph.add(visualSLAM::StereoFactor(z14,sigma, PoseKey(1), PointKey(1), K));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create a configuration corresponding to the ground truth
 | 
						// Create a configuration corresponding to the ground truth
 | 
				
			||||||
	boost::shared_ptr<Values> values(new Values());
 | 
						Values values(new Values());
 | 
				
			||||||
	values->insert(PoseKey(1), camera1); // add camera at z=6.25m looking towards origin
 | 
						values.insert(PoseKey(1), camera1); // add camera at z=6.25m looking towards origin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Point3 l1(0, 0, 0);
 | 
						Point3 l1(0, 0, 0);
 | 
				
			||||||
	values->insert(PointKey(1), l1);   // add point at origin;
 | 
						values.insert(PointKey(1), l1);   // add point at origin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Ordering::shared_ptr ordering = graph->orderingCOLAMD(*values);
 | 
						NonlinearOptimizer::auto_ptr optimizer(new GaussNewtonOptimizer(graph, values)));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	typedef gtsam::NonlinearOptimizer<visualSLAM::Graph, gtsam::GaussianFactorGraph, gtsam::GaussianMultifrontalSolver> Optimizer;   // optimization engine for this domain
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	double absoluteThreshold = 1e-9;
 | 
					 | 
				
			||||||
	double relativeThreshold = 1e-5;
 | 
					 | 
				
			||||||
	int maxIterations = 100;
 | 
					 | 
				
			||||||
	NonlinearOptimizationParameters::verbosityLevel verbose = NonlinearOptimizationParameters::SILENT;
 | 
					 | 
				
			||||||
	NonlinearOptimizationParameters parameters(absoluteThreshold, relativeThreshold, 0,
 | 
					 | 
				
			||||||
			maxIterations, 1.0, 10, verbose, NonlinearOptimizationParameters::BOUNDED);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	Optimizer optimizer(graph, values, ordering, make_shared<NonlinearOptimizationParameters>(parameters));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// We expect the initial to be zero because config is the ground truth
 | 
						// We expect the initial to be zero because config is the ground truth
 | 
				
			||||||
	DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
						DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Iterate once, and the config should not have changed
 | 
						// Iterate once, and the config should not have changed
 | 
				
			||||||
	Optimizer afterOneIteration = optimizer.iterate();
 | 
						NonlinearOptimizer::auto_ptr afterOneIteration = optimizer->iterate();
 | 
				
			||||||
	DOUBLES_EQUAL(0.0, afterOneIteration.error(), 1e-9);
 | 
						DOUBLES_EQUAL(0.0, afterOneIteration->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Complete solution
 | 
						// Complete solution
 | 
				
			||||||
	Optimizer final = optimizer.gaussNewton();
 | 
						NonlinearOptimizer::auto_ptr final = optimizer->optimize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DOUBLES_EQUAL(0.0, final.error(), 1e-6);
 | 
						DOUBLES_EQUAL(0.0, final->error(), 1e-6);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@
 | 
				
			||||||
using namespace boost;
 | 
					using namespace boost;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					#include <gtsam/nonlinear/GaussNewtonOptimizer.h>
 | 
				
			||||||
#include <gtsam/slam/visualSLAM.h>
 | 
					#include <gtsam/slam/visualSLAM.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
| 
						 | 
					@ -102,16 +102,16 @@ TEST( Graph, optimizeLM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Create an optimizer and check its error
 | 
					  // Create an optimizer and check its error
 | 
				
			||||||
  // We expect the initial to be zero because config is the ground truth
 | 
					  // We expect the initial to be zero because config is the ground truth
 | 
				
			||||||
  visualSLAM::Optimizer optimizer(graph, initialEstimate, ordering);
 | 
					  NonlinearOptimizer::auto_ptr optimizer(new GaussNewtonOptimizer(graph, initialEstimate, GaussNewtonParams(), ordering));
 | 
				
			||||||
  DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
					  DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Iterate once, and the config should not have changed because we started
 | 
					  // Iterate once, and the config should not have changed because we started
 | 
				
			||||||
  // with the ground truth
 | 
					  // with the ground truth
 | 
				
			||||||
  visualSLAM::Optimizer afterOneIteration = optimizer.iterate();
 | 
					  NonlinearOptimizer::auto_ptr afterOneIteration = optimizer->iterate();
 | 
				
			||||||
  DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
					  DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // check if correct
 | 
					  // check if correct
 | 
				
			||||||
  CHECK(assert_equal(*initialEstimate,*(afterOneIteration.values())));
 | 
					  CHECK(assert_equal(*initialEstimate,*(afterOneIteration->values())));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,16 +139,16 @@ TEST( Graph, optimizeLM2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Create an optimizer and check its error
 | 
					  // Create an optimizer and check its error
 | 
				
			||||||
  // We expect the initial to be zero because config is the ground truth
 | 
					  // We expect the initial to be zero because config is the ground truth
 | 
				
			||||||
  visualSLAM::Optimizer optimizer(graph, initialEstimate, ordering);
 | 
					  NonlinearOptimizer::auto_ptr optimizer(new GaussNewtonOptimizer(graph, initialEstimate, GaussNewtonParams(), ordering));
 | 
				
			||||||
  DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
					  DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Iterate once, and the config should not have changed because we started
 | 
					  // Iterate once, and the config should not have changed because we started
 | 
				
			||||||
  // with the ground truth
 | 
					  // with the ground truth
 | 
				
			||||||
  visualSLAM::Optimizer afterOneIteration = optimizer.iterate();
 | 
					  NonlinearOptimizer::auto_ptr afterOneIteration = optimizer->iterate();
 | 
				
			||||||
  DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
					  DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // check if correct
 | 
					  // check if correct
 | 
				
			||||||
  CHECK(assert_equal(*initialEstimate,*(afterOneIteration.values())));
 | 
					  CHECK(assert_equal(*initialEstimate,*(afterOneIteration->values())));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,20 +170,18 @@ TEST( Graph, CHECK_ORDERING)
 | 
				
			||||||
  initialEstimate->insert(PointKey(3), landmark3);
 | 
					  initialEstimate->insert(PointKey(3), landmark3);
 | 
				
			||||||
  initialEstimate->insert(PointKey(4), landmark4);
 | 
					  initialEstimate->insert(PointKey(4), landmark4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Ordering::shared_ptr ordering = graph->orderingCOLAMD(*initialEstimate);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Create an optimizer and check its error
 | 
					  // Create an optimizer and check its error
 | 
				
			||||||
  // We expect the initial to be zero because config is the ground truth
 | 
					  // We expect the initial to be zero because config is the ground truth
 | 
				
			||||||
  visualSLAM::Optimizer optimizer(graph, initialEstimate, ordering);
 | 
					  NonlinearOptimizer::auto_ptr optimizer(new GaussNewtonOptimizer(graph, initialEstimate));
 | 
				
			||||||
  DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
					  DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Iterate once, and the config should not have changed because we started
 | 
					  // Iterate once, and the config should not have changed because we started
 | 
				
			||||||
  // with the ground truth
 | 
					  // with the ground truth
 | 
				
			||||||
  visualSLAM::Optimizer afterOneIteration = optimizer.iterate();
 | 
					  NonlinearOptimizer::auto_ptr afterOneIteration = optimizer->iterate();
 | 
				
			||||||
  DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
 | 
					  DOUBLES_EQUAL(0.0, optimizer->error(), 1e-9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // check if correct
 | 
					  // check if correct
 | 
				
			||||||
  CHECK(assert_equal(*initialEstimate,*(afterOneIteration.values())));
 | 
					  CHECK(assert_equal(*initialEstimate,*(afterOneIteration->values())));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,6 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/slam/visualSLAM.h>
 | 
					#include <gtsam/slam/visualSLAM.h>
 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearOptimizer.h>
 | 
					 | 
				
			||||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace gtsam {
 | 
					namespace gtsam {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,7 +145,4 @@ namespace visualSLAM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }; // Graph
 | 
					  }; // Graph
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// typedef for Optimizer. The current default will use the multi-frontal solver
 | 
					 | 
				
			||||||
  typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // namespaces
 | 
					} // namespaces
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,11 +31,6 @@ SharedDiagonal soft_model2 = noiseModel::Unit::Create(2);
 | 
				
			||||||
SharedDiagonal soft_model2_alt = noiseModel::Isotropic::Sigma(2, 0.1);
 | 
					SharedDiagonal soft_model2_alt = noiseModel::Isotropic::Sigma(2, 0.1);
 | 
				
			||||||
SharedDiagonal hard_model1 = noiseModel::Constrained::All(1);
 | 
					SharedDiagonal hard_model1 = noiseModel::Constrained::All(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef NonlinearFactorGraph Graph;
 | 
					 | 
				
			||||||
typedef boost::shared_ptr<Graph> shared_graph;
 | 
					 | 
				
			||||||
typedef boost::shared_ptr<Values> shared_values;
 | 
					 | 
				
			||||||
typedef NonlinearOptimizer<Graph> Optimizer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// some simple inequality constraints
 | 
					// some simple inequality constraints
 | 
				
			||||||
Symbol key(simulated2D::PoseKey(1));
 | 
					Symbol key(simulated2D::PoseKey(1));
 | 
				
			||||||
double mu = 10.0;
 | 
					double mu = 10.0;
 | 
				
			||||||
| 
						 | 
					@ -150,19 +145,19 @@ TEST( testBoundingConstraint, unary_simple_optimization1) {
 | 
				
			||||||
	Point2 goal_pt(1.0, 2.0);
 | 
						Point2 goal_pt(1.0, 2.0);
 | 
				
			||||||
	Point2 start_pt(0.0, 1.0);
 | 
						Point2 start_pt(0.0, 1.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	shared_graph graph(new Graph());
 | 
						NonlinearFactorGraph graph;
 | 
				
			||||||
	Symbol x1('x',1);
 | 
						Symbol x1('x',1);
 | 
				
			||||||
	graph->add(iq2D::PoseXInequality(x1, 1.0, true));
 | 
						graph.add(iq2D::PoseXInequality(x1, 1.0, true));
 | 
				
			||||||
	graph->add(iq2D::PoseYInequality(x1, 2.0, true));
 | 
						graph.add(iq2D::PoseYInequality(x1, 2.0, true));
 | 
				
			||||||
	graph->add(simulated2D::Prior(start_pt, soft_model2, x1));
 | 
						graph.add(simulated2D::Prior(start_pt, soft_model2, x1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	shared_values initValues(new Values());
 | 
						Values initValues;
 | 
				
			||||||
	initValues->insert(x1, start_pt);
 | 
						initValues.insert(x1, start_pt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Optimizer::shared_values actual = Optimizer::optimizeLM(graph, initValues);
 | 
						Values actual = *LevenbergMarquardtOptimizer(graph, initValues).optimize()->values();
 | 
				
			||||||
	Values expected;
 | 
						Values expected;
 | 
				
			||||||
	expected.insert(x1, goal_pt);
 | 
						expected.insert(x1, goal_pt);
 | 
				
			||||||
	CHECK(assert_equal(expected, *actual, tol));
 | 
						CHECK(assert_equal(expected, actual, tol));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					@ -172,19 +167,19 @@ TEST( testBoundingConstraint, unary_simple_optimization2) {
 | 
				
			||||||
	Point2 goal_pt(1.0, 2.0);
 | 
						Point2 goal_pt(1.0, 2.0);
 | 
				
			||||||
	Point2 start_pt(2.0, 3.0);
 | 
						Point2 start_pt(2.0, 3.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	shared_graph graph(new Graph());
 | 
						NonlinearFactorGraph graph;
 | 
				
			||||||
	Symbol x1('x',1);
 | 
						Symbol x1('x',1);
 | 
				
			||||||
	graph->add(iq2D::PoseXInequality(x1, 1.0, false));
 | 
						graph.add(iq2D::PoseXInequality(x1, 1.0, false));
 | 
				
			||||||
	graph->add(iq2D::PoseYInequality(x1, 2.0, false));
 | 
						graph.add(iq2D::PoseYInequality(x1, 2.0, false));
 | 
				
			||||||
	graph->add(simulated2D::Prior(start_pt, soft_model2, x1));
 | 
						graph.add(simulated2D::Prior(start_pt, soft_model2, x1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	shared_values initValues(new Values());
 | 
						Values initValues;
 | 
				
			||||||
	initValues->insert(x1, start_pt);
 | 
						initValues.insert(x1, start_pt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Optimizer::shared_values actual = Optimizer::optimizeLM(graph, initValues);
 | 
						Values actual = *LevenbergMarquardtOptimizer(graph, initValues).optimize()->values();
 | 
				
			||||||
	Values expected;
 | 
						Values expected;
 | 
				
			||||||
	expected.insert(x1, goal_pt);
 | 
						expected.insert(x1, goal_pt);
 | 
				
			||||||
	CHECK(assert_equal(expected, *actual, tol));
 | 
						CHECK(assert_equal(expected, actual, tol));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue