一起做RGB-D SLAM(8) (关于调试与补充内容)
“一起做”系列完结后,我收到不少同学给我的反馈。他们提了一些在程序编译/运行过程中的问题。我把它们汇总起来,组成了这个“补充篇”。你也可以看成是一个Q&A。
- Q: OpenCV的版本?
A: 我用的是2.4.9。可以使用2.4系列,不会有太大差别。而3.0系列则在接口上有一些明显的改动,可能需要修改源码。 - Q: 第二讲的点云如何查看?
A: 使用pcl_viewer。当点云显示时,先用r键复位视角,再用鼠标调整。 - Q: 如何调试代码?
A: 可以在源程序里用cout, cerr输出,善用linux的管道与IO流即可调试。如需断点,可用gdb, ddd等工具(虽然我不怎么用)。
此外,6,7两讲使用g2o,编译过程可能对新手来说有些困难。以下是来自吴思颖同学的反馈——感谢他力图使他的写作风格与我相似:
大家好,我是小萝卜,在跟随高帮主《一起做RGBD-SLAM》的道路上,步步坎坷,终于把帮主博客里的内容跑了个差不多,林林总总,各种问题,在诸位同学的帮助下,虽然还不知其所以然,也算是解决了,下面把这些过程记录下来,希望同学们能够在《一起做》的道路上,少走弯路~
在《一起做》的过程中,主要遇到以下三个问题,我把各个问题的病症以及我认为的可能的原因以及最终的解决方法都记录下来,大家慢慢看(需要说明的是,我是linux新手,很多的基本操作都不熟悉,因此大家可能会看到一些很奇葩的解决方法,见笑啦,进步嘛,总是不那么一帆风顺,折腾,就是折腾!)~
(一)《一起做》系列的(6)、(7)两篇源程序在编译时通不过,错误如下图
该问题的具体原因不明,大家揣测是库冲突,出现在使用从帮主博客《一起做6》里给出的g2o的地址下载的g2o源代码进行编译安装时,解决的方法是,使用帮主在qq讨论群里给出的g2o的压缩包进行编译安装。这个版本的g2o源代码,估计帮主会放在自己的github里,与《一起做》系列的源代码打包在一起供各位小萝卜们下载学习。(我已经更新了我的git)。
(二)问题(一)的衍生问题,出现问题(一)并按照上述问题解决方案进行解决后出现运行g2o_viewer时的core dumped(或者cannot open library: libg2o_solver_eigen.so)问题,猜测原因是之前编译安装的g2o的相关共享库没有清除干净,解决方法为:(1)删除/usr/local/include/g2o,指令为sudo rm -rf /usr/local/include/g2o;(2)删除/usr/local/lib下有关libg2o_*.so的库文件,先进入目录cd /usr/local/lib,然后挨个(可多个同时)删除sudo rm -rf libg2o_*.so libg2o_*.so libg2o_*.so(我一个一个删的我会说……)
(三)这个是和编译安装新源代码相关的问题,还是和g2o有关,具体是我的系统是12.04的,昨天手滑点了更新,结果导致pcl_viewer 使用不了了,而且看提示好像很多pcl相关的库都出现了问题,于是,我重装了系统,然后再把相关的软件都安装后,g2o_viewer运行不了了,问题是error while loading shared libraries: libg2o_viewer.so: cannot open shared object file: No such file or directory, 经帮主指点,发现问题的原因是在默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通过源码包进行安装时,如果不指定--prefix会将库安装在/usr/local目录下,而又没有在文件/etc/ld.so.conf中添加 /usr/local/lib这个目录。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。网络上的解决方法是在/etc/ld.so.conf里添加绝对路径/usr/local/lib,作为一个新手,我实在不知道怎么样添加进去,用gedit编辑之后,不能保存,用echo /usr/local/lib >> /etc/ld.so.conf没反应,于是我就采用了奇葩方法:用gedit打开/etc/ld.so.conf,然后添加/usr/local/lib ,再把这个文件保存到home,然后sudo cp -i ld.so.conf /etc/ld.so.conf,之后,执行ldconfig(这一步是必须的,目的是利用ldconfig执行文件将 /etc/ld.so.conf的数据读入高速缓存中),再次运行g2o_viewer result_after.g2o(跑通《一起做7》,在data文件夹下生成的),成功!
致谢:感谢博主&帮主&群主:半闲居士&高翔,感谢哈工程的群友邢会明(问题2的解决方案是由邢同学提供的,我们俩遇到的问题都一样,估计小伙伴们也会在《一起做》的时候遇到);
网络资源:linux共享库,以及/etc/ld.so.conf文件的应用(http://blog.csdn.net/oathevil/article/details/13564213)
/etc/ld.so.conf 文件介绍(http://blog.csdn.net/yjkwf/article/details/7545002)
/etc/ld.so.conf和ldconfig, PKG_CONFIG_PATH
(http://blog.csdn.net/allwtg/article/details/5145306)
最后,如果读者朋友在运行此系列代码时遇到困难,请联系我。如果您的问题很典型,我会更新到这一篇中。
祝大家科研顺利!
2015.9.22 更新
以下是来自中科院张慧娟同学的反馈:
“一起做系列”问题总结
小萝卜2号 2015/9/22
大家好,我是小萝卜2号,喜欢看霹雳五号、黑客帝国、人工智能、机器管家、机械公敌、机械姬、终结者……最近,迷上了群主的“一起做”系列,跌跌撞撞,终于把博客里的内容跑了下来,当然长跑中遇到不少问题,多方寻求,得到解答。在此,小萝卜2号把过程记录下来,希望对各位小萝卜N号有所帮助。由于小萝卜2号所懂不多,若有不对的地方,请大家指正,补充,小萝卜2号会不断改进哦。(“一起做8”中已经给出了6和7讲编译程序时遇到的三个问题,我也遇到了,参考8,这里不再赘述。)
这里以问答形式描述了整个过程,总结了9点。(尝试嘛,总会磕磕绊绊)
Q:用的系统是什么版本?
小萝卜2号:我使用的系统是Ubuntu14.04 for ros(indigo),与群主的Ubuntu12.04不同,是易科机器人社区发布的镜像,网上可下载到。提供一个网址:http://blog.exbot.net/archives/1206 小萝卜2号同时是ros使用者,所以用U盘刻录,然后安装,如有不懂,可到网上搜索具体安装过程。这个镜像对于使用ros 的初学者非常方便,里面装好了集成环境,不必浪费很多时间去配置软件,想用ros又想节省时间的小萝卜N号们可以考虑下。
Q:Ubuntu14.04和Ubuntu 12.04的区别是什么?
小萝卜2号:这里我们要讲下依赖问题。在跑群主程序过程中,我们用到三个库opencv、PCL和g2o,而安装它们一般都需要系统依赖库,因此需要首先安装各种依赖项。系统版本不同,依赖库不同,而我们用到的库是基于某个依赖库开发的,其他版本(如高版本)的依赖库可能不识别,导致无法编译成功。因此,建议安装时参考库的说明文档,有安装要求和步骤,尽量按照说明安装。
Q:OpenCV的版本?
小萝卜2号:我用的是opencv2.4.10,默认安装方式。群主说2.4系列差别不大,而3.0系列则在接口上有一些明显改动,可能需要修改源码。个人觉得,2.4.9和2.4.10没差别,无影响。
Q:PCL 安装问题?
小萝卜2号:我开始用的是Ubuntu12.04,在用命令行安装PCL时,提示找不到依赖项,缺缺缺……于是采用源码安装(参考古月居的博客http://blog.csdn.net/hcx25909/article/details/8651840),装了依赖库,原因未知,还是编译通不过,缺依赖项,缺缺缺……源码安装行不通,果断改装系统,Ubuntu14.04 for ros(indigo),简单又粗暴吧,之后再用三句命令行安装PCL,完全没问题。建议:如果非要用源码安装,每个人电脑配置不同,遇到的问题不同,若实在解决不了,就忍痛割爱,系统重来。
Q:g2o安装问题?
小萝卜2号:对于g2o,最好是用群主github中提供的,一般Ubuntu12.04编译没有问题。我尝试了三种方法,一一解析。(1)不过我的Ubuntu14.04中libQGLViewer有问题,libqglviewer-qt4-dev安装不了,尝试下载debin安装,依然会提示缺少依赖项。(2)所以干脆舍弃g2o的可视化模块g2o_viewer,安装cmake-curses-gui这个包,通过gui来选择想编译的g2o模块, 找到build apps,enter键修改状态为off,make,继续sudo make install,安装相应的lib、头文件、执行文件。缺少显示模块,只是无法用g2o显示图像,不过该有的数据还是都有的。(3)另外,若官网上下载最新g2o,参考安装说明文档,在Ubuntu14.04中编译也能神奇通过,但是在跑“一起做6和7”时,提示错误:core dumped。重启系统,始终不行,原因未知,考虑是库冲突。所以不推荐。
尝试安装libqglviewer-qt4-dev_2.3.4.4_amd64.deb的过程中的错误,大家可以清楚看到n重依赖以及相互冲突:
Q:用PCL的cloudviewer把点云显示出来,为什么会是上下颠倒?
小萝卜2号:关于图像上下翻转问题,是因为opencv定义的坐标系和pcl_viewer显示坐标系不同,opencv是x右y下,而pcl显示是x右y上。解决方法:找到群主程序image2PointCloud函数中,把计算点空间坐标的公式的p.y值添加负号,这样y方向就可以正常显示了,so easy。(或许还有别的方法)
(图片上下翻转)
Q:文件路径问题
小萝卜2号:上面的错误是跑3时的一个提示,是说没有读到数据,没有点云。读取的parameters.txt以及存储的点云数据,最好给出具体的路径。如:/home/document/RGBD_tutorial/part3/code/data/,这样程序才能读取到数据或者保存到正确的文件夹里。
Q:在编译6和7时遇到c++11不兼容的问题?
小萝卜2号:
在确保程序编译通过,而在运行时遇到c++0x_warning.h:32:2 error,我曾尝试在CMakeLists.txt中添加一段代码,然并没卵用,或许有人可以的(可尝试)。参考:http://blog.csdn.net/zyh821351004/article/details/46521319
添加的代码:
多半是因为用的不是群主github上提供的g2o版本,于是g2o重装,程序顺利运行,听着机子跑程序时哗哗的声音,是不是内心无比高兴。
Q: 在cmake时会出现类似的WARNING?
小萝卜2号:注意这个是warning,不是error,不影响编译。原因可能是cmake里的find_package命令把/usr/lib给找出来了,引发了warning。(群主告诉偶滴,直接忽略)
非常感谢群主及各位提供帮助的小伙伴,希望对遇到相似问题的小萝卜N号们有帮助。
-- 我的反馈:
ubuntu 1404下是可以用g2o_viewer的,只要你手动把依赖项配好。一共有三个依赖项,配好之后g2o_viewer照常使用:
一起做RGB-D SLAM(8) (关于调试与补充内容)的更多相关文章
- 【移动端debug-6】如何做一个App里的web调试小工具
原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...
- 基于idea做java程序的本地k8s调试-skaffold(一)
先介绍下本篇文章是基于ideas下开发微服务的场景,大家都知道微服务嘛,一个个微的服务...很多,先不谈调试,要跑起来都费力,可能的原因有: 环境变量的配置,如果多个项目穿插着来,env变量可能废了, ...
- 基于idea做java程序的本地k8s调试-skaffold(二)
上一篇讲完了java代码发到本机minikube中run,这篇来讲讲minkube中进行debug(idea下) 话说,上篇是把pigx基础infra微服务都发到了minikube中,这些微服务是ru ...
- 使用 Napa 创建并调试一个 Office 内容应用 – Hello World
原文地址:http://simpeng.net/office-add-in/%e4%bd%bf%e7%94%a8-napa-%e5%88%9b%e5%bb%ba%e5%b9%b6%e8%b0%83%e ...
- C++调试 输出数组内容和数组名
#include <cstdio> using namespace std; //函数定义 #define printArr(arr,n,format) \ printf("%s ...
- IntelliJ IDEA调试方法补充
基本用法&快捷键 1.首先说第一组按钮,共8个按钮,从左到右依次如下: > Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮 ...
- 一起做RGB-D SLAM (4)
第四讲 点云拼接 广告:“一起做”系列的代码网址:https://github.com/gaoxiang12/rgbd-slam-tutorial-gx 当博客更新时代码也会随着更新. SLAM技术交 ...
- visual stuido 跨解决方案调试
visual stuido 跨解决方案调试 一个解决方案是一个第三方库,另一个是单独的程序.调试的时候要同时跟踪源码.因为第三方库并没有直接使用它的源码,而是使用生成的dll,直接进行调试比较麻烦,会 ...
- 【转】 linux编程之GDB调试
GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显 ...
随机推荐
- Maven管理SSM框架的pom.xml文件配置(自己主动下载所依赖的jar包)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/25403855 <project xml ...
- vs2005 sp1 补丁的安装问题
最近做windows mobile 6.0的手机软件开发,听说用vs2005 开发的话最少得装vs2005 sp1,于是去官网上下了VS80sp1-KB926604-X86-CHS.exe 补丁 .运 ...
- RabbitMQ 概念与Java例子
RabbitMQ简介 目前RabbitMQ是AMQP 0-9-1(高级消息队列协议)的一个实现,使用Erlang语言编写,利用了Erlang的分布式特性. 概念介绍: Broker:简单来说就是消息队 ...
- js的拼接
var datatr = " <tr>"; datatr += "<td bgcolor='#EEEEEE'><input class='i ...
- [DP题]放苹果
放苹果(DP做法) 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 < ...
- C++ 内连接与外连接 (转)
啥叫内连接 外连接 我们知道编译的时候(假如编译器是VS),是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来. 简单的说,如果一些变量或函数的定义是内连 ...
- 【转】httpservlet 文章
HttpServlet类 ellisonDon 2012-10-25 12:42 阅读:2015 评论:0 HttpServlet的功能 ellisonDon 2012-10-25 11:02 ...
- JavaScript(三) - 精简
javascript 对象 1 什么是对象? 对象只是一种特殊的数据,对象拥有属性和方法. 2 对象有哪些? js中所有的事物都是对象:字符串,数值,数组,函数. js允许自定义对象.提供多个内建对象 ...
- [置顶]
caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
由于虚拟机下的Ubuntu系统一般不包含GPU,故这次安装时为了在无GUP环境下运行caffe.所以只需安装CPU版本的caffe 由于本机是window10系统,所以想尝试caffe就在自己电脑上整 ...
- 新的方法(Set<T>)实现mvc的crud
model层的属性为: public partial class UserInfo { public int Uid { get; set; } public string UName { get; ...