一、写在前面
前段时间老师布置了课程任务,让全班同学分组配置和运行slam,我们组选择的是DSO-slam。由于选择的时候并没有对slam并没有什么了解,只有老师上课时一些科普性质的讲解,所以相当于是从0开始。
这一周一直用空闲时间配置环境、运行,和同学一起踩了各种各样的坑。这里把我自己成功运行的配置过程、遇到的一些问题记录下来。里面有我和同学在网上查阅的很多东西,包括配置方法、源码等等。非常感谢提供了这么多资料的前辈们,如果有侵权内容,请联系我删除;如果我这里有什么不当之处,也希望大家指出。
二、系统配置
使用虚拟机安装的Ubuntu 18.04系统,主机为win10。
三、安装DSO并运行数据集
1.克隆源码包:
git clone https://github.com/JakobEngel/dso.git
2.安装所需依赖:
(1)suitesparse和eigen3
sudo apt-get install libsuitesparse-dev libeigen3-dev libboost-all-dev
(2)openCV
sudo apt-get install libopencv-dev
(3)Pangolin
cd ~
git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
build git:(master) make -j
(4)ziplib
sudo apt-get install zlib1g-dev
cd dso/thirdparty
tar -zxvf libzip-1.1.1.tar.gz
cd libzip-1.1.1/
./configure
make
sudo make install
sudo cp lib/zipconf.h /usr/local/include/zipconf.h # (no idea why that is needed).
3.编译
cd dso
mkdir build
cd build
cmake ..
make -j4
4.运行数据集
首先下载可用的数据集并解压:https://vision.in.tum.de/data/datasets/mono-dataset?redirect=1
进入build目录,执行
bin/dso_dataset files=XXXXX/sequence_XX/images.zip calib=XXXXX/sequence_XX/camera.txt gamma=XXXXX/sequence_XX/pcalib.txt vignette=XXXXX/sequence_XX/vignette.png preset=0 mode=1
XXXXX是存放数据集的目录,XX是下载数据集的编号。
如果要运行自己的数据集,需要将录制的视频提取为图片,并命名为六位数字(如000001.jpg),然后执行
bin/dso_dataset files=XXXXX/images.zip calib=XXXXX/camera.txt mode=1
其中,images.zip为存放图片的压缩包,camera.txt为相机标定文件。
5.可能遇到的问题:
我在这里主要遇到了以下两个问题:
(1)编译时执行camke,提示找不到Pangolin
在已经安装Pangolin的情况下,依然提示找不到Pangolin,在执行cmake前将build文件夹下的cmakecache删除即可。
(2)编译时执行make,提示‘decay_t’不是std库的成员等
可能是由于新版本的Pangolin有问题,于是在网上找到了旧版本的Pangolin:
旧版本Pangolin下载地址:https://github.com/zzx2GH/Pangolin
在以上的地址中将代码打包下载,其他步骤不变。(注意,不要直接在终端执行以上网站中的git clone https://github.com/stevenlovegrove/Pangolin.git,这个依然是新版本)
四、安装DSO-ROS,使用电脑摄像头实时运行
1.dso_ros安装编译
cd ~
mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
src git clone https://github.com/BlueWhaleRobot/dso_ros.git
cd ..
export DSO_PATH=xxx/dso (存放dso的路径)
catkin_make
2.usb_cam安装编译
cd ~/catkin_ws/src
src git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
3.运行摄像头
首先将电脑的摄像头连接到虚拟机:如下图所示:
运行ros,在第一个终端中运行:
roscore
运行camera,在第二个终端中运行:
roslaunch usb_cam usb_cam-test.launch
运行dso_ros,在第三个终端中运行:
rosrun dso_ros dso_live image:=/usb_cam/image_raw calib=相机参数文件所在路径/camera.txt mode=1
camera.txt文件是相机标定文件,相机标定的具体方法可以见这篇文章https://blog.csdn.net/learning_tortosie/article/details/79901255。这里我没有对笔记本摄像头进行标定,使用了网上下载代码时附带的一份标定文件,能看到运行时图片有比较明显的畸变。
4.遇到的问题
(1)安装库时提示无法解决依赖问题
使用aptitude代替apt-get安装,aptitude可以更好地解决库的依赖问题:
sudo aptitude install prime-indicator
但是在我安装时,对于boost库的依赖依然无法解决。查看报错信息发现,是由于期待的boost版本是1.54,而我的库版本是1.65,即版本过高。需要手动卸载原来的boost,并下载安装1.54版本。
(2)catkin_make时找不到util/setting.h
在安装usb_cam中,需要执行一次cmake,这里有可能提示在dso_ros的源文件中,找不到util/setting.h的位置。为什么第一次执行catkin_make没有问题,现在就有问题了呢?我于是新建工作区,下载编译dso_ros后,替换原来的文件,问题解决。也就是说,需要将dso_ros和usb_cam分别编译。
五、使用Android手机摄像头实时运行
在局域网下,使用手机摄像头和Ubuntu系统连接,对手机拍摄到的场景实时重建。
关于手机摄像头和电脑的局域网连接,参考了这篇文章:https://www.cnblogs.com/haijian/p/12044662.html (作者:HaijianYang)
1.安装APP
首先需要在手机上安装RTSPserver,可以进入下面的网址下载,下载解压后,在bin文件夹下找到apk文件,在手机上安装即可。
RTSPserver下载地址: https://github.com/XellossSei/RTSP.Server.Android
2.安装rocon_devices_kinetic
APP完成安装后,需要在Ubuntu系统进行配置。在网上找到了一份免费的源码,下载地址贴在这里了:
rocon_devices_kinetic源码下载链接:https://pan.baidu.com/s/1opt_01-is3ZYuesThnEbFA
提取码:f4g2
在catkin_ws/src文件夹下解压后,进行编译和安装:
cd ~\catkin_ws
catkin_make
source catkin_make/devel/setup.bash
接着就可以与手机进行连接了:
首先将手机和计算机至于同一局域网,打开APP,点击左侧最下方的按键开启连接,可以看到手机的IP地址,这里是192.168.137.179。
然后在终端输入如下的语句:(用手机的IP替换xxx)
export ROCON_RTSP_CAMERA_RELAY_URL=rtsp://×××:5540/ch0
roslaunch rocon_rtsp_camera_relay rtsp_camera_relay.launch
至此,相机已经连通并运行了。在另一个终端输入如下的语句,就可以在自己的电脑上查看手机相机拍摄到的场景了:
rosrun image_view image_view image:=/rtsp_camera_relay/image
3.使用手机摄像头实时运行DSO
使用手机摄像头运行DSO的方法和使用电脑摄像头类似。
运行ros,在第一个终端中运行:
roscore
运行camera,在第二个终端中运行:
export ROCON_RTSP_CAMERA_RELAY_URL=rtsp://×××:5540/ch0
roslaunch rocon_rtsp_camera_relay rtsp_camera_relay.launch
在第三个终端中运行:
rosrun image_view image_view image:=/rtsp_camera_relay/image
运行dso_ros,在第四个终端中运行:
rosrun dso_ros dso_live image:=/rtsp_camera_relay/image calib=xxx/camera.txt mode=1
运行结果如下:
4.遇到的问题
(1)相机与电脑的局域网连接
这里需要注意的是,一定要在手机APP开始运行后再启动终端;在运行过程中,可能会突然断开连接,手机APP不再显示IP地址,则需要退出终端,在APP重新开启相机后再启动终端。
关于虚拟机与手机置于同一局域网下,网上查阅了很多资料,需要对虚拟机的网络配置进行修改。我使用了一种比较简单的方法:在电脑上开启热点,使用手机连接该热点,虚拟机网络使用NAT模式,此时二者为同一局域网下。
(2)运行至START PANGOLIN后卡住
如上图所示,启动dso_ros后,提示无法打开PhotometricUndistorter文件,运行至START PANGOLIN卡住。
注意这里输入的语句中的“image:/”段,与运行电脑摄像头的时候是不同的:
rosrun dso_ros dso_live image:=/rtsp_camera_relay/image calib=xxx/camera.txt mode=1
“image:=xxx”后面填写的部分,是相机运行的终端的名称,也就是第三个终端中输入的"iamge:/"字段。注意下图中窗口的名称和终端的输入:
附:
在Ubuntu下使用ros保存图像的方法
https://blog.csdn.net/listen_to_star/article/details/98972581