RGBD-SLAM学习2

版权声明:学习记录~ https://blog.csdn.net/robinhjwy/article/details/79193247

今天继续跟着高博的博客学习,到了第二篇:
http://www.cnblogs.com/gaoxiang12/p/4652478.html
其实看下来,第二篇跟十四讲中的第五章的joinmap差不多,区别就是十四讲上的还要复杂一些,生成了五张点云图。而这里只是将一张RGB图和一张depth图合成一个点云,输出pcd文件。逻辑很简单,不多说了。但是跑的时候,还是有软件的坑。。。

先是报错No rule libproj.so问题:

make[2]: *** No rule to make target '/usr/lib/x86_64-linux-gnu/libproj.so', needed by 'joinMap'.  Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/joinMap.dir/all' failed
make[1]: *** [CMakeFiles/joinMap.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

*** Failure: Exit code 2 ***

猜测是缺少安装项的问题,百度,找到下面博客,一样的问题,只不过是跑的十四讲里第五章的程序:
http://blog.csdn.net/danmeng8068/article/details/77341532
按照博客所说的安装libproj-dev:

sudo apt-get install libproj-dev

果然,编译链接没有这个错误了,出现了新的错误。。。

-- Build files have been written to: /home/wd/code/slambook-master/ch5/joinMap/build
[ 50%] Linking CXX executable joinMap
/usr/bin/ld: cannot find -lvtkproj4
collect2: error: ld returned 1 exit status
CMakeFiles/joinMap.dir/build.make:349: recipe for target 'joinMap' failed
make[2]: *** [joinMap] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/joinMap.dir/all' failed
make[1]: *** [CMakeFiles/joinMap.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
*** Failure: Exit code 2 ***

由报错内容看,感觉像是缺少lvtkproj4,因为:cannot find -lvtkproj4 本来要安装一下看看,好在上方博客说的第二个问题就是此问题,大概原因是需要在cmakelist中加一条指令,对pcl进行修复。照做,更改cmakelist,在add_executable语句前面加上list(REMOVE_ITEM PCL_LIBRARIES “vtkproj4”)。语句内容上看是将PCL_LIBRARIES库列表中的”vtkproj4”移除掉。

上面两个错误修复后,编译链接没有问题,在bin当中也生成了generate_pointcloud可执行程序。OK,一步一坑,在运行的时候出现错误了:

point cloud size = 0
terminate called after throwing an instance of 'pcl::IOException'
  what():  : [pcl::PCDWriter::writeASCII] Input point cloud has no data!
已放弃 (核心已转储)

点云数量为0,感觉像是没读到rgb图和depth图的数据啊,又不确定程序中读取两张图片时的路径写法:
rgb = cv::imread( "./data/rgb.png" );
depth = cv::imread( "./data/depth.pgm", -1 );
中的根目录. 是指的什么意思。
到底是工程根目录还是,src目录还是可执行文件generate_pointcloud所在的bin目录。

百度一下看看:
http://blog.csdn.net/wuliyanyan/article/details/55515034
果然有,发现就是data数据采集路径的问题。
先看一下本来我设定的文件结构和路径:
这里写图片描述
很清晰明了:
bin中有生成的可执行程序generate_pointcloud。
data中是存放rgb图像和depth图像的。
pcd存放输出的点云文件。

计划挺好,这种结构貌似程序中的读图像和写点云的那两句并不能定位到这两个文件夹的位置。。。
先改成最原始的试试看,到底是不是因为路径读写问题导致的报错。
将data文件夹copy到bin中,运行~
发现没问题!!!
这里写图片描述
没毛病,bin中有data文件夹,然后输出的pointcloud.pcd文件也在bin文件夹中。
如何让bin中只有generate_pointcloud可执行文件,然后读取到根目录data下的数据,并将输出的点云存到根目录下的pcd文件夹中呢?!
想到终端中的..表示上层文件夹,所以将读取和输出那两句更改一下,都更改到上层文件夹操作:
rgb = cv::imread( "../data/rgb.png" );
depth = cv::imread( "../data/depth.pgm", -1 );

pcl::io::savePCDFile( "../pcd/pointcloud.pcd", *cloud );
运行发现没问题~~输出的pcd文件在pcd文件夹中。

最后,说一下src中的CMakeList.txt,根目录中的CMakeList.txt没啥好说的,跟第一篇一样,没做改动。

# 增加opencv库依赖
FIND_PACKAGE( OpenCV REQUIRED )
INCLUDE_DIRECTORIES( ${OpenCV_INCLUDE_DIRS} )

# 增加PCL库依赖
FIND_PACKAGE( PCL REQUIRED COMPONENTS common io )
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
#ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
#LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

# 增加可执行程序,并将其链接到依赖库上
list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")
ADD_EXECUTABLE( generate_pointcloud generatePointCloud.cpp )
TARGET_LINK_LIBRARIES( generate_pointcloud ${OpenCV_LIBS} ${PCL_LIBRARIES} )

高博博客中不是这样写的,我参照十四讲中第五章又做的整理和改动。主要不理解的在这两句:

ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

cmake手册中对ADD_DEFINITIONS的解释:
这里写图片描述
cmake手册中对link_libraries的解释:
这里写图片描述

说实话没怎么看懂,大概知道ADD_DEFINITIONS是增加定义,猜测可能是将PLC的一些定义添加进来,link_libraries是将库链接到后方所有添加的targets上。
并且我参照十四讲第五章的cmakelists的写法,将这两句注释掉,编译连接运行也没有任何的毛病。。。

猜你喜欢

转载自blog.csdn.net/robinhjwy/article/details/79193247