dynslam在github上的链接如下:https://github.com/AndreiBarsan/DynSLAM
因为做的课题和这个相关,因此这两天安装了一下。遇到了一些问题,记录一下。
首先说明一下我的电脑配置,cuda10.0,opencv3.4.3,虽然和作者要求的配置不一样,但是也是可以运行起来的。
下面讲一下我当时遇到的问题:
0、下载太慢,因为里面有很多第三方库,下载的非常慢,我让淘宝上的人帮忙下载,结果下载完里面很多还是空的,最后还是靠自己,这里为了造福各位劳苦大众,我特地上传到了我的百度云里面,方便大家下载,不要求太多,只希望大家给我这篇文章点个赞,O(∩_∩)O谢谢。
另外,后面还需要用到作者自己上传的一个kitti的demo数据,我都放到了一起,大家点起来!!
链接: https://pan.baidu.com/s/1YA5L0o-aAhdYf6ZZMxgg5w 提取码: as38
1、安装docker和nvidia-docker2,可以按照官网上的操作一步一步来,我已经整理好了,大家可以直接一行一行的复制回车即可。
curl https://get.docker.com | sh
sudo systemctl start docker && sudo systemctl enable docker
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
注意上面把cuda后面的数字修改为自己的版本,比如我就修改为了10.0
2、eigen的版本不对,项目要求eigen3.3以上,修改方法:
https://blog.csdn.net/qq_43247439/article/details/107574195?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
即,先卸载原来的,然后安装新的,安装步骤参考:https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/107302389
查看当前的eigen的版本:
pkg-config --modversion eigen3
3、编译快要结束的时候出现错误:
error: ‘glDrawFrustrum’ is not a member of ‘pangolin’
pangolin::glDrawFrustrum(Kinv, width_, height_, inv_pose, frustum_scale);
解决方法:https://blog.csdn.net/qq_37263498/article/details/80807206
4、运行时报出异常:
dummy == "Tr_velo_cam"
错误原因是DynSLAMGUI.cpp的1072行,会读取calib.txt文件的内容,但是普通的kitti里程计序列里面的calib.txt只有四行,后面的"Tr:"这些内容是没有的(看代码),这里需要的calib.txt,是官网上的第四个(看下面的第二张图),然而现在下载不了了,我也放到了百度云里面提供给大家,和上面的在一起。文件名:data_odometry_calib。
5、运行时实现问题:
terminate called after throwing an instance of 'std::runtime_error'
what(): Could not open CSV file. Does the folder it should be in exist?
github上也有人提问:https://github.com/AndreiBarsan/DynSLAM/issues/41
解决,好像就是因为没有csv文件夹,所以在工程目录下面自己创建一个csv目录,然后运行:
build/DynSLAM --use_dispnet --dataset_root=path/to/extracted/archive --dataset_type=kitti-odometry
6、运行时出现:X Error of failed request: BadValue (integer parameter out of range for operation)
好像因为没有使用他的数据集??,使用了他的demo数据集就没有这个问题,后面好好研究一下(注,后面发现,因为kitti数据集也不是直接就能使用,需要用他的script/preprocess_sequence.sh脚本来对数据集进行预处理,之后才能使用)
最后的运行效果如下所示:
注:如果想要让程序自动运行,那么需要在启动的时候设置参数:--autoplay=true
即:
build/DynSLAMGUI --use_dispnet --dataset_root=/media/azs/chris/dataset/KITTI/mini-seq-06 --dataset_type=kitti-odometry --autoplay=true
2020.10.15更新:
更新:生成在mesh_out目录的obj文件,需要使用某些特定的三维软件才能正确显示出来,比如我使用blender只能显示灰色的模型,但是没有颜色信息,最后找到了一个meshlab软件,用这个软件import我们的obj文件之后,可以显示彩色的三维模型。
安装 meshlab:
sudo apt-get install meshlab
2020.10.23更新:
这几天又陆续遇到了一些别的问题,这些问题我觉得在大家使用dynslam的时候也非常有可能遇到,因此记录下来。
问题1:在我的笔记本电脑上每次运行20多帧之后,就会报错:Runtime API error : 2 | out of memory
这个问题可能是因为显卡的显存不够,我将代码 运行在服务器上(GPU为1080Ti)之后,问题消失。
此外,上面的问题也可以参考:
https://blog.csdn.net/qq_38589460/article/details/83187512
但是这个方法在我电脑上并不能解决问题。
此外,如果出现下面的warning,也多半是显存的问题(warning: no more room in VBA!):
问题2:原来的程序默认会加载雷达数据,进行一些结果上的评估(evaluation),这会消耗一些时间,同时命令行也会显示很多内容,如果想取消评估(evaluation)这个步骤,可以在运行的时候设置enable_evaluation这个参数为false,但是我直接修改源码,默认为false了,并且将下面的代码从原来的/DynSLAM/InfiniTamDriver.cpp 移到了Dynslam.cpp里面,如果想打开,只需要添加参数----enable_evaluation =true:
DEFINE_bool(enable_evaluation, false, "Whether to enable evaluation mode for DynSLAM. This means "
"the system will load in LIDAR ground truth and compare its maps with it, dumping the results "
"in CSV format.");
问题3:运行/script/preprocess-sequence.sh脚本的时候遇到这个错误:
docker : Got permission denied while trying to connect thr Docker deamon socket at Unix,,,
解决: 只要在执行命令之前加上sudo 即可。
问题4:执行/script/preprocess-sequence.sh脚本时,又出现:Unable to find image 'dispflownet:latest' locally
(这个问题在github上也有人问)原因是dispnet需要预先进行build操作,而后面的MNC则不需要提前build(就是执行dockerfile里面的内容,相当与创建一个虚拟机),也就是到dispnet的目录下运行:make(具体步骤参考:https://github.com/AndreiBarsan/dispnet-flownet-docker/tree/4f4d19b0edf01587cd0f29aa48b00d1459c9f6f7),但是make会安装很多东西,大约需要6GB左右的空间,同时会下载很多东西,在我电脑上主要是下载一个1.1G的文件非常慢,这个我就是硬下的,下了4~5小时。
问题5:运行/script/preprocess-sequence.sh中,安装MNC docker的时候老是会有一些问题,好像是安装opencv-python的时候会出现问题,因为如果给他自动安装的话,就是安装openc4.3版本的,但是会出现一堆跟python2.7有关的问题:报错有:TypeError: "NoneTpye" object is not iterable 等等,如下图:
原因是因为默认下载的opencv-python版本是4.3,这个版本不行, opencv 的最新版不再支持 Python 2.7,而 pip install opencv-python 命令会下载最新版本的 opencv。要指定下载4.2.0.32的版本,即添加opencv-python==4.2.0.32。(这个问题真的困扰了好久!!!)
问题6:MNC的模型一直下载不了,貌似需要翻墙才能下载,并且我翻墙也只能通过浏览器来下载,通过script脚本里面的wdgt下载不了(因为这个模型下载的操作原本是在dockerfile里面调用别的脚本下载的),所以只能手动下载,然后再dockerfile里面ADD(ADD操作相当与将文件从电脑复制进docker里面的指定的目录)。
我选择将下载的模型文件(1.1GB)放到项目的preprocessing/MNC/models目录下,然后修改项目的preprocessing/MNC/tools/demo.py文件的62行的default参数(蓝色的为原本的,红色的为修改过后的):
另外,还要修改preprocessing/MNC/Dockerfile文件,将下面的两句RUN注释掉,这两句原本会调用一个脚本去下载这个模型文件,因为这里我们前面手动下载了,就不需要了:
这样就可以直接使用复制进虚拟机的模型文件。这里我把模型文件上传到了百度网盘。链接在文章一开始已经给出,文件名为:mnc_model.caffemodel.h5 。有帮助的话别忘了点个赞!!!
问题7:preproce_sequence.sh的结尾会调用/preprocessing/MNC/tools/demo.py文件(也就是对image_2目录下的RGB图片执行实例分割操作),在该文件执行的时候遇到了目录不存在的情况,即显示找不到某个目录。
探究:因为preprocess_kitti_mnc.sh里面最下面一部分是:
# Note: the tool is called 'demo.py' for historical reasons.
nvidia-docker run \
--mount src="$DATASET_ROOT",target=/data/kitti,type=bind \
-e CUDA_VISIBLE_DEVICES="$GPU_ID_TO_USE" \
-t mnc-docker-img \
bash -c "cd /opt/mnc && mkdir -p /data/kitti/$SEQUENCE_OUT && CUDA_VISIBLE_DEVICES=0 tools/demo.py --input /data/kitti/$SEQUENCE_IN --output /data/kitti/$SEQUENCE_OUT"
#done
可以看到,他默认的输入/data/kitti/$SEQUENCE_IN,/data/kitti这其实是一个映射的目录,它对应的是$DATASET_ROOT,即docker里面的/data/kitti这个目录,对应着你的电脑的$DATASET_ROOT目录(其实就是代表你输入的表示你数据集位置的参数)
而这里的 SEQUENCE_IN和SEQUENCE_OUT 为:
SEQUENCE_IN="$SPLIT/image_02/$id"
SEQUENCE_OUT="$SPLIT/seg_image_02/$id/mnc"
这个目录的构成和我们的kitti-odometry类的数据需要的是不一样的,可以对比一下demo数据集的目录构成,就比如demo数据集的mnc目录为:
mini-seq-06/seg_image_2/mnc
但是如果按照上面的目录构成的话,就是:
mini-seq-06/training/seg_image_2/序列号/mnc
注:上面的$SPLIT表示training 或者 testing,$id表示图片的序列号。
究其原因,我们可以查看preprocess_sequence.sh里面的具体内容,发现,如果是处理kitti-odometry类的数据,他的目录结构和 kitti-tracking类的数据的目录结构是不一样的,原脚本只在使用dispnet进行深度估计的时候进行了区分处理(即prepare_depth_dispnet方法),但是在进行语义分割的时候却没有分开处理(即prepare_semantic_mnc () 方法),因此最终生成的目录和他的demo的目录也是不一样的,这样的话是无法直接用于程序运行的,因此要进行修改,对kitti-odometry和kitti-tracking分开处理,这里因为我只用kitti-odometry,所以下面的修改只针对kitti-odometry的数据。
首先修改script/preprocess_sequence.sh
将prepare_semantic_mnc ()方法里面的
seq_seg_root和seq_image_02_root修改为:
seq_seg_root="$path/seg_image_2/mnc"
seq_image_02_root="$path/image_2"
#原本的为:
#seq_seg_root="$path/seg_image_02/$(printf '%04d' $seq_id)/mnc"
#seq_image_02_root="$path/image_02/$(printf '%04d' $seq_id)"
然后修改preprocessing/MNC/preprocess_kitti.mnc.sh
将SEQUENCE_IN和SEQUENCE_OUT修改为:
SEQUENCE_IN="image_2"
SEQUENCE_OUT="seg_image_2/mnc"
#原本的为:
#SEQUENCE_IN="$SPLIT/image_02/$id"
#SEQUENCE_OUT="$SPLIT/seg_image_02/$id/mnc"
这样,语义分割的数据输出的目录就和demo里面的一样了,也就是在你的数据集目录下的seg_image_2/mnc/目录内。