133 {
134
135 int polynomialDimension = 4;
136 if (argc > 1) {
137 polynomialDimension = atoi(argv[1]);
138 }
139
140
141 Eigen::VectorXd p(polynomialDimension);
142 for (int i = 0; i < polynomialDimension; ++i) {
144 }
145
146 std::cout << "Ground truth vector=" << p.transpose() << std::endl;
147
148
149 int obs = 6;
150 if (argc > 2) {
151 obs = atoi(argv[2]);
152 }
153
154
155
156 double sigmaZ = 0.1;
157 Eigen::VectorXd x(obs);
158 Eigen::VectorXd z(obs);
159
160 for (int i = 0; i < obs; ++i) {
163 }
164
165
166 std::unique_ptr<g2o::BlockSolverX::LinearSolverType> linearSolver =
167 std::make_unique<
169
170
171 std::unique_ptr<g2o::BlockSolverX> blockSolver =
172 std::make_unique<g2o::BlockSolverX>(std::move(linearSolver));
173
174
177
178
179 std::unique_ptr<g2o::SparseOptimizer> optimizer =
180 std::make_unique<g2o::SparseOptimizer>();
181 optimizer->setVerbose(true);
182 optimizer->setAlgorithm(optimisationAlgorithm);
183
184
187 optimizer->addVertex(pv);
188
189
191 PolynomialSingleValueEdge::InformationType::Zero();
192 omega(0, 0) = 1 / (sigmaZ * sigmaZ);
193
194
195 for (int i = 0; i < obs; ++i) {
199 optimizer->addEdge(pe);
200 }
201
202
203
204
205
206
207 for (int testDimension = 1; testDimension <= polynomialDimension;
208 ++testDimension) {
210 optimizer->initializeOptimization();
211 optimizer->optimize(10);
212 std::cout <<
"Computed parameters = " << pv->
estimate().transpose()
213 << std::endl;
214 }
215 for (int testDimension = polynomialDimension - 1; testDimension >= 1;
216 --testDimension) {
218 optimizer->initializeOptimization();
219 optimizer->optimize(10);
220 std::cout <<
"Computed parameters = " << pv->
estimate().transpose()
221 << std::endl;
222 }
223}
virtual bool setDimension(int newDimension)
internal::BaseEdgeTraits< D >::InformationType InformationType
const EstimateType & estimate() const
return the current estimate of the vertex
void setVertex(size_t i, Vertex *v)
linear solver which uses the sparse Cholesky solver from Eigen
virtual void setId(int id)
Implementation of the Levenberg Algorithm.
Generic interface for a non-linear solver operating on a graph.
double sampleUniform(double min, double max, std::mt19937 *generator)
double sampleGaussian(std::mt19937 *generator)