g2o
Loading...
Searching...
No Matches
Functions
static_target.cpp File Reference
#include <g2o/core/block_solver.h>
#include <g2o/core/optimization_algorithm_gauss_newton.h>
#include <g2o/core/solver.h>
#include <g2o/core/sparse_optimizer.h>
#include <g2o/solvers/eigen/linear_solver_eigen.h>
#include <g2o/stuff/sampler.h>
#include <iostream>
#include "targetTypes3D.hpp"
Include dependency graph for static_target.cpp:

Go to the source code of this file.

Functions

int main ()
 

Function Documentation

◆ main()

int main ( )

Definition at line 46 of file static_target.cpp.

46 {
47 // Set up the optimiser
48 SparseOptimizer optimizer;
49 optimizer.setVerbose(false);
50
51 // Create the block solver - the dimensions are specified because
52 // 3D observations marginalise to a 3D estimate
53 typedef BlockSolver<BlockSolverTraits<3, 3>> BlockSolver_3_3;
55 new OptimizationAlgorithmGaussNewton(std::make_unique<BlockSolver_3_3>(
56 std::make_unique<
58
59 optimizer.setAlgorithm(solver);
60
61 // Sample the actual location of the target
62 Vector3d truePoint(sampleUniform(-500, 500), sampleUniform(-500, 500),
63 sampleUniform(-500, 500));
64
65 // Construct vertex which corresponds to the actual point of the target
66 VertexPosition3D* position = new VertexPosition3D();
67 position->setId(0);
68 optimizer.addVertex(position);
69
70 // Now generate some noise corrupted measurements; for simplicity
71 // these are uniformly distributed about the true target. These are
72 // modelled as a unary edge because they do not like to, say,
73 // another node in the map.
74 int numMeasurements = 10;
75 double noiseLimit = sqrt(12.);
76 double noiseSigma = noiseLimit * noiseLimit / 12.0;
77
78 for (int i = 0; i < numMeasurements; i++) {
79 Vector3d measurement =
80 truePoint + Vector3d(sampleUniform(-0.5, 0.5) * noiseLimit,
81 sampleUniform(-0.5, 0.5) * noiseLimit,
82 sampleUniform(-0.5, 0.5) * noiseLimit);
84 goe->setVertex(0, position);
85 goe->setMeasurement(measurement);
86 goe->setInformation(Matrix3d::Identity() / noiseSigma);
87 optimizer.addEdge(goe);
88 }
89
90 // Configure and set things going
91 optimizer.initializeOptimization();
92 optimizer.setVerbose(true);
93 optimizer.optimize(5);
94
95 cout << "truePoint=\n" << truePoint << endl;
96 cerr << "computed estimate=\n"
97 << dynamic_cast<VertexPosition3D*>(optimizer.vertices().find(0)->second)
98 ->estimate()
99 << endl;
100
101 // position->setMarginalized(true);
102
104 bool state = optimizer.computeMarginals(spinv, position);
105 if (state) {
106 cout << "covariance\n" << spinv << endl;
107 cout << spinv.block(0, 0) << endl;
108 }
109
110 return 0;
111}
virtual void setMeasurement(const Measurement &m)
Definition base_edge.h:122
void setInformation(const InformationType &information)
Definition base_edge.h:111
Implementation of a solver operating on the blocks of the Hessian.
void setVertex(size_t i, Vertex *v)
const VertexIDMap & vertices() const
linear solver which uses the sparse Cholesky solver from Eigen
Implementation of the Gauss Newton Algorithm.
Sparse matrix which uses blocks.
SparseMatrixBlock * block(int r, int c, bool alloc=false)
int optimize(int iterations, bool online=false)
void setVerbose(bool verbose)
virtual bool initializeOptimization(HyperGraph::EdgeSet &eset)
void setAlgorithm(OptimizationAlgorithm *algorithm)
bool computeMarginals(SparseBlockMatrix< MatrixX > &spinv, const std::vector< std::pair< int, int > > &blockIndices)
Jet< T, N > sqrt(const Jet< T, N > &f)
Definition jet.h:444
double sampleUniform(double min, double max, std::mt19937 *generator)
Definition sampler.cpp:35
virtual bool addEdge(HyperGraph::Edge *e)
virtual bool addVertex(HyperGraph::Vertex *v, Data *userData)

References g2o::OptimizableGraph::addEdge(), g2o::OptimizableGraph::addVertex(), g2o::SparseBlockMatrix< MatrixType >::block(), g2o::SparseOptimizer::computeMarginals(), g2o::SparseOptimizer::initializeOptimization(), g2o::SparseOptimizer::optimize(), g2o::sampleUniform(), g2o::SparseOptimizer::setAlgorithm(), g2o::OptimizableGraph::Vertex::setId(), g2o::BaseEdge< D, E >::setInformation(), g2o::BaseEdge< D, E >::setMeasurement(), g2o::SparseOptimizer::setVerbose(), g2o::HyperGraph::Edge::setVertex(), and g2o::HyperGraph::vertices().