大家好,欢迎来到IT知识分享网。
视觉SLAM十四讲——ch12的实践操作及避坑
0.实践前小知识介绍
“make -j8” 是一个 Linux 命令,意思是在编译时使用8个并行进程来加快编译速度。其中的 “-j” 参数表示并行进程数,后面的数字 “8” 表示使用 8 个进程来编译。
通过使用多个并行进程,可以同时处理多个编译任务,并且不会影响编译的正确性。这样可以大大提高编译的速度,在硬件条件允许的情况下,建议使用该参数来加快编译速度。
需要注意的是,并不是所有的编译任务都适合使用多进程并行编译,因此在使用该参数时,需要根据实际情况进行选择。同时也需要注意,如果硬件条件较差,使用过多的并行进程可能会导致编译失败或者系统卡死,因此需要根据自己的硬件条件来进行调整。
1. 实践操作前的准备工作
- 安装PCL
sudo apt-get install libpcl-dev pcl-tools
- 安装octomap
sudo apt-get install liboctomap-dev octovis
- 在终端中进入ch12文件夹下,顺序执行以下命令进行编译。
mkdir build cd build cmake .. //注意,j8还是其他主要看自己的电脑情况 make -j8
- 在build文件中进行运行。
注意: 在make过程中,会出现warning,但是对我们此实践的过程几乎没有影响。 - 下载使用的测试数据,数据是提供了一架无人机采集的单目俯视图,一共200张,同时提供了每张图像的真是位姿。下载地址为http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip
2. 实践过程
2.1 单目稠密重建
在build中执行语句:
cd dense_mono ./dense_mapping /home/fighter/slam/slambook2/ch12/test_data
运行结果:
第35次迭代图像:
//刚开始运行时的平均方差和平均误差: * loop 1 * Average squared error = 1.84285, average error: -1.12517 //迭代到199次时的平均方差和平均误差: * loop 199 * Average squared error = 0., average error: -0.00
全部结果:
read total 202 files. * loop 1 * Average squared error = 1.84285, average error: -1.12517 * loop 2 * Average squared error = 1.42146, average error: -0. * loop 3 * Average squared error = 1.05544, average error: -0.62268 * loop 4 * Average squared error = 0., average error: -0. * loop 5 * Average squared error = 0.45456, average error: -0. * loop 6 * Average squared error = 0., average error: -0. * loop 7 * Average squared error = 0., average error: -0.10006 * loop 8 * Average squared error = 0., average error: -0.0 * loop 9 * Average squared error = 0., average error: -0.0 * loop 10 * Average squared error = 0., average error: -0.0 * loop 11 * Average squared error = 0., average error: -0.0 * loop 12 * Average squared error = 0., average error: -0.0 * loop 13 * Average squared error = 0., average error: -0.0 * loop 14 * Average squared error = 0., average error: -0.0 * loop 15 * Average squared error = 0., average error: -0.0 * loop 16 * Average squared error = 0., average error: -0.0 * loop 17 * Average squared error = 0., average error: -0.0 * loop 18 * Average squared error = 0.29937, average error: -0.0 * loop 19 * Average squared error = 0., average error: -0.0 * loop 20 * Average squared error = 0., average error: -0.0 * loop 21 * Average squared error = 0., average error: -0.0 * loop 22 * Average squared error = 0., average error: -0.0 * loop 23 * Average squared error = 0., average error: -0.0 * loop 24 * Average squared error = 0., average error: -0.0 * loop 25 * Average squared error = 0., average error: -0.0 * loop 26 * Average squared error = 0., average error: -0.0 * loop 27 * Average squared error = 0., average error: -0.0 * loop 28 * Average squared error = 0., average error: -0.0 * loop 29 * Average squared error = 0., average error: -0.0 * loop 30 * Average squared error = 0., average error: -0.0 * loop 31 * Average squared error = 0., average error: -0.0 * loop 32 * Average squared error = 0., average error: -0.037996 * loop 33 * Average squared error = 0., average error: -0.0 * loop 34 * Average squared error = 0., average error: -0.0 * loop 35 * Average squared error = 0., average error: -0.0 * loop 36 * Average squared error = 0.28776, average error: -0.0 * loop 37 * Average squared error = 0., average error: -0.0 * loop 38 * Average squared error = 0., average error: -0.0 * loop 39 * Average squared error = 0., average error: -0.0 * loop 40 * Average squared error = 0., average error: -0.0 * loop 41 * Average squared error = 0., average error: -0.0 * loop 42 * Average squared error = 0., average error: -0.0 * loop 43 * Average squared error = 0., average error: -0.0 * loop 44 * Average squared error = 0.28398, average error: -0.0 * loop 45 * Average squared error = 0., average error: -0.0 * loop 46 * Average squared error = 0., average error: -0.0 * loop 47 * Average squared error = 0., average error: -0.0 * loop 48 * Average squared error = 0., average error: -0.0 * loop 49 * Average squared error = 0.28126, average error: -0.0 * loop 50 * Average squared error = 0., average error: -0.0 * loop 51 * Average squared error = 0.28026, average error: -0.0 * loop 52 * Average squared error = 0., average error: -0.0 * loop 53 * Average squared error = 0., average error: -0.0 * loop 54 * Average squared error = 0., average error: -0.0 * loop 55 * Average squared error = 0., average error: -0.0 * loop 56 * Average squared error = 0.27885, average error: -0.029586 * loop 57 * Average squared error = 0., average error: -0.0 * loop 58 * Average squared error = 0., average error: -0.029461 * loop 59 * Average squared error = 0., average error: -0.0 * loop 60 * Average squared error = 0., average error: -0.0 * loop 61 * Average squared error = 0.27807, average error: -0.0 * loop 62 * Average squared error = 0., average error: -0.0 * loop 63 * Average squared error = 0., average error: -0.0 * loop 64 * Average squared error = 0.27748, average error: -0.0 * loop 65 * Average squared error = 0., average error: -0.0 * loop 66 * Average squared error = 0., average error: -0.0 * loop 67 * Average squared error = 0., average error: -0.0 * loop 68 * Average squared error = 0., average error: -0.0 * loop 69 * Average squared error = 0., average error: -0.028626 * loop 70 * Average squared error = 0., average error: -0.0 * loop 71 * Average squared error = 0.27639, average error: -0.0 * loop 72 * Average squared error = 0., average error: -0.0 * loop 73 * Average squared error = 0., average error: -0.0 * loop 74 * Average squared error = 0., average error: -0.0 * loop 75 * Average squared error = 0., average error: -0.0 * loop 76 * Average squared error = 0., average error: -0.027981 * loop 77 * Average squared error = 0., average error: -0.0 * loop 78 * Average squared error = 0., average error: -0.0 * loop 79 * Average squared error = 0., average error: -0.0 * loop 80 * Average squared error = 0., average error: -0.0 * loop 81 * Average squared error = 0., average error: -0.0 * loop 82 * Average squared error = 0., average error: -0.0 * loop 83 * Average squared error = 0., average error: -0.0 * loop 84 * Average squared error = 0., average error: -0.0 * loop 85 * Average squared error = 0., average error: -0.0 * loop 86 * Average squared error = 0., average error: -0.0 * loop 87 * Average squared error = 0., average error: -0.0 * loop 88 * Average squared error = 0., average error: -0.0 * loop 89 * Average squared error = 0., average error: -0.0 * loop 90 * Average squared error = 0., average error: -0.0 * loop 91 * Average squared error = 0., average error: -0.0 * loop 92 * Average squared error = 0., average error: -0.0 * loop 93 * Average squared error = 0., average error: -0.0 * loop 94 * Average squared error = 0., average error: -0.0 * loop 95 * Average squared error = 0.2659, average error: -0.0 * loop 96 * Average squared error = 0., average error: -0.0 * loop 97 * Average squared error = 0., average error: -0.0 * loop 98 * Average squared error = 0., average error: -0.0 * loop 99 * Average squared error = 0., average error: -0.0 * loop 100 * Average squared error = 0., average error: -0.0 * loop 101 * Average squared error = 0.26283, average error: -0.0 * loop 102 * Average squared error = 0., average error: -0.0 * loop 103 * Average squared error = 0., average error: -0.0 * loop 104 * Average squared error = 0., average error: -0.0 * loop 105 * Average squared error = 0., average error: -0.0 * loop 106 * Average squared error = 0., average error: -0.0 * loop 107 * * loop 108 * Average squared error = 0., average error: -0.0 * loop 109 * Average squared error = 0., average error: -0.0 * loop 110 * Average squared error = 0., average error: -0.0 * loop 111 * Average squared error = 0., average error: -0.0 * loop 112 * Average squared error = 0.25991, average error: -0.0 * loop 113 * Average squared error = 0., average error: -0.0 * loop 114 * Average squared error = 0., average error: -0.0 * loop 115 * Average squared error = 0., average error: -0.0 * loop 116 * Average squared error = 0., average error: -0.0 * loop 117 * Average squared error = 0., average error: -0.0 * loop 118 * Average squared error = 0., average error: -0.0 * loop 119 * Average squared error = 0., average error: -0.010738 * loop 120 * Average squared error = 0.25748, average error: -0.0 * loop 121 * Average squared error = 0., average error: -0.0 * loop 122 * Average squared error = 0., average error: -0.00 * loop 123 * Average squared error = 0., average error: -0.00 * loop 124 * Average squared error = 0., average error: -0.00 * loop 125 * Average squared error = 0., average error: -0.00 * loop 126 * Average squared error = 0., average error: -0.00 * loop 127 * Average squared error = 0., average error: -0.00 * loop 128 * Average squared error = 0., average error: -0.00 * loop 129 * Average squared error = 0., average error: -0.00 * loop 130 * Average squared error = 0., average error: -0.0082551 * loop 131 * Average squared error = 0.25535, average error: -0.00 * loop 132 * Average squared error = 0.25532, average error: -0.0082309 * loop 133 * Average squared error = 0., average error: -0.00 * loop 134 * Average squared error = 0., average error: -0.0082109 * loop 135 * Average squared error = 0., average error: -0.00 * loop 136 * Average squared error = 0., average error: -0.00 * loop 137 * Average squared error = 0., average error: -0.00 * loop 138 * Average squared error = 0., average error: -0.00 * loop 139 * Average squared error = 0., average error: -0.00 * loop 140 * Average squared error = 0., average error: -0.00 * loop 141 * Average squared error = 0.25507, average error: -0.00 * loop 142 * Average squared error = 0., average error: -0.00 * loop 143 * Average squared error = 0.25494, average error: -0.00 * loop 144 * Average squared error = 0., average error: -0.00 * loop 145 * Average squared error = 0., average error: -0.0080535 * loop 146 * Average squared error = 0., average error: -0.00 * loop 147 * Average squared error = 0., average error: -0.00 * loop 148 * Average squared error = 0., average error: -0.00 * loop 149 * Average squared error = 0.2548, average error: -0.0079941 * loop 150 * Average squared error = 0., average error: -0.00 * loop 151 * Average squared error = 0., average error: -0.00 * loop 152 * Average squared error = 0., average error: -0.0079654 * loop 153 * Average squared error = 0., average error: -0.00 * loop 154 * Average squared error = 0., average error: -0.0079408 * loop 155 * Average squared error = 0., average error: -0.0079139 * loop 156 * Average squared error = 0., average error: -0.00 * loop 157 * Average squared error = 0., average error: -0.00 * loop 158 * Average squared error = 0., average error: -0.00 * loop 159 * Average squared error = 0., average error: -0.0076815 * loop 160 * Average squared error = 0., average error: -0.00 * loop 161 * Average squared error = 0., average error: -0.00 * loop 162 * Average squared error = 0., average error: -0.00 * loop 163 * Average squared error = 0., average error: -0.00 * loop 164 * Average squared error = 0., average error: -0.00 * loop 165 * Average squared error = 0., average error: -0.00 * loop 166 * Average squared error = 0., average error: -0.00 * loop 167 * Average squared error = 0., average error: -0.00 * loop 168 * Average squared error = 0., average error: -0.00 * loop 169 * Average squared error = 0., average error: -0.00 * loop 170 * Average squared error = 0., average error: -0.0072775 * loop 171 * Average squared error = 0., average error: -0.00 * loop 172 * Average squared error = 0.25347, average error: -0.00 * loop 173 * Average squared error = 0., average error: -0.00 * loop 174 * Average squared error = 0., average error: -0.00 * loop 175 * Average squared error = 0., average error: -0.00 * loop 176 * Average squared error = 0., average error: -0.00 * loop 177 * Average squared error = 0.25335, average error: -0.00 * loop 178 * Average squared error = 0., average error: -0.00 * loop 179 * Average squared error = 0., average error: -0.00 * loop 180 * Average squared error = 0., average error: -0.0072366 * loop 181 * Average squared error = 0., average error: -0.0072361 * loop 182 * Average squared error = 0., average error: -0.00 * loop 183 * Average squared error = 0., average error: -0.00 * loop 184 * Average squared error = 0., average error: -0.00 * loop 185 * Average squared error = 0., average error: -0.00 * loop 186 * Average squared error = 0., average error: -0.00 * loop 187 * Average squared error = 0., average error: -0.00 * loop 188 * Average squared error = 0., average error: -0.00 * loop 189 * Average squared error = 0., average error: -0.00 * loop 190 * Average squared error = 0., average error: -0.00 * loop 191 * Average squared error = 0., average error: -0.00 * loop 192 * Average squared error = 0., average error: -0.00 * loop 193 * Average squared error = 0., average error: -0.00 * loop 194 * Average squared error = 0., average error: -0.00 * loop 195 * Average squared error = 0., average error: -0.00 * loop 196 * Average squared error = 0., average error: -0.00 * loop 197 * Average squared error = 0.25348, average error: -0.00 * loop 198 * Average squared error = 0., average error: -0.00 * loop 199 * Average squared error = 0., average error: -0.00
可以看出前10次效果显著,10次时候速度下降。
2.2 RGB-D稠密建图
- RGB-D稠密建图是一种利用RGB图像和深度图像进行三维重建的技术。与传统的基于三角化的稀疏重建方法不同,RGB-D稠密建图可以生成全局一致的稠密三维模型,包括物体的细节和形状。该技术已广泛应用于机器人导航、虚拟现实、增强现实和医疗领域等。
- RGB-D稠密建图的基本流程包括:采集RGB和深度图像、点云生成、稠密重建和纹理映射。其中,点云生成是将RGB图像和深度图像转换为三维点云数据,稠密重建是将点云数据转换为三维模型,纹理映射则是将RGB图像映射到三维模型表面,使得模型具有真实感和逼真度。
- RGB-D稠密建图的优点是可以快速地生成高质量的三维模型,并且可以捕捉物体的表面细节和形态信息。不过,由于对图像质量和标定精度要求较高,该技术在实际应用中还需要进一步的改进和完善。
2.3 点云地图
在build中执行语句:
cd dense_RGBD ./pointcloud_mapping
运行结果:
正在将图像转换为点云... 转换图像中: 1 转换图像中: 2 转换图像中: 3 转换图像中: 4 转换图像中: 5 点云共有个点. 滤波之后,点云共有31876个点.
同时生成一个map.pcd文件,此文件的位置在:
/home/fighter/slam/slambook2/ch12/build/dense_RGBD/ map.pcd
可以用通过以下命令来查看map.pcd文件:
pcl_viewer map.pcd
The viewer window provides interactive commands; for help, press 'h' or 'H' from within the window. > Loading map.pcd [PCLVisualizer::setUseVbos] Has no effect when OpenGL version is ≥ 2 [done, 378.775 ms : 31876 points] Available dimensions: x y z rgb
2.4 从点云重建网格
在build中执行语句:
cd dense_RGBD ./surfel_mapping map.pcd
运行结果:
结果时从点云重建得到的表面和网格模型,图像如下
同时终端输出信息:
point cloud loaded, points: 31876 computing normals ... computing mesh ... display mesh ...
2.5 八叉树地图
在build中执行语句:
cd dense_RGBD ./octomap_mapping
运行结果:
终端输出:
正在将图像转换为 Octomap ... 转换图像中: 1 转换图像中: 2 转换图像中: 3 转换图像中: 4 转换图像中: 5 saving octomap ... Writing nodes to output stream... done.
运行生成文件octomap.bt,使用以下命令来查看文件:
octovis octomap.bt
终端输出:
Reading binary octree type OcTree
3. 遇到的问题及解决办法
3.1 cmake …时,出现opencv版本问题
出现的错误:
CMake Error at dense_mono/CMakeLists.txt:11 (find_package): Could not find a configuration file for package "OpenCV" that is compatible with requested version "3.1". The following configuration files were considered but not accepted: /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.0 /usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0 /lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0
原因:
CMakeLists.txt中,设置的opencv的版本有问题;
出现此种问题主要是代码中的opencv的版本和自己当前安装的版本不同。
解决办法:
直接和之前的解决办法一样,更改CMakeLists.txt文件中的opencv版本即可。
//更改前: find_package(OpenCV 3 REQUIRED) //更改后: find_package(OpenCV REQUIRED)
3.2 make -j8时,出现一些错误,有关PCL和opencv版本的问题。
- 出现的问题:
未定义标识符 “CV_GRAY2BGR”
原因:
这是因为此语句和opencv版本不相同。
解决办法:
更改dense_mapping.cpp头文件,添加以下头文件:
//添加头文件 #include <opencv2/imgproc/types_c.h>
有关opencv版本和语句问题的报错的锦集可以参考文章:视觉SLAM十四讲——ch12实践(建图)
- 出现的问题:
出现的问题:
在make时,出现了刷屏的红色错误,这里展示两段:
/usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above 7 | #error PCL requires C++14 or above | ^~~~~ In file included from /usr/include/pcl-1.10/pcl/pcl_macros.h:77, from /usr/include/pcl-1.10/pcl/point_types.h:42, from /home/fighter/slam/slambook2/ch12/dense_RGBD/pointcloud_mapping.cpp:10: /usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above 7 | #error PCL requires C++14 or above | ^~~~~ In file included from /usr/include/pcl-1.10/pcl/console/print.h:44, from /usr/include/pcl-1.10/pcl/conversions.h:53, from /usr/include/pcl-1.10/pcl/common/io.h:48, from /usr/include/pcl-1.10/pcl/io/file_io.h:41, from /usr/include/pcl-1.10/pcl/io/pcd_io.h:44, from /home/fighter/slam/slambook2/ch12/dense_RGBD/surfel_mapping.cpp:7: /usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above 7 | #error PCL requires C++14 or above | ^~~~~ In file included from /usr/include/pcl-1.10/pcl/console/print.h:44, from /usr/include/pcl-1.10/pcl/conversions.h:53, from /usr/include/pcl-1.10/pcl/common/io.h:48, from /usr/include/pcl-1.10/pcl/io/file_io.h:41, from /usr/include/pcl-1.10/pcl/io/pcd_io.h:44, from /home/fighter/slam/slambook2/ch12/dense_RGBD/pointcloud_mapping.cpp:11: /usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above 7 | #error PCL requires C++14 or above | ^~~~~
原因:
最主要的原因时因为C++版本的问题
解决办法:
将含有C++版本设置语句的CMakeLists.txt文件中有关其版本,全部改为14以上。
然后,make时会出现部分警告,当时不影响程序结果。
3.3 cmake …时,会出现vtk的问题,
出现的问题:
The imported target "vtkRenderingPythonTkWidgets" references the file "/usr/lib/x86_64-linux-gnu/libvtkRenderingPythonTkWidgets.so" but this file does not exist. Possible reasons include: * The file was deleted, renamed, or moved to another location. * An install or uninstall procedure did not complete successfully. * The installation package was faulty and contained "/usr/lib/cmake/vtk-7.1/VTKTargets.cmake" but not all the files it references. -- The imported target "pvtk" references the file "/usr/bin/pvtk" but this file does not exist. Possible reasons include: * The file was deleted, renamed, or moved to another location. * An install or uninstall procedure did not complete successfully. * The installation package was faulty and contained "/usr/lib/cmake/vtk-7.1/VTKTargets.cmake" but not all the files it references.
解决办法:
创建两个软链接:
第一个软链接:
sudo ln -s /usr/lib/python2.7/dist-packages/vtk/libvtkRenderingPythonTkWidgets.x86_64-linux-gnu.so /usr/lib/x86_64-linux-gnu/libvtkRenderingPythonTkWidgets.so
第二个软链接:
sudo ln -s /usr/bin/vtk7 /usr/bin/vtk
3.4 运行 ./dense_mapping /home/fighter/slam/slambook2/ch12/test_data时,出现段错误
出现的错误:
./dense_mapping /home/fighter/slam/slambook2/ch12/test_data read total 202 files. * loop 1 * Segmentation fault
原因:
Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。如最近的势能图代码中的链表操作,对链表的新增和释放包括赋值等等,如出现不当操作都有可能造成程序崩溃。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。
解决办法:
将文件dense_mapping.cpp中update函数为定义为bool类型,但是没有返回值,可以改为void。
更改前,例其中一处:
更改后,例其中一处:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117819.html







