DXSLAM环境的点点滴滴
这里记录配置DXSLAM环境的点点滴滴
配置该代码环境有两种方法
方法一:利用docker
该方法主要先pull调用tf1.13.1版本,然后配置普通的ORBSLAM2的环境。
但是这里配置的时候,遇到两个问题:
一是docker中的jupyter端口似乎被占用,怎么弄都弄不好。虽然可以用其他的编译器,但是从宿主机调用docker服务端运行代码还是用有很多问题。
二是容器中编译opencv的时候会报一个错误,主要是因为需要去公网下载文件,但是在宿主机上就不需联网下载,猜测可能因为docker镜像版本有些旧的原因吧
综上所素:第一种方法虽然方便,但是中间有问题,就不得不放弃(如果能挂公网,那确实挺好的)
方法二:直接配置
选用的ubuntu版本是16,装系统+配置无线模块可以参考我的这篇博客
https://blog.youkuaiyun.com/y18855021710/article/details/127789430?spm=1001.2014.3001.5502
编译该代码主要参考的是这位大佬的
https://blog.youkuaiyun.com/weixin_39977764/article/details/122453967
但是大佬有些配置在ubuntu16中有一些小bug,我会一一指出
配置流程
1 配置ORB_SLAM2环境
2 配置tf环境
3 配置DXSLAM环境
我是一个分割线
1 配置ORBSLAM2环境
1.1ORB_SLAM2配置
配置环境主要是参考github源码来配置的
https://github.com/raulmur/ORB_SLAM2
值得注意的是,代码中的opencv版本要求不高,但是听配置DXSLAM的大佬说Pangolin是个毒瘤,只能用ORB_SLAM2代码推荐的Pangolin那个链接。而且配置Pangolin要升级cmake(3.10以上)
1-如果你下载cmake,解压阅读readme发现里面有编译的步骤(就不细说了)
但是一定最后要重复一遍sudo make install(提升权限安装)
2-参考博客
https://blog.youkuaiyun.com/weixin_41010198/article/details/109343347
照着上面博客的话:如果出现问题 *** No rule to make target ‘/usr/lib/x86_64-linux-gnu/libGL.so’, needed by ‘src/libpangolin.so’。 停止。
备注:查找命令sudo find / -iname “libGL.so”
https://blog.youkuaiyun.com/txy12029047/article/details/104036729
https://blog.youkuaiyun.com/sinat_28752257/article/details/100167109
简单来说是因为你装驱动或者内核,把原本的链接关系破坏了,所以要重新链接libGL.so
这里不理解为什么要sudo ln -s /usr/lib/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so
(这里还是使用了0.5版本)
1.2测试单目并处理RGBD的数据集
按照github配置好了之后,可以参考这篇博客进行测试以及处理数据集。
https://blog.youkuaiyun.com/creative1/article/details/122088612
(备注:RGBD需要看下面2.2来处理数据集)
2 配置tf环境
2.1 配置anaconda以及tf1.13
首先,因为笔记本装系统的时候直接就装显卡驱动了,所以这个时候cuda显示的是11版本。值得庆幸的是安装anaconda后面能够直接换源配置tf1.13旧版本(似乎利用conda装cuda10版本不会替换?)。
这里建议下载Anaconda3-2020.07-Linux-x86_64.sh
如果其中numpy版本报错,建议先卸载numpy然后再安装numpy1.6.5
pip uninstall numpy
pip install numpy==1.16.5
可以参考博客配置
https://blog.youkuaiyun.com/qq_34904125/article/details/118418839
环境配置
sudo vim ~/.bashrc
export PATH=/home/你的名字/anaconda3/bin:$PATH
source ~/.bashrc
配置结束
激活
source activate
环境
conda create -n tf1.13 python=3.7
conda activate tf1.13
conda install tensorflow-gpu=1.13.1
测试
python
import tensorflow as tf
tf.test.is_gpu_available()
2.2 借用tf的虚拟环境处理RGBD数据集
上面1.2提到RGBD需要处理数据集,这里需要激活虚拟环境,然后按照1.2关于RGBD部分进行配置相关文件,如果报错:AttributeError: ‘dict_keys‘ object has no attribute ‘remove‘参考
https://blog.youkuaiyun.com/qin_liang/article/details/126860883
2.3 配置ROS(可选)
接下来需要配置ROS(如果不想跑实时就可以不弄)
鱼香ROS一键安装
wget http://fishros.com/install -O fishros && bash fishros
如果你装了ROS,就会发现会报一个错误(应该是后面编译DXSLA的代码某个部分import cv2的时候报错)不装ROS就应该不会出现这个问题。
也有可能没装pip install opencv-python
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
简单来说就是低版本ROS会影响环境中的opencv查找,解决就是申明外部还有opencv环境
https://blog.youkuaiyun.com/weixin_42314494/article/details/114686723
要注意的是,需要进入anaconda的虚拟环境进行刷新环境!不然还会出现这个bug
备注:理论上2代的环境能够直接给ORBSLAM3使用,如果配置环境出现:fatal error: openssl/md5.h: 没有那个文件或目录compilation terminated.
sudo apt-get install libssl-dev
3 配置DXSLAM环境
3.1 相关文件处理
首先需要从ORB_SLAM2中单目部分取出TUM1.yaml文件,tum数据集和2.2生成的associations.txt文件,我TUM1.yaml将在了EXamples/RGB-D/下,associations.txt文件放在了tum数据集下并统一放在在dxslam-master下。
预编译第三方库
如果第三方库报错
CMake Error at cmake_modules/FindEigen3.cmake:33 (file):
file failed to open for reading (No such file or directory):
/usr/include/eigen3/Eigen/src/Core/util/Macros.h
Call Stack (most recent call first):
cmake_modules/FindEigen3.cmake:59 (_eigen3_check_version)
CMakeLists.txt:70 (FIND_PACKAGE)
就是eigen3位置有问题,需要复制
sudo cp -r /usr/local/include/Eigen /usr/include
sudo cp -r /usr/local/include/eigen3 /usr/include
3.2 处理脚本
大佬说的很清楚,第一次下载失败,就一直会报错。
https://blog.youkuaiyun.com/weixin_39977764/article/details/122453967
如果有公网就可以参考大佬修改的build.sh,然后试运行就行,没有公网的话需要自己事先下载了两个文件DXSLAM.tar.xz和model.tar.xz(还需要公网,汗颜啦)
`wget https://github.com/ivipsourcecode/dxslam/releases/download/1.0.0/DXSLAM.tar.xz`
以及
`wget https://github.com/ivipsourcecode/dxslam/releases/download/1.0.0/model.tar.xz`
然后DXSLAM.tar.xz放在Vocabulary下,model.tar.xz放在hf-net下。来嗯个都需要解压。
3.3 处理数据集
tum数据集在运行RGBD时需要处理一下数据集格式
python associate.py ./rgb.txt ./depth.txt > associations.txt
3.4 处理特征文件
3.2下载的两个文件,DXSLAM.tar.xz解压后就能直接用,但是model.tar.xz解压后使用来处理数据集的,也就是在原本2.2处理之后还需要再次处理。这次是在虚拟环境下从图像和图像之中利用hf-net提取某种关系。注意,大佬博客这块少了一点,看下面评论应该是
python3 getFeature.py /home/名字/DXSLAM/dxslam-master/tum/rgbd_dataset_freiburg1_xyz/rgb.txt ./features
11.17 修正:上面不是读取txt而是读取rgb目录
python3 getFeature.py /home/名字/DXSLAM/dxslam-master/tum/rgbd_dataset_freiburg1_xyz/rgb ./features
不然在虚拟环境下就该会报错
File “getFeature.py”, line 70, in
query = hfnet.inference(image)
File “getFeature.py”, line 28, in inference
self.image_ph: image[…, ::-1].astype(np.float),
TypeError: ‘NoneType’ object has no attribute ‘getitem’
这个命令运行成功会一直输出图片名字,等待一会处理完毕就行。
最后运行测试
./Examples/RGB-D/rgbd_tum Vocabulary/DXSLAM.fbow ./Examples/RGB-D/TUM1.yaml ./tum/rgbd_dataset_freiburg1_xyz ./tum/rgbd_dataset_freiburg1_xyz/associations.txt ./hf-net/features
bug2:
UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above. [Op:Conv2D]
解决:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '/gpu:0'
最后还有个bug,我用的数据集跑到一半左右似乎卡住了,不知道为啥。后期有时间再看吧
最后放出我的项目树
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.21.4
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeError.log
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── DXSLAM.dir
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ ├── rgbd_tum.dir
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ └── Makefile
├── build.sh
├── CMakeLists.txt
├── cmake_modules
│ └── FindEigen3.cmake
├── Dependencies.md
├── Examples
│ └── RGB-D
│ ├── rgbd_tum
│ ├── rgbd_tum.cc
│ └── TUM1.yaml
├── hf-net
│ ├── features
│ │ ├── des
│ │ ├── glb
│ │ └── point-txt
│ ├── getFeature.py
│ ├── model
│ │ └── hfnet
│ └── model.tar.xz
├── include
│ ├── Converter.h
│ ├── FrameDrawer.h
│ ├── Frame.h
│ ├── Initializer.h
│ ├── KeyFrameDatabase.h
│ ├── KeyFrame.h
│ ├── LocalMapping.h
│ ├── LoopClosing.h
│ ├── MapDrawer.h
│ ├── Map.h
│ ├── MapPoint.h
│ ├── Matcher.h
│ ├── Optimizer.h
│ ├── PnPsolver.h
│ ├── Sim3Solver.h
│ ├── System.h
│ ├── Tracking.h
│ ├── Viewer.h
│ └── Vocabulary.h
├── lib
│ └── libDXSLAM.so
├── License-gpl.txt
├── LICENSE.txt
├── README.md
├── src
│ ├── Converter.cc
│ ├── Frame.cc
│ ├── FrameDrawer.cc
│ ├── Initializer.cc
│ ├── KeyFrame.cc
│ ├── KeyFrameDatabase.cc
│ ├── LocalMapping.cc
│ ├── LoopClosing.cc
│ ├── Map.cc
│ ├── MapDrawer.cc
│ ├── MapPoint.cc
│ ├── Matcher.cc
│ ├── Optimizer.cc
│ ├── PnPsolver.cc
│ ├── Sim3Solver.cc
│ ├── System.cc
│ ├── Tracking.cc
│ └── Viewer.cc
├── Thirdparty
│ ├── cnpy
│ │ ├── build
│ │ ├── CMakeLists.txt
│ │ ├── cnpy.cpp
│ │ ├── cnpy.h
│ │ ├── example1.cpp
│ │ ├── LICENSE
│ │ ├── mat2npz
│ │ ├── npy2mat
│ │ ├── npz2mat
│ │ └── README.md
│ ├── DBoW2
│ │ ├── build
│ │ ├── CMakeLists.txt
│ │ ├── DBoW2
│ │ ├── DUtils
│ │ ├── lib
│ │ ├── LICENSE.txt
│ │ └── README.txt
│ ├── fbow
│ │ ├── build
│ │ ├── CMakeLists.txt
│ │ ├── cmake_uninstall.cmake.in
│ │ ├── config.cmake.in
│ │ ├── README.md
│ │ ├── src
│ │ ├── tests
│ │ └── utils
│ └── g2o
│ ├── build
│ ├── CMakeLists.txt
│ ├── cmake_modules
│ ├── config.h
│ ├── config.h.in
│ ├── g2o
│ ├── lib
│ ├── license-bsd.txt
│ └── README.txt
├── tum
│ ├── rgbd_dataset_freiburg1_xyz
│ │ ├── accelerometer.txt
│ │ ├── associations.txt
│ │ ├── depth
│ │ ├── depth.txt
│ │ ├── groundtruth.txt
│ │ ├── rgb
│ │ └── rgb.txt
│ └── rgbd_dataset_freiburg1_xyz.tgz
├── Vocabulary
│ ├── DXSLAM.fbow
│ └── DXSLAM.tar.xz
└── 环境配置.md