簡體   English   中英

Unix系統上的G2O BlockSolver初始化崩潰

[英]G2O BlockSolver Initialization Crash on Unix System

我有一個擁有並使用G2O庫的項目,它可以在兩種平台(win / Unix)上運行。

(WINDOW通過/ UNIX崩潰)

我們可以在這兩個平台中看到這些行:

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

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

下一步,在窗口os中,我們有以下內容:

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 :: refinePose(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 /包含/ g2o /核心/ block_solver.h:199: 0 ,G2o / include / g2o / core / block_solver.hpp:40:1注意:候選者: g2o :: BlockSolver :: BlockSolver(std :: unique_ptr)[特征= g2o :: BlockSolverTraits <6,3>; 類型名稱特性:: 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 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);

//調試->在這里,通過“進入”,轉到“ /usr/include/c++/6/bits/move.h”,在ligne 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

最好的祝福,

解決了:

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)...));
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM