SurfelMeshing
源代码: https://github.com/puzzlepaint/surfelmeshing
数据集: https://vision.in.tum.de/data/datasets/rgbd-dataset/download
参考教程: https://www.cnblogs.com/Ker-win/p/14864883.html
第一步,下载代码,编译
一.安装依赖
1. cuda
要求CUDA (8, 10.1)
查看版本:nvcc -V
nvcc: NVIDIA ® Cuda compiler driver
Copyright © 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
但编译的时候遇到问题,说找不到cuda,看CMakeError.log如下
The CUDA compiler
“/usr/local/cuda-8.0/bin/nvcc”
is not able to compile a simple test program.
于是找了测试CUDA的samples
cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery
sudo make
sudo ./deviceQuery
输出如下,发现driver version是11.4的,runtime version是8.0的
Detected 1 CUDA Capable device(s)
Device 0: “NVIDIA GeForce MX350”
CUDA Driver Version / Runtime Version 11.4 / 8.0
CUDA Capability Major/Minor version number: 6.1
通过nvidia-smi
命令看版本,也是11.4,这里是driver version
CUDA Version: 11.4
不知道什么问题,可能自己的显卡不支持,换了服务器电脑,也是8.0版本的,就没问题
后期补充:
是CMakeLists里这一段报错
if (CMAKE_CUDA_COMPILER)
enable_language(CUDA)
# Enable C++11 globally for CUDA code
if(NOT DEFINED CMAKE_CUDA_STANDARD)
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()
else()
message(FATAL_ERROR "CMake did not find CUDA, which is required to build this program.")
endif()
也就是CMAKE_CUDA_COMPILER有问题,于是在这句前面加了一句指令指明nvcc位置
set(CMAKE_CUDA_COMPILER /usr/local/cuda-10.1/bin/nvcc)
就可以了.(备注:我自己电脑有两个cuda版本,8.0和10.1, github上写这俩都行,但我8.0还是会报错,报错内容如下,和之前log里写的一样,10.1就ok)
CMake Error at /usr/local/share/cmake-3.21/Modules/CMakeTestCUDACompiler.cmake:56 (message):
The CUDA compiler
"/usr/local/cuda-8.0/bin/nvcc"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: /home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make -f Makefile cmTC_a1200/fast && /usr/bin/make -f CMakeFiles/cmTC_a1200.dir/build.make CMakeFiles/cmTC_a1200.dir/build
make[1]: 进入目录“/home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp”
Building CUDA object CMakeFiles/cmTC_a1200.dir/main.cu.o
/usr/local/cuda-8.0/bin/nvcc -arch=sm_61 -c /home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp/main.cu -o CMakeFiles/cmTC_a1200.dir/main.cu.o
In file included from /usr/local/cuda-8.0/bin/..//include/cuda_runtime.h:78:0,
from <command-line>:0:
/usr/local/cuda-8.0/bin/..//include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
#error -- unsupported GNU version! gcc versions later than 5 are not supported!
^~~~~
CMakeFiles/cmTC_a1200.dir/build.make:77: recipe for target 'CMakeFiles/cmTC_a1200.dir/main.cu.o' failed
make[1]: *** [CMakeFiles/cmTC_a1200.dir/main.cu.o] Error 1
make[1]: 离开目录“/home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp”
Makefile:127: recipe for target 'cmTC_a1200/fast' failed
make: *** [cmTC_a1200/fast] Error 2
CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:37 (enable_language)
2.Boost
这里包括下面都是通过编译的时候提示缺啥库,再一个个安
好用的搜库指令:aptitude search boost
, apt-cache search glew
boost库有很多,网上有教程说用 sudo apt-get install libboost-all-dev
不过我这只缺serialization1.65.1,所以就sudo apt-get install libboost-serialization1.65.1
3.Eigen
sudo apt-get install libeigen3-dev
最低要求2.91.0,矩阵库
4. opengl
sudo apt-get install libopengl0
(好像不对)
sudo apt-get install libgl1-mesa-dev
5.GLEW
sudo apt-get install libglew-dev
,opengl扩展
6. qt5
sudo apt-get install qt5-default
sudo apt-get install libqt5x11extras5 (可能不用)
sudo apt-get install libqt5x11extras5-dev
二. 编译
编译时如果电脑有装anaconda,要将bashrc里的anaconda注释掉,并将anaconda文件夹改个名字,防止path覆盖问题.
另外github给的编译命令里有个cuda架构,查询自己gpu对应的架构:
https://en.m.wikipedia.org/wiki/CUDA
比如mx350是6.1,设置为sm_61即可
build成功之后记得make生成可执行文件…
第二步, 运行
运行时cuda11.3报错如下
Stack trace:
29 0x561454efb28a _start + 42
28 0x7f28cfa97bf7 __libc_start_main + 231
27 0x561454efafbd main + 109
26 0x561454f85ba8 vis::WrapQtEventLoopAround(std::function<int (int, char**)>, int, char**) + 184
25 0x7f28d1062984 QCoreApplication::exec() + 148
24 0x7f28d10598da QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag) + 314
23 0x7f28d10b485f QEventDispatcherGlib::processEvents(QFlagsQEventLoop::ProcessEventsFlag) + 95
22 0x7f28ce39f7fc g_main_context_iteration + 44
21 0x7f28ce39f770 /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x4c770) [0x7f28ce39f770]
20 0x7f28ce39f537 g_main_context_dispatch + 743
19 0x7f28d10b5233 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5(+0x2e4233) [0x7f28d10b5233]
18 0x7f28d105e01d QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) + 493
17 0x7f28d105b8a8 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 280
16 0x7f28d2026104 QApplication::notify(QObject*, QEvent*) + 676
15 0x7f28d201e83c QApplicationPrivate::notify_helper(QObject*, QEvent*) + 156
14 0x7f28d2170bcb QMainWindow::event(QEvent*) + 347
13 0x7f28d205d1a8 QWidget::event(QEvent*) + 872
12 0x7f28d204567f QWidgetPrivate::syncBackingStore() + 79
11 0x7f28d202e0a5 /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5(+0x1640a5) [0x7f28d202e0a5]
10 0x7f28d202d714 /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5(+0x163714) [0x7f28d202d714]
9 0x7f28d205618a QWidgetPrivate::sendPaintEvent(QRegion const&) + 58
8 0x7f28d105b8a8 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 280
7 0x7f28d2026104 QApplication::notify(QObject*, QEvent*) + 676
6 0x7f28d201e83c QApplicationPrivate::notify_helper(QObject*, QEvent*) + 156
5 0x7f28d205d038 QWidget::event(QEvent*) + 504
4 0x7f28d207d86d /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5(+0x1b386d) [0x7f28d207d86d]
3 0x561454f86da2 vis::RenderWidgetOpenGL::paintGL() + 834
2 0x561454f50605 vis::SurfelMeshingRenderWindow::Render() + 2165
1 0x561454f4fc7b vis::SurfelMeshingRenderWindow::InitializeForCUDAInteropInRenderingThread() + 1003
0 0x7f28d2786cb3 loguru::StreamLogger::~StreamLogger() + 109
21:13:58.975 surfel_meshing_render_w:677 FATL| Cuda Error: unknown error
正常效果如下,使用rgbd_dataset_freiburg1_xyz数据集, 其中follow_input_camera false就是建的图不动相机动,如果true或者不加的话就是以相机视角为第一视角建图.
如果遇到显存不够的问题,加上--max_surfel_count 10000000
,默认20000000
19:39:23.024 cuda_buffer_inl.h:40 FATL| Cuda Error: out of memory
已放弃 (核心已转储)
./build_RelWithDebInfo/applications/surfel_meshing/SurfelMeshing ./rgbd_dataset_freiburg1_xyz/ groundtruth.txt --follow_input_camera false --max_surfel_count 10000000
PUMA
源代码:https://github.com/PRBonn/puma
第一步,Installation
选择非docker方法,按照github上的Installation Instructions安装
Open3D
运行作者准备好的脚本bash 3rdparty/Open3D.sh
,这个脚本的目的是帮你clone他使用的open3d的代码,安装open3d需要的依赖并编译,猜测和自己clone一下open3d的代码然后编译效果一样(大致,这个脚本还有一个打补丁)
遇到的问题
- 脚本里有一句下面这句话,这里在克隆open3d的时候用了克隆所有submodule的参数,导致我以为有submodule,于是就想用git方式下载而非直接下zip,但我git不行,于是按上面的方法配置代理,最后发现其实没有submodule,直接下zip也行.(在.git/config里有写)
git clone --depth 1 --recurse-submodules
https://github.com/nachovizzo/Open3D.git /tmp/Open3D -b nacho/generalized_icp &&
cd /tmp/Open3D/
- 当我git失败,手动下载之后,运行这个bash,说找不到文件,以为是我放的位置不对,要放在puma工作路径下,最后发现还是因为上面git那句话,最后有个cd切换工作路径,而因为该路径下已经有我粘过去的文件,cd命令没有执行,导致工作路径不对.自己加一句cd就好了
3rdparty/Open3D.sh: 第 76 行: cd: 3rdparty/PoissonRecon/PoissonRecon/: 没有那个文件或目录
+ sed -i s/sudo// util/install_deps_ubuntu.sh
sed: 无法读取 util/install_deps_ubuntu.sh: 没有那个文件或目录
- 同样也是跳过了那句话,但我自己在/tmp/Open3D/路径下补了PoissonRecon这个包,于是执行到了后面的打补丁环节,但由于种种原因并不打的上补丁,还不知道为啥
error: 打补丁失败:Src/FEMTree.Initialize.inl:190
error: Src/FEMTree.Initialize.inl:补丁未应用
error: 打补丁失败:Src/FEMTree.IsoSurface.specialized.inl:1855
error: Src/FEMTree.IsoSurface.specialized.inl:补丁未应用
- 使用git代理按照脚本克隆好了代码,但因为后面几句还是没通过,所以得重新跑,那么就需要补充cd那句.补充之后虽然还是找不到PoissonRecon(可能得自己粘一下),但可以运行到后面的安装和编译了,安装没问题,编译时有cmake版本的问题(安装依赖没问题后下一次可以把那句话注了这样快一点)
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.19 or higher is required. You are running version 3.10.2
把cmakelist里的版本要求从3.19改为3.10是不行的,里面有旧版本不支持的东西,只能升级cmake
cmake下载链接:https://cmake.org/download/#latest
官方安装教程:https://cmake.org/install/#download-verification
这里采用源码安装,装在usr/local下,装的当前最新版
tar zxvf cmake-3.21.3.tar.gz
sudo mv cmake-3.21.3 /下载路径 /usr/local
cmake . 或 cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
make
make install
采用cmake --version检测是否更新
注意:据说如果用 cmake 编译过 ros ,执行autoremove cmake会把之前用 cmake 编译过的包都删掉.另外,不需要用软链接
-
在4的时候其实还有一个权限不够的错误,看了下是有几个命令需要sudo权限,于是我就赋予了这个脚本777的权限并用sudo ./Open3D.sh运行就好了
-
因为系统默认python2,找不到python3路径,在bashrc里加以下两句,不知道哪句有用
export PATH=/usr/bin/python3.6:$PATH export
PYTHONPATH=/usr/bin/python3.6:$PYTHONPATH
- 编译的时候要在github上下载很多包,但又下载不下来,就按照他的提示,缺啥自己下然后放进去,如果终端没有链接,就去对应的cmake文件里找.我整理了一份全都下载好的.
如果想把全都下好的拷出来,注意先把sh脚本里最后一句删除去掉,否则编译成功之后就直接删除了.
Embree
没啥问题,同样要赋予sudo权限运行
puma
第一句成功了,第二句不行,说No module named pybind11.setup_helpers
,这是因为pip默认的python2,故pybind11装到python2里了.pybind11是python调用cpp文件的,故一定要装.建议使用alternatives工具直接更换默认python版本,详见我的博客–三. 安装篇.
第二句一定要运行,这里包括编译拓展的cpp库和安装其他python库,使用了主目录的setup.config和setup.py两个文件.关于这句话的具体意思见https://pip.pypa.io/en/stable/cli/pip_install/
pip install pybind11
pip install --user .
第二步, Converting from .bin to .ply
因为没采用装docker的方式,因此指定dataset路径和build docker container都不需要做了.其他的docker命令都改为正常运行python代码就好
这里注意他要求的文件路径,如果有缺库的话说明前面pip install --user .
没装好
第三步, Running the puma pipeline
python3 '/home/dudu/puma/apps/pipelines/slam/puma_pipeline.py' --dataset ./data/mai_city/ply --sequence 00 --n_scans 40
不知道这里–n_scan填多少应该怎么看
报错
No module named ‘puma.cpp.normal_map’
这个就是那个cpp库,pybind11需要编写setup.py,但如果手动运行这个python文件还是会报错,因此还是需要按照pip install --user .
来.如果成功的话就可以正常运行
关于pybind11详见官方文档:https://pybind11.readthedocs.io/en/stable/basics.html#compiling-the-test-cases
第四步,可视化
下载open3d:http://www.open3d.org/,选deb包然后dpkg就行
缺libglfw3包,用sudo apt-get install libglfw3安装,如果找不到该软件包的话就先update一下.
打开:Open3D