10#include <unsupported/Eigen/Polynomials>
35 virtual bool read(std::istream& is) {
39 if (is.good() ==
false) {
52 virtual bool write(std::ostream& os)
const {
62 Eigen::VectorXd::ConstMapType v(update,
_dimension);
73 if (oldDimension == Eigen::Dynamic) {
79 _estimate.conservativeResize(newDimension);
82 if (oldDimension < newDimension)
83 _estimate.tail(newDimension - oldDimension).setZero();
109 virtual bool read(std::istream& is) {
116 virtual bool write(std::ostream& os)
const {
133int main(
int argc,
const char* argv[]) {
135 int polynomialDimension = 4;
137 polynomialDimension = atoi(argv[1]);
141 Eigen::VectorXd p(polynomialDimension);
142 for (
int i = 0; i < polynomialDimension; ++i) {
146 std::cout <<
"Ground truth vector=" << p.transpose() << std::endl;
157 Eigen::VectorXd x(obs);
158 Eigen::VectorXd z(obs);
160 for (
int i = 0; i < obs; ++i) {
166 std::unique_ptr<g2o::BlockSolverX::LinearSolverType> linearSolver =
171 std::unique_ptr<g2o::BlockSolverX> blockSolver =
172 std::make_unique<g2o::BlockSolverX>(std::move(linearSolver));
179 std::unique_ptr<g2o::SparseOptimizer> optimizer =
180 std::make_unique<g2o::SparseOptimizer>();
181 optimizer->setVerbose(
true);
182 optimizer->setAlgorithm(optimisationAlgorithm);
187 optimizer->addVertex(pv);
191 PolynomialSingleValueEdge::InformationType::Zero();
192 omega(0, 0) = 1 / (sigmaZ * sigmaZ);
195 for (
int i = 0; i < obs; ++i) {
199 optimizer->addEdge(pe);
207 for (
int testDimension = 1; testDimension <= polynomialDimension;
210 optimizer->initializeOptimization();
211 optimizer->optimize(10);
212 std::cout <<
"Computed parameters = " << pv->
estimate().transpose()
215 for (
int testDimension = polynomialDimension - 1; testDimension >= 1;
218 optimizer->initializeOptimization();
219 optimizer->optimize(10);
220 std::cout <<
"Computed parameters = " << pv->
estimate().transpose()
virtual void setToOriginImpl()
sets the node to the origin (used in the multilevel stuff)
virtual void oplusImpl(const double *update)
virtual bool read(std::istream &is)
read the vertex from a stream, i.e., the internal state of the vertex
virtual bool setDimensionImpl(int newDimension)
PolynomialCoefficientVertex()
virtual bool write(std::ostream &os) const
write the vertex to a stream
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
PolynomialSingleValueEdge(double x, double z, const PolynomialSingleValueEdge::InformationType &omega)
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
virtual bool write(std::ostream &os) const
write the vertex to a stream
virtual bool read(std::istream &is)
read the vertex from a stream, i.e., the internal state of the vertex
virtual void computeError()
virtual bool setDimension(int newDimension)
bool writeInformationMatrix(std::ostream &os) const
write the upper trinagular part of the information matrix into the stream
bool readInformationMatrix(std::istream &is)
virtual void setMeasurement(const Measurement &m)
void setInformation(const InformationType &information)
internal::BaseEdgeTraits< D >::InformationType InformationType
Measurement _measurement
the measurement of the edge
const EstimateType & estimate() const
return the current estimate of the vertex
void setVertex(size_t i, Vertex *v)
VertexContainer _vertices
const Vertex * vertex(size_t i) const
linear solver which uses the sparse Cholesky solver from Eigen
int dimension() const
dimension of the estimated state belonging to this node
virtual void setId(int id)
Implementation of the Levenberg Algorithm.
Generic interface for a non-linear solver operating on a graph.
bool writeVector(std::ostream &os, const Eigen::DenseBase< Derived > &b)
bool readVector(std::istream &is, Eigen::DenseBase< Derived > &b)
double sampleUniform(double min, double max, std::mt19937 *generator)
double sampleGaussian(std::mt19937 *generator)