-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Here is the short sample code I have tried to see if library works or not.
program always died in optimizer.addEdge() -> e->resolveParameters() -> if (typeid(aux).name() != _parameterTypes[i])
It seems like aux is 0x0
I tried old version g2o (2020)(2023), the same result.
#include <g2o/core/sparse_optimizer.h>
#include <g2o/core/block_solver.h>
#include <g2o/core/optimization_algorithm_gauss_newton.h>
#include <g2o/solvers/dense/linear_solver_dense.h>
#include <g2o/types/slam3d/types_slam3d.h>
#include <Eigen/Core>
#include
int main()
{
g2o::SparseOptimizer optimizer;
auto linearSolver = std::make_unique<g2o::LinearSolverDenseg2o::BlockSolverX::PoseMatrixType>();
auto blockSolver = std::make_uniqueg2o::BlockSolverX(std::move(linearSolver));
auto algorithm = new g2o::OptimizationAlgorithmGaussNewton(std::move(blockSolver));
optimizer.setAlgorithm(algorithm);
g2o::VertexSE3 *poseVertex = new g2o::VertexSE3();
poseVertex->setId(0);
poseVertex->setEstimate(Eigen::Isometry3d::Identity());
optimizer.addVertex(poseVertex);
g2o::VertexPointXYZ *pointVertex = new g2o::VertexPointXYZ();
pointVertex->setId(1);
pointVertex->setEstimate(Eigen::Vector3d(1.0, 1.0, 5.0));
optimizer.addVertex(pointVertex);
g2o::EdgeSE3PointXYZ *edge = new g2o::EdgeSE3PointXYZ();
edge->setVertex(0, poseVertex);
edge->setVertex(1, pointVertex);
edge->setMeasurement(Eigen::Vector3d(1.0, 1.0, 5.0));
edge->setInformation(Eigen::Matrix3d::Identity());
std::cout << "Vertex 0 type: " << typeid(*optimizer.vertex(0)).name() << std::endl;//Vertex 0 type: N3g2o9VertexSE3E
std::cout << "Vertex 1 type: " << typeid(*optimizer.vertex(1)).name() << std::endl;//ertex 1 type: N3g2o14VertexPointXYZE
std::cout << "Vertex 0 exists: " << (optimizer.vertex(0) != nullptr) << std::endl;//Vertex 0 exists: 1
std::cout << "Vertex 1 exists: " << (optimizer.vertex(1) != nullptr) << std::endl;//Vertex 1 exists: 1
std::cout << "Measurement: " << edge->measurement().transpose() << std::endl;//Measurement: 1 1 5
std::cout << "Information matrix:\n"
<< edge->information() << std::endl;//Information matrix: 1 0 0 0 1 0 0 0 1
optimizer.addEdge(edge);//error
return 0;
}