RGBD-SLAM学习2
今天继续关注高博最新的博客内容,在其最新发布的第二篇文章中:
http://www.cnblogs.com/gaoxiang12/p/4652478.html
经过阅读发现,在这一篇文章中讨论的内容与十四讲中第五章介绍的joinmap方法类似。然而,在十四讲中则更加复杂,并且生成了五个独立的空间点云图。整体思路较为直接无需赘述;不过在实际运行时仍存在一些技术难点需要应对。
先是报错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 ***
推测可能是缺少安装项导致的问题,并建议参考相关资料以查看该问题的具体描述及解决方案。该博客链接<>提供了类似问题的讨论内容。按照建议中的步骤安装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 ***
从报错信息来看,提示可能缺少的是vtkproj4库。建议先尝试安装一下以验证猜想是否正确。这个问题在博客中也有提及,在CMake配置文件中通常会遇到类似的问题设置解决方案:在构建时排除掉vtkproj4相关的依赖项即可解决当前遇到的问题。具体操作是在cmakelist中添加如下指令:add_command(FIND VTK_LIBRARIES)或者相应地进行修改以达到修复效果的目的。
修复这两个错误之后,在编译目录中也成功生成了generate_pointcloud可执行程序。一切正常吗?每步都有陷阱,在运行过程中遇到了问题。
point cloud size = 0
terminate called after throwing an instance of 'pcl::IOException'
what(): : [pcl::PCDWriter::writeASCII] Input point cloud has no data!
已放弃 (核心已转储)
点云数量为零让我感到困惑:程序无法正常读取RGB图像与深度图的数据;担心图片路径配置是否正确;这里的根目录具体指的是什么?究竟是工程根目录、src目录还是可执行文件generate_pointcloud所在的bin目录呢?
通过百度搜索查看相关信息:<>

具有高度清晰度:
在bin目录中运行的是一个名为generate_pointcloud的执行工具。
data目录中存储着rgb图像以及深度图。
pcd目录中存储着用于后续处理的点云数据文件。
目前的计划看起来还不错。这种结构似乎表明,在程序中读取图像和写入点云的那两个部分无法确定这两个文件夹的具体位置。

没问题,在bin目录中有一个data子目录,在这个子directory下还存在一个pointcloud.pcd file. 想要在root directory下仅添加一个名为generate_pointcloud的应用程序,并从root directory/data directory读取数据;同时将生成的点云数据存储于root directory中的pcd subdirectory下. 想到了终端环境中,默认情况下使用三个点号(...)表示上级directory. 因此建议将上述操作统一移动至parent directory进行处理:即从parent_dir路径下执行以下指令:
通过PCL库中的io模块调用savePCDFile函数,在指定路径上将点云数据保存为pointcloud.pcd文件。运行后无异常;生成的PCD文件位于指定目录中。
综上所述,在源代码目录下的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这一指令则是负责将库文件连接到后续所有新增的目标文件中进行编译链接操作,并未发现明显的错误或问题存在。
