想直接改动,在《还是g2o初始化一些》那篇,这篇比较啰嗦,主要是记录自己思考的步骤。
首先说明主题:没文化真可怕
好了,说干货。之前高博的代码。只要涉及g2o的部分,一律跑不通,没重装之前,只是报一个段错误,就没了。也排查不出来问题。
今日2017年9月24日重装系统,重新搭建环境,除了opencv外,其他一律重新下载安装的。g2o从github下载安装的。

先贴一下g2o初始化的代码:

// 初始化g2otypedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器//std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());Block* solver_ptr = new Block ( linearSolver );//std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr);//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));g2o::SparseOptimizer optimizer;optimizer.setAlgorithm ( solver );

安装好之后,运行第七章的3d2d程序,还是跑不通:
报错:

/home/robin/CLionProjects/slambook-robin/ch7/pose_estimation_3d2d/main.cpp:217:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’Block* solver_ptr = new Block ( linearSolver );

点开位置发现是g2o初始化中的Block构造的时候报错:

Block* solver_ptr = new Block ( linearSolver );

继续点下面的错误信息:

In file included from /usr/local/include/g2o/core/block_solver.h:199:0,from /home/robin/CLionProjects/slambook-robin/ch7/pose_estimation_3d2d/main.cpp:11:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<6, 3>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >]BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)

发现跳转到了block_solver.hpp中BlockSolver的构造函数去了,发现是这样写的:

BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver):   BlockSolverBase(),_linearSolver(std::move(linearSolver))

发现BlockSolver构造时需要的是std::unique_ptr类型的linearSolver参数,这里还知道是啥玩意儿,不过看见ptr猜测是个指针。对比程序中上面写的,发现是这样的:

Block::LinearSolverType* linearSolver

猜测是不是因为std::unique_ptr与Block::LinearSolverType*类型不一样导致的?
但是高博写的应该没有错误,是不是g2o更新导致用法不一样了?看一下高博书中自带的g2o的代码,发现果然不一样:
高博书中的g2o是这么写的:

BlockSolver<Traits>::BlockSolver(LinearSolverType* linearSolver) :BlockSolverBase(),_linearSolver(linearSolver)

好,找到了问题原因,下面修改:
百度一发unique_ptr用法,这里是个网址:
http://blog.csdn.net/pi9nc/article/details/12227887

参考着进行改动:

// 初始化g2otypedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3//Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());//Block* solver_ptr = new Block ( linearSolver );std::unique_ptr<Block> solver_ptr ( new Block ( linearSolver));//std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr);//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));g2o::SparseOptimizer optimizer;optimizer.setAlgorithm ( solver );

把linearSolver和solver_ptr都改成了std::unique_ptr<>类型,并且初始化时不再用等号。
运行,发现还是报错:

/home/robin/CLionProjects/slambook-robin/ch7/pose_estimation_3d2d/main.cpp:218:65: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >; _Dp = std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> > >]’std::unique_ptr<Block> solver_ptr ( new Block ( linearSolver));

在这一句:
std::unique_ptr<Block> solver_ptr ( new Block ( linearSolver));
并且后面的一句:

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

也是报错。

第一句的:

std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());

并没有报错,说明这一句是对的!
观察报错两句,发现都存在将unique_ptr作为参数传递给类的构造函数中的用法,然后那篇博客中有个move指令,猜测是不是直接传递不行,要用move才对,继续修改:

// 初始化g2otypedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3//Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());//Block* solver_ptr = new Block ( linearSolver );//std::unique_ptr<Block> solver_ptr ( new Block ( linearSolver));std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr);g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));g2o::SparseOptimizer optimizer;optimizer.setAlgorithm ( solver );

在传递linearSolver和solver_ptr时,加上了std::move()。再试一发!
OK,没毛病了,在得出RT之后调用BA,优化结果输出,并且退出时没有报错!
运行结果:

R=
[0.9978662026232452, -0.05167241669574823, 0.03991244185821538;0.0505958920800001, 0.9983397626650758, 0.02752769489929838;-0.04126860025362437, -0.02544955077522656, 0.9988239199170421]
t=
[-0.6361298163857759;-0.03753650998182134;0.3069292389205321]
calling bundle adjustment
iteration= 0     chi2= 1.040183  time= 0.00270625    cumTime= 0.00270625     edges= 76   schur= 1    lambda= 78.843278   levenbergIter= 1
iteration= 1     chi2= 0.000789  time= 0.00202973    cumTime= 0.00473598     edges= 76   schur= 1    lambda= 26.281093   levenbergIter= 1
iteration= 2     chi2= 0.000000  time= 0.00200341    cumTime= 0.00673939     edges= 76   schur= 1    lambda= 17.520729   levenbergIter= 1
iteration= 3     chi2= 0.000000  time= 0.00202996    cumTime= 0.00876935     edges= 76   schur= 1    lambda= 11.680486   levenbergIter= 1
iteration= 4     chi2= 0.000000  time= 0.00200547    cumTime= 0.0107748  edges= 76   schur= 1    lambda= 7.786990    levenbergIter= 1
iteration= 5     chi2= 0.000000  time= 0.00200838    cumTime= 0.0127832  edges= 76   schur= 1    lambda= 5.191327    levenbergIter= 1
iteration= 6     chi2= 0.000000  time= 0.00200928    cumTime= 0.0147925  edges= 76   schur= 1    lambda= 3.460885    levenbergIter= 1
iteration= 7     chi2= 0.000000  time= 0.00202289    cumTime= 0.0168154  edges= 76   schur= 1    lambda= 2.307256    levenbergIter= 1
iteration= 8     chi2= 0.000000  time= 0.00197821    cumTime= 0.0187936  edges= 76   schur= 1    lambda= 1.538171    levenbergIter= 1
iteration= 9     chi2= 0.000000  time= 0.00202251    cumTime= 0.0208161  edges= 76   schur= 1    lambda= 1.025447    levenbergIter= 1
iteration= 10    chi2= 0.000000  time= 0.00206846    cumTime= 0.0228846  edges= 76   schur= 1    lambda= 0.683632    levenbergIter= 1
iteration= 11    chi2= 0.000000  time= 0.00207496    cumTime= 0.0249595  edges= 76   schur= 1    lambda= 0.455754    levenbergIter= 1iteration= 12    chi2= 0.000000  time= 0.0133918     cumTime= 0.0383513  edges= 76   schur= 1    lambda= 122340628.619249    levenbergIter= 7
after optimization:
T=0.997777 -0.0521927  0.0414303  -0.6470230.0510161   0.998278  0.0289658 -0.0492099
-0.0428708 -0.0267878   0.998721     0.30040          0          0          1Process finished with exit code 0

关于关于高博3d2d程序报错的改动相关推荐

  1. NULL 指针在不同平台下的表现引发程序报错(C 语言)

    NULL 指针在不同平台下的表现引发程序报错(C 语言) 为什么有这篇 正文 1. 使用环境 2.问题描述及展示 3. 走了些弯路 4. 柳岸花明(GDB 调试) 5. 访问 NULL 指针错误背后的 ...

  2. 【错误记录】PyCharm 运行 Python 程序报错 ( UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe5 in positio )

    文章目录 一.报错信息 二.解决方案 一.报错信息 PyCharm 运行 Python 程序报错 : D:\002_Project\011_Python\APK\venv\Scripts\python ...

  3. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( pip 21.0 will drop support for Python 2.7 in January 20 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 [错误记录]Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( No module named 'threadpool' ...

  4. Android程序报错:Unable to add window——token android.os.BinderProxy@431e65b8 is not valid

    http://blog.csdn.net/lvyoujt/article/details/51604746 http://blog.csdn.net/lvyoujt/article/details/5 ...

  5. 解压bz2;kaggle(google人机验证);pycharm加上参数运行;no module named ‘torch_sparse;像这种在kaggle中运行程序报错—— invalid syn

    https://jingyan.baidu.com/article/86fae3461437c53c48121a50.html 关于kaggle一些问题解决办法 - Y-flower - 博客园 Go ...

  6. 【Rust】Ubuntu编译Rust程序报错 failed to run custom build command for openssl-sys v0.9.39 的解决方法

    Ubuntu环境下编译Rust程序报错: failed to run custom build command for openssl-sys v0.9.39 Ubuntu版本:20.04 参考Git ...

  7. Windows 11的Windows Hello的指纹解锁用不了程序报错解决方法。

    Windows 11的Windows Hello的指纹解锁用不了&程序报错解决方法. 第一种方法 浏览器随便搜都是这种方法. 比如(95条消息) win11中关闭windows hello 尝 ...

  8. 运行安卓程序报错android.view.InflateException: Binary XML file line #11: Error inflating class ImageView

    运行安卓程序报错android.view.InflateException: Binary XML file line #11: Error inflating class ImageView 先上代 ...

  9. LoadRunner12启动webTour程序报错“httpd.exe: Could not reliably determine the server‘s fully…“

    LoadRunner12启动webTour程序报错httpd.exe: Could not reliably determine the server's fully qualified domain ...

最新文章

  1. 想要确保架构目标达成?适合度函数了解一下
  2. data-参数说明(模态弹出窗的使用)
  3. 换行显示print_r($arr);打印结果显示:Array( [0] = 百度 [1] = 阿里)
  4. 手游运营重度化,抓好论坛专区“预热战场”
  5. python3列表_Python3列表
  6. 如何在多版本anaconda python环境下转换spyder?
  7. 移除VS解决方案中的TFS版本控制
  8. 【POJ - 2942】Knights of the Round Table(点双连通分量,二分图判断奇环奇圈)
  9. android 分享到豆瓣,Android项目总结之社会化分享
  10. [软件架构]基于PluginRT的插件编程
  11. 终于完成了一个能够绘制的FireFox插件
  12. 厄拉多塞筛法求素数 c语言,求质数(Prime Number 素数)的方法——厄拉多塞筛法...
  13. 幅频特性、相频特性的概念解释
  14. 星际争霸环境旧版本replay回放无法观看问题
  15. Java中的正则表达式 regex
  16. 电商后台设计:权限设计
  17. 二维小波变换_小波变换完美通俗讲解系列之 (一)
  18. php期末考试题机考_PHP试题网
  19. 5.10 自定义颜色至色板和全局色的使用 [Illustrator CC教程]
  20. 散粒噪声是白噪声吗_散粒噪声

热门文章

  1. oppo手机在哪看电池寿命
  2. Python数据可视化-Matplotlib线性图(折线图等) 代码教学 Part 1
  3. JPG、GIF、PNG和BMP格式的图片各有什么优点和缺点
  4. C++语言递归实现求从n个数中选k个进行组合的组合数
  5. kibana快照存储库实现定时备份elasticsearch集群索引
  6. SWUST OJ题目解析(C语言):160促销计算
  7. 计算机辅助设计绘图员技能鉴定试题(建筑类),计算机辅助设计高级绘图员技能鉴定试题...
  8. 【C/C++】学前必看知识概览
  9. 【Tryhackme】Hacker of the Hill #1
  10. 虾皮广告投放优化策略有哪些?