Сбой при инициализации G2O BlockSolver в системе Unix

У меня есть проект, который обладает и использует библиотеку G2O, она работает на обеих платформах (win / Unix).

(Окно пройдено / UNIX разбито)

Мы можем видеть на обеих платформах эти строки:

g2o::SparseOptimizer optimizer;
g2o::BlockSolver_6_3::LinearSolverType * linearSolver;

linearSolver = new g2o::LinearSolverDense<g2o::BlockSolver_6_3::PoseMatrixType>();

Следующие шаги, в окне ОС у нас есть это:

g2o::BlockSolver_6_3 * solver_ptr = new g2o::BlockSolver_6_3(linearSolver);
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr);

Но система Unix не может скомпилировать эти строки, потому что она говорит

my_file_G2o.cpp: * В функции- члене 'int Refiner_G2O:: finePose (cv:: Mat &, const std:: vector> &, const std:: vector &, const cv:: Mat &, float, std:: vector &)': my_file_G2o.cpp -> нет соответствующей функции для вызова 'g2o:: BlockSolver:: BlockSolver (g2o:: BlockSolver:: LinearSolverType &)' * ^ В файле, включенном из G2o / include / g2o / core / block_solver.h: 199: 0, G2o / include / g2o / core / block_solver.hpp: 40: 1: примечание: кандидат: g2o:: BlockSolver:: BlockSolver (std:: unique_ptr) [with Traits = g2o:: BlockSolverTraits <6, 3>; typename Traits:: LinearSolverType = g2o:: LinearSolver>] BlockSolver:: BlockSolver (std:: unique_ptr linearSolver)

Когда я вижу эти ошибки, я дополняю свой код Unix этим новым блоком

auto solver_ptr = g2o::make_unique<g2o::BlockSolver_6_3>(linearSolver); // [SEGFAULT LINE]
auto solver = g2o::make_unique<g2o::OptimizationAlgorithmLevenberg>(solver_ptr);
optimizer.setAlgorithm(solver.get());

Так что теперь я могу строить / запускать, но встречаю segfault на линии с тегом [SEGFAULT LINE].

РЕДАКТИРОВАТЬ: После поэтапной отладки с помощью отладочной сборки у меня есть несколько новостей:

g2o::SparseOptimizer optimizer; // debug says: "optimize: g2o::SparseOptimize
g2o::BlockSolver_6_3::LinearSolverType * linearSolver = NULL; // debug says : linearSolver: NULL
linearSolver = new g2o::LinearSolverDense<g2o::BlockSolver_6_3::PoseMatrixType>(); // debug says:  linear solver: 0x7fe39cba9140

if (linearSolver == NULL) // debug says : not null.
    exit (84);
auto solver_ptr = g2o::make_unique<g2o::BlockSolver< g2o::BlockSolver_6_3 >>(linearSolver);

// DEBUG -> И здесь, с "шагом в" он переходит к этому "/usr/include/c++/6/bits/move.h" и в строке 48 мы можем увидеть эту функцию:

`template<typename T, typename ...ArgTs>
 std::unique_ptr<T> make_unique(ArgTs&& ...args) //DEBUG says: args#0: 
 -var-create: unable to create variable object.
  {
    return std::unique_ptr<T>(g2o::make_unique<T>(std::forward<ArgTs> 
    (args)...));
   };`

И он сам по себе, потому что у нее плохие аргументы.

Я не понимаю, почему? если у кого-то есть идея, я хочу понять, как в Window это работает, а не в системе Unix, будет здорово, если вы поможете.

Версия для Linux: Ubuntu 16.04
Версия CMAKE: 3.11.4

С наилучшими пожеланиями,

1 ответ

РЕШИТЬ:

G2O оптимизировать:

g2o::SparseOptimizer optimizer;

auto linearSolver = std::make_unique<g2o::LinearSolverDense<g2o::BlockSolver_6_3::PoseMatrixType>>();

auto solver = new g2o::OptimizationAlgorithmLevenberg(std::make_unique<g2o::BlockSolver_6_3>(std::move(linearSolver)));

optimizer.setAlgorithm(solver);

MISC.H:

template<typename T, typename ...ArgTs>
std::unique_ptr<T> make_unique(ArgTs&& ...args)
{
  return std::unique_ptr<T>(new T(std::forward<ArgTs>(args)...));
};
Другие вопросы по тегам