SLAM14讲 ch6 g2o曲线拟合程序问题

这一讲包含了一个用g2o库进行曲线拟合的实例,但是在按照书中实际步骤实际运行发现了几个问题。

(1)g2o库的的依赖项安装

书中所写命令如下:

sudo apt-get install libqt4-dev qt4-qmake libqglviewer-dev libsuitesparse-dev libcxsparse3.1.2 libcholmod-dev

但是最后一项(libcholmod-dev)会提示不能安装,此时应该用tab键进行补全完成安装

(2)编译出错

在使用cmake编译中,出现了以下报错:

 1  By not providing "FindG2O.cmake" in CMAKE_MODULE_PATH this project has
 2   asked CMake to find a package configuration file provided by "G2O", but
 3   CMake did not find one.
 4
 5   Could not find a package configuration file provided by "G2O" with any of
 6   the following names:
 7
 8     G2OConfig.cmake
 9     g2o-config.cmake
10
11   Add the installation prefix of "G2O" to CMAKE_PREFIX_PATH or set "G2O_DIR"
12   to a directory containing one of the above files.  If "G2O" provides a
13   separate development package or SDK, be sure it has been installed.

原因在于CMakeLists.txt中,虽然定义了CMAKE_MODULE_PATH,但没有对应的文件和文件夹,也就是没有找到FindG2O.cmake文件

解决办法:找到findg2o.cmake文件的位置,一般在g2o安装包中的"cmake_modules"文件夹中,将整个文件夹复制到相应工程的下面,与build文件夹在同一目录,然后编译可以正常通过

*(3)CMakeLists.txt文件问题

高博在GitHub中给出的代码如下:

 1 cmake_minimum_required( VERSION 2.8 )
 2 project( g2o_curve_fitting )
 3
 4 set( CMAKE_BUILD_TYPE "Release" )
 5 set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
 6
 7 # 添加cmake模块以使用ceres库
 8 list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
 9
10 # 寻找G2O
11 find_package( G2O REQUIRED )
12 include_directories(
13     ${G2O_INCLUDE_DIRS}
14     "/usr/include/eigen3"
15 )
16
17 # OpenCV
18 find_package( OpenCV REQUIRED )
19 include_directories( ${OpenCV_DIRS} )
20
21 add_executable( curve_fitting main.cpp )
22 # 与G2O和OpenCV链接
23 target_link_libraries( curve_fitting
24     ${OpenCV_LIBS}
25     g2o_core g2o_stuff
26 )

由于项目名定的是g2o_curve_fitting,因此需要修改最后的target_link_libraries(g2o_curve_fitting ${OpenCV_LIBS} g2o_core g2o_stuff)

(这个只是我遇见的问题,如果还有其他的问题,欢迎一起交流讨论)

最后整个代码的运行结果如下

generating data:
0 2.71828
0.01 2.93161
0.02 2.12942
0.03 2.46037
0.04 4.18814
0.05 2.73368
0.06 2.42751
0.07 3.44729
0.08 3.72543
0.09 2.1358
0.1 4.12333
0.11 3.38199
0.12 4.81164
0.13 1.62582
0.14 1.76862
0.15 3.21555
0.16 3.0922
0.17 5.82752
0.18 4.29855
0.19 2.74081
0.2 5.75724
0.21 3.53729
0.22 1.95514
0.23 2.99195
0.24 3.28739
0.25 4.70749
0.26 6.24365
0.27 5.81645
0.28 4.88402
0.29 4.75991
0.3 7.25246
0.31 5.92933
0.32 7.00306
0.33 5.22286
0.34 5.16179
0.35 7.26191
0.36 6.40545
0.37 6.25549
0.38 6.56094
0.39 6.53523
0.4 8.14891
0.41 7.77616
0.42 7.40141
0.43 8.75638
0.44 7.20606
0.45 7.57795
0.46 8.21564
0.47 9.84032
0.48 6.96725
0.49 9.90619
0.5 9.27125
0.51 9.87567
0.52 10.3412
0.53 9.55315
0.54 11.3635
0.55 10.8815
0.56 13.0648
0.57 11.4756
0.58 11.337
0.59 13.2393
0.6 13.5299
0.61 14.0441
0.62 13.31
0.63 13.672
0.64 14.8504
0.65 14.2599
0.66 14.7724
0.67 17.4339
0.68 17.4632
0.69 17.7598
0.7 16.8223
0.71 19.9468
0.72 20.5446
0.73 21.3767
0.74 20.1435
0.75 20.3088
0.76 23.2543
0.77 23.4349
0.78 22.8706
0.79 24.094
0.8 25.4183
0.81 25.5237
0.82 27.9738
0.83 28.5861
0.84 29.5703
0.85 29.6744
0.86 32.667
0.87 34.2698
0.88 33.5124
0.89 36.1479
0.9 39.2485
0.91 40.988
0.92 41.5716
0.93 41.3686
0.94 44.285
0.95 42.8312
0.96 47.7941
0.97 48.5931
0.98 51.8487
0.99 51.0258
start optimization
iteration= 0     chi2= 30373.727656     time= 0.000163358     cumTime= 0.000163358     edges= 100     schur= 0     lambda= 699.050482     levenbergIter= 7
iteration= 1     chi2= 13336.948288     time= 5.5717e-05     cumTime= 0.000219075     edges= 100     schur= 0     lambda= 1864.134619     levenbergIter= 3
iteration= 2     chi2= 6946.262996     time= 3.5332e-05     cumTime= 0.000254407     edges= 100     schur= 0     lambda= 1242.756412     levenbergIter= 1
iteration= 3     chi2= 271.023166     time= 3.5225e-05     cumTime= 0.000289632     edges= 100     schur= 0     lambda= 414.252137     levenbergIter= 1
iteration= 4     chi2= 118.903887     time= 4.2411e-05     cumTime= 0.000332043     edges= 100     schur= 0     lambda= 138.084046     levenbergIter= 1
iteration= 5     chi2= 113.568660     time= 3.5035e-05     cumTime= 0.000367078     edges= 100     schur= 0     lambda= 46.028015     levenbergIter= 1
iteration= 6     chi2= 107.476457     time= 4.2275e-05     cumTime= 0.000409353     edges= 100     schur= 0     lambda= 15.342672     levenbergIter= 1
iteration= 7     chi2= 103.014522     time= 3.5151e-05     cumTime= 0.000444504     edges= 100     schur= 0     lambda= 5.114224     levenbergIter= 1
iteration= 8     chi2= 101.988348     time= 4.9545e-05     cumTime= 0.000494049     edges= 100     schur= 0     lambda= 1.704741     levenbergIter= 1
iteration= 9     chi2= 101.937388     time= 4.9565e-05     cumTime= 0.000543614     edges= 100     schur= 0     lambda= 0.568247     levenbergIter= 1
iteration= 10     chi2= 101.937021     time= 2.6884e-05     cumTime= 0.000570498     edges= 100     schur= 0     lambda= 0.378831     levenbergIter= 1
iteration= 11     chi2= 101.937020     time= 3.4683e-05     cumTime= 0.000605181     edges= 100     schur= 0     lambda= 0.252554     levenbergIter= 1
iteration= 12     chi2= 101.937020     time= 3.5072e-05     cumTime= 0.000640253     edges= 100     schur= 0     lambda= 0.168370     levenbergIter= 1
iteration= 13     chi2= 101.937020     time= 6.239e-05     cumTime= 0.000702643     edges= 100     schur= 0     lambda= 3678.088107     levenbergIter= 6
iteration= 14     chi2= 101.937020     time= 5.4525e-05     cumTime= 0.000757168     edges= 100     schur= 0     lambda= 19616.469906     levenbergIter= 3
iteration= 15     chi2= 101.937020     time= 4.9616e-05     cumTime= 0.000806784     edges= 100     schur= 0     lambda= 836969.382664     levenbergIter= 4
iteration= 16     chi2= 101.937020     time= 5.7449e-05     cumTime= 0.000864233     edges= 100     schur= 0     lambda= 224672257893341.656250     levenbergIter= 7
solve time cost = 0.0013663 seconds.
estimated model: 0.890911   2.1719 0.943629

原文地址:https://www.cnblogs.com/qi-zhang/p/9365199.html

时间: 2024-10-27 22:16:48

SLAM14讲 ch6 g2o曲线拟合程序问题的相关文章

视觉slam十四讲ch6曲线拟合 代码注释(笔记版)

1 #include <opencv2/core/core.hpp> 2 #include <ceres/ceres.h> 3 #include <chrono> 4 5 using namespace std; 6 7 // 代价函数的计算模型 8 struct CURVE_FITTING_COST 9 { 10 CURVE_FITTING_COST ( double x, double y ) : _x ( x ), _y ( y ) {} 11 // 残差的计算

小甲鱼python视频第六讲(笔记及程序源代码)

今天主要学习了关于循环的一些要点, 1.elif的使用 while True: temp = input("请输入分数:") score = int(temp) if 100 >= score >= 90: print("A") elif 90 >= score >= 80: print("B") elif 80 >= score >= 60: print("C") elif 60 >

Matlab自带的曲线拟合程序

这个函数的功能是能自动搜索参数的取值,从而使得方程的误差最小. 效果如下 代码如下 %% Optimal Fit of a Non-linear Function % This is a demonstration of the optimal fitting of a non-linear function to a % set of data. It uses FMINSEARCH, an implementation of the Nelder-Mead simplex % (direct

slam14讲证明构成李代数

原文地址:https://www.cnblogs.com/ymd12103410/p/9742162.html

深入浅出计算机组成原理:异常和中断-程序出错了怎么办?(第28讲)

一.引子 过去这么多讲,我们的程序都是自动运行且正常运行的.自动运行的意思是说,我们的程序和指令都是一条条顺序执行,你不需要通过键盘或者网络给这个程序任何输入.正常运行是说,我们的程序都是能够正常执行下去的,没有遇到计算溢出之类的程序错误. 不过,现实的软件世界可没有这么简单.一方面,程序不仅是简单的执行指令,更多的还需要和外部的输入输出打交道.另一方面,程序在执行过程中,还会遇到各种异常情况,比如除以0.溢出,甚至我们自己也可以让程序抛出异常. 那这一讲,我就带你来看看,如果遇到这些情况,计算

从零开始一起学习SLAM | 掌握g2o顶点编程套路

点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰,我现在再去看g2o的那些优化的部分,基本都能看懂了呢! 师兄:那太好啦,以后多练习练习,加深理解 小白:嗯,我开始编程时,发现g2o的顶点和边的定义也非常复杂,光看十四讲里面,就有好几种不同的定义,完全懵圈状态...师兄,能否帮我捋捋思路啊 师兄:嗯,你说的没错,入门的时候确实感觉很乱,我最初也是花了些时间

关于SLAM的那些事——通用图优化(G2O)环境搭配(windows8.1 vs2013)

好久不见啊各位亲,最近刚中期答辩完,得以有时间好好更新下博客啦. 自从上一个单目AR系统做完后,就仔细思考了一下我到底在做什么,接下来要做什么.之前博客上写的是3d重建,后来视野开阔了之后发现无论我做3d重建,SLAM,AR,重要的都是姿态更新.一个精准的稳定的姿态更新,决定着系统的好坏.贝叶斯滤波器(EKF扩展卡尔曼滤波,PF粒子滤波)和通用图优化(G2O)是使得姿态更加精准稳定的两种方法.近些年来G2O在视觉SLAM领域逐渐成为了主流的后端优化方法. 具体的视觉SLAM流程和G2O的相关知识

微信小程序开发—小程序框架详解(二)

上一节讲了微信小程序的目录结构及各个文件的作用,主要介绍了小程序的配置文件及其支持的配置属性. 本节主要从逻辑层和视图层来说明小程序的框架. 小程序的逻辑层由js完成,视图层由微信提供的WXML(WeiXin Mark Language)和WXSS(WeiXin Style Sheet)文件来完成. 其中官方给出的解释:页面的脚本逻辑是在JsCore中运行,JsCore是一个没有窗口对象的环境,所以不能在脚本中使用window,也无法在脚本中操作组件.同时由于zepto/jquery 会使用到w

Java 并发编程之图形界面应用程序及死锁问题

不知道为什么这本书还要讲一个界面应用程序,Java的界面做的很糟糕,效率低下,而且界面是java的弱项,可能是因为这里边是有一些并发编程的知识吧. 为什么GUI是单线程的 无论是Swing还是AWT都是单线程的.但它不仅限于在java中,在Qt,NexiStep,macOs CoCoa X windows以及其它环境中的GUI框架都是单线程的,许多人都曾经尝试编写多线程的GUI框架,但最终都由于竞态条件和死锁导致的稳定性问题而又重新回到单线程的事件队列模型:采用一个专门的线程从队列中抽取事件,并