fixed namespaces
parent
a4c769fddc
commit
91f020fee1
|
@ -30,18 +30,17 @@ using namespace boost;
|
||||||
#include "SubgraphPreconditioner-inl.h"
|
#include "SubgraphPreconditioner-inl.h"
|
||||||
|
|
||||||
using namespace gtsam;
|
using namespace gtsam;
|
||||||
using namespace example;
|
|
||||||
|
|
||||||
const double tol = 1e-5;
|
const double tol = 1e-5;
|
||||||
|
|
||||||
typedef NonlinearOptimizer<Graph,Config> Optimizer;
|
typedef NonlinearOptimizer<example::Graph,example::Config> Optimizer;
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST( NonlinearOptimizer, delta )
|
TEST( NonlinearOptimizer, delta )
|
||||||
{
|
{
|
||||||
shared_ptr<Graph> fg(new Graph(
|
shared_ptr<example::Graph> fg(new example::Graph(
|
||||||
createNonlinearFactorGraph()));
|
example::createNonlinearFactorGraph()));
|
||||||
Optimizer::shared_config initial = sharedNoisyConfig();
|
Optimizer::shared_config initial = example::sharedNoisyConfig();
|
||||||
|
|
||||||
// Expected configuration is the difference between the noisy config
|
// Expected configuration is the difference between the noisy config
|
||||||
// and the ground-truth config. One step only because it's linear !
|
// and the ground-truth config. One step only because it's linear !
|
||||||
|
@ -102,12 +101,12 @@ TEST( NonlinearOptimizer, delta )
|
||||||
TEST( NonlinearOptimizer, iterateLM )
|
TEST( NonlinearOptimizer, iterateLM )
|
||||||
{
|
{
|
||||||
// really non-linear factor graph
|
// really non-linear factor graph
|
||||||
shared_ptr<Graph> fg(new Graph(
|
shared_ptr<example::Graph> fg(new example::Graph(
|
||||||
createReallyNonlinearFactorGraph()));
|
example::createReallyNonlinearFactorGraph()));
|
||||||
|
|
||||||
// config far from minimum
|
// config far from minimum
|
||||||
Point2 x0(3,0);
|
Point2 x0(3,0);
|
||||||
boost::shared_ptr<Config> config(new Config);
|
boost::shared_ptr<example::Config> config(new example::Config);
|
||||||
config->insert(simulated2D::PoseKey(1), x0);
|
config->insert(simulated2D::PoseKey(1), x0);
|
||||||
|
|
||||||
// ordering
|
// ordering
|
||||||
|
@ -139,18 +138,18 @@ TEST( NonlinearOptimizer, iterateLM )
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST( NonlinearOptimizer, optimize )
|
TEST( NonlinearOptimizer, optimize )
|
||||||
{
|
{
|
||||||
shared_ptr<Graph> fg(new Graph(
|
shared_ptr<example::Graph> fg(new example::Graph(
|
||||||
createReallyNonlinearFactorGraph()));
|
example::createReallyNonlinearFactorGraph()));
|
||||||
|
|
||||||
// test error at minimum
|
// test error at minimum
|
||||||
Point2 xstar(0,0);
|
Point2 xstar(0,0);
|
||||||
Config cstar;
|
example::Config cstar;
|
||||||
cstar.insert(simulated2D::PoseKey(1), xstar);
|
cstar.insert(simulated2D::PoseKey(1), xstar);
|
||||||
DOUBLES_EQUAL(0.0,fg->error(cstar),0.0);
|
DOUBLES_EQUAL(0.0,fg->error(cstar),0.0);
|
||||||
|
|
||||||
// test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 =
|
// test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 =
|
||||||
Point2 x0(3,3);
|
Point2 x0(3,3);
|
||||||
boost::shared_ptr<Config> c0(new Config);
|
boost::shared_ptr<example::Config> c0(new example::Config);
|
||||||
c0->insert(simulated2D::PoseKey(1), x0);
|
c0->insert(simulated2D::PoseKey(1), x0);
|
||||||
DOUBLES_EQUAL(199.0,fg->error(*c0),1e-3);
|
DOUBLES_EQUAL(199.0,fg->error(*c0),1e-3);
|
||||||
|
|
||||||
|
@ -205,22 +204,23 @@ TEST( NonlinearOptimizer, Factorization )
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST( NonlinearOptimizer, SubgraphPCG )
|
TEST( NonlinearOptimizer, SubgraphPCG )
|
||||||
{
|
{
|
||||||
typedef NonlinearOptimizer<Pose2Graph, Pose2Config, SubgraphPreconditioner,
|
using namespace pose2SLAM;
|
||||||
SubgraphPCG<Pose2Graph, Pose2Config> > Optimizer;
|
typedef SubgraphPCG<Graph, Config> Solver;
|
||||||
|
typedef NonlinearOptimizer<Graph, Config, SubgraphPreconditioner, Solver> Optimizer;
|
||||||
|
|
||||||
// Create a graph
|
// Create a graph
|
||||||
boost::shared_ptr<Pose2Graph> graph(new Pose2Graph);
|
boost::shared_ptr<Graph> graph(new Graph);
|
||||||
graph->addPrior(1, Pose2(0., 0., 0.), Isotropic::Sigma(3, 1e-10));
|
graph->addPrior(1, Pose2(0., 0., 0.), Isotropic::Sigma(3, 1e-10));
|
||||||
graph->addConstraint(1, 2, Pose2(1., 0., 0.), Isotropic::Sigma(3, 1));
|
graph->addConstraint(1, 2, Pose2(1., 0., 0.), Isotropic::Sigma(3, 1));
|
||||||
|
|
||||||
// Create an initial config
|
// Create an initial config
|
||||||
boost::shared_ptr<Pose2Config> config(new Pose2Config);
|
boost::shared_ptr<Config> config(new Config);
|
||||||
config->insert(1, Pose2(0., 0., 0.));
|
config->insert(1, Pose2(0., 0., 0.));
|
||||||
config->insert(2, Pose2(1.5, 0., 0.));
|
config->insert(2, Pose2(1.5, 0., 0.));
|
||||||
|
|
||||||
// Create solver and optimizer
|
// Create solver and optimizer
|
||||||
Optimizer::shared_solver solver
|
Optimizer::shared_solver solver
|
||||||
(new SubgraphPCG<Pose2Graph, Pose2Config> (*graph, *config));
|
(new SubgraphPCG<Graph, Config> (*graph, *config));
|
||||||
Optimizer optimizer(graph, config, solver);
|
Optimizer optimizer(graph, config, solver);
|
||||||
|
|
||||||
// Optimize !!!!
|
// Optimize !!!!
|
||||||
|
@ -230,7 +230,7 @@ TEST( NonlinearOptimizer, SubgraphPCG )
|
||||||
absoluteThreshold, Optimizer::SILENT);
|
absoluteThreshold, Optimizer::SILENT);
|
||||||
|
|
||||||
// Check solution
|
// Check solution
|
||||||
Pose2Config expected;
|
Config expected;
|
||||||
expected.insert(1, Pose2(0., 0., 0.));
|
expected.insert(1, Pose2(0., 0., 0.));
|
||||||
expected.insert(2, Pose2(1., 0., 0.));
|
expected.insert(2, Pose2(1., 0., 0.));
|
||||||
CHECK(assert_equal(expected, *optimized.config(), 1e-5));
|
CHECK(assert_equal(expected, *optimized.config(), 1e-5));
|
||||||
|
|
Loading…
Reference in New Issue