原创作者: Mingrui
原创链接: https://www.cnblogs.com/MingruiYu/p/12425855.html
本文要点:
dso 配置安装
dso 离线数据集运行示例
dso_ros 配置安装
解决报错
DSO missing from command line
解决运行时报错
Couldn't find executable named dso_live
手机摄像头标定
参数以相应格式填入 DSO 的相机标定文件
以 Android 手机摄像头为输入, 实时运行 DSO
关于运行提示
could not parse argument "mode=1"!!
写在前面
之前认真研读了 ORB-SLAM2 论文和代码 (ORB-SLAM2 系列博文), 也实现了以 Android 手机摄像头为输入, 实时运行 ORB-SLAM2(ORB-SLAM2 运行 -- ROS + Android 手机摄像头). 这几天在了解直接法 SLAM, 先阅读了 LSO-SLAM 的论文, 因为其是 14 年的, 开源代码还是基于 ROS indigo + Ubuntu 14.04, 所以就不跑了. 之后阅读了 DSO 的论文, 决定仿照之前 ORB-SLAM2 的学习过程, 也以 Android 手机摄像头为输入, 实时运行 DSO 试一试.
本文环境为:
- Ubuntu 18.04
- ROS Melodic
Android 手机 (MI 9 SE)
DSO 简介
DSO: Direct Sparse Odometry 为 TUM Vision Group 介绍 DSO 的网站, 其中包括论文链接.
ROS 配置安装
参照 ROS 官方安装教程 http://wiki.ros.org/melodic/Installation/Ubuntu 和我的博文 ORB-SLAM2 运行 -- ROS + Android 手机摄像头.
DSO 配置安装
参照 JakobEngel/dso (GitHub 文档):
下载 DSO
为方便后续跑 dso_ros, 先建立一个 catkin workspace:
- mkdir -p YOUR_PATH/catkin_ws/src
- cd YOUR_PATH/catkin_ws
- catkin_make
- cd src
- Git clone https://github.com/JakobEngel/dso.git
依赖安装
基础依赖
- sudo apt-get install libsuitesparse-dev libeigen3-dev libboost-all-dev
- OpenCV & Pangolin
之前跑 ORB-SLAM2 的时候已经安装过了, 还没装过的朋友可以参考我的博文 ORB-SLAM2 初体验 -- 配置安装.
ziplib
用于直接读取 zip 压缩文件中的图像 (例如在 TUM monoVO dataset 就是 zip 文件), 为了方便. 否则只能先手动解压缩. 既然人家建议, 就装了吧:
- 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).
安装 DSO
- cd dso
- mkdir build
- cd build
- cmake ..
- make -j4
DSO 的安装到这里就结束了, 比较简单的.
离线数据集运行示例
数据集下载:( https://vision.in.tum.de/mono-dataset ), 每个视频序列文件夹以 sequence_XX 命名, 其中包括了 image.zip(视频序列), camera.txt(相机内参及畸变参数等), pcalib.txt, vignette.PNG (二者为 photometric calibration 的标定参数, 详见论文) 文件.
运行:
- cd dso
- ./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=0
其中的参数:
前 4 项就是视频序列文件夹中的文件.
preset 表示系统以何种方式运行 (默认模式 / 快速模式, 非实时 / 实时),preset=0 表示默认模式且可以非实时.
mode 表示相机的标定情况, mode=0 表示相机完全标定 (包括几何标定和 photometric 标定).
更详细的内容还有其它的一大堆参数的具体含义详见 ( https://github.com/JakobEngel/dso#3-usage ).
运行效果展示:
dso_ros 安装
以上的过程我都进行的非常顺利, 然而接下来就是踩坑之旅了.
JakobEngel/dso repo 本身是没有 ROS 支持的, 但是 TUM Vision Group 单独在 GitHub 上建了一个 dso_ros 的 repo, 其提供了 DSO 的 ROS 接口.
下载 dso_ros
- cd YOUR_PATH/catkin_ws/src
- Git clone https://github.com/JakobEngel/dso_ros.git
修改 CMakeLists.txt
这里很重要了, 否则在之后安装或者运行的时候会报错
1 CMakeLists.txt 倒数第二行:
target_link_libraries(dso_live ${DSO_LIBRARY} ${Pangolin_LIBRARIES} ${OpenCV_LIBS} -lboost_system)
尾部添加 -lboost_system(上述代码为添加后的).
如果不进行这一步, 会在编译的时候报错 DSO missing from command line.
2 CMakeLists.txt 中的
set(EXECUTABLE_OUTPUT_PATH bin)
修改为
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
修改之前, 编译生成的可执行文件 dso_live 的位置为 dso_ros/build/bin, 但这样的话在运行的时候会报错:
Couldn't find executable named dso_live below YOUR_PATH/catkin_ws/src/dso_ros
修改后, dso_live 的位置变为 dso_ros/bin, 运行的时候就可以找到了. 参考资料 https://www.itread01.com/content/1545470952.html
安装 dso_ros
- cd YOUR_PATH/catkin_ws
- source devel/setup.bash
- cd src/dso_ros
- export DSO_PATH=YOUR_PATH/dso
- rosmake
Android 手机摄像头与 PC 进行基于 ROS 的通信
参考我的博文 ORB-SLAM2 运行 -- ROS + Android 手机摄像头 其中的 "Android 手机摄像头与 PC 进行基于 ROS 的通信" 一节.
手机摄像头标定
参考我的博文 ORB-SLAM2 运行 -- ROS + Android 手机摄像头 其中的 "手机摄像头标定" 一节.
注意: 在 ORB-SLAM2 中, 系统所需的相机畸变参数为 k1, k2, p1, p2, k3. 而在 DSO 中, 系统所需的相机畸变参数为 k1, k2, p1, p2. 所以需要在标定环节中修改 VID5.xml 时, 将 <Fix_K3>0</Fix_K3> 的 0 该为 1, 这样就会保持 k3 = 0, 使得得到的畸变参数满足 DSO 系统的要求.
参数填入 DSO 的相机标定文件
在某处建立一个 myCamera.txt 文件, 用于按照 DSO 要求的格式存放相机的参数.
myCamera.txt 文件格式可参考 DSO/Geometric Calibration File, 其中有很多不同情况的例子. 具体到本实现中, 该标定文件的内容格式可为
- fx fy cx cy k1 k2 p1 p2
- 640 480
- crop
- 640 480
- (因为上文中手机端传回来的视频流的分辨率为 640*480)
- (这一部分我也没太懂, 官方文档中的那些情况都具体怎么用, 为什么在 TUM monoVO dataset 中 camera.txt 第一行的 fx 和 第三行的 fx 值不一样, crop/full 都具体指什么, in_width/out_width 对实际效果有什么影响. 欢迎大佬指教 QAQ)
以 Android 手机摄像头为输入, 实时运行 DSO
- Terminal 1:
- roscore
手机进入 App 运行
Terminal 2: 在 Android_Camera-IMU 目录
- roslaunch android_cam-imu.launch
- (可以关掉 Rviz)
- Terminal 3:
- rosrun dso_ros dso_live image:=/camera/image_raw calib=YOUR_PATH/myCamera.txt
注意: 因为我们没有对相机进行 photometric calibration, 所以我们只能提供几何标定的标定文件. 其它的省略就可以了.
关于 mode=1
一个很神奇的地方, 按照 dso 文档的说法, 没有 photometric calibration 的话, 需要在运行指令中添加 mode=1. 一开始我也这样做的, 但是提示: could not parse argument "mode=1"!!. 然后我发现, 在 dso_ros/src/main.cpp 中, parseArgument() 中并没有 mode 和 preset 参数, 也就是根本没有定义这些参数 (迷惑). 参考资料 https://github.com/JakobEngel/dso_ros/issues/43
再仔细一看, 在 dso/src/main_dso_pangolin.cpp(offline DSO) 中, mode=1 的作用是修改了 setting_photometricCalibration = 0.setting_photometricCalibration 的含义为
0 = nothing.
1 = apply inv. response.
2 = apply inv. response & remove V.
在 DSO 系统中, setting_photometricCalibration 默认为 2, 即有 photometric calibration, 可以通过在运行指令中添加 mode=1 修改. 而在 dso_ros/src/main.cpp 中, 直接指定了 setting_photometricCalibration=2, 没有提供修改选项. 这可能是因为如官方说法, dso_ros 只是一个最简版本的 ROS 接口 (simple, minimal example), 所以很多支持都不完善吧.
这个自己添加选项很容易, 这里我图省事, 就直接将 dso_ros/src/main.cpp 中的 setting_photometricCalibration=2 改为了 =0. 之后重新编译 dso_ros.
运行效果展示:
发现:
初始化比 ORB-SLAM2 Mono 容易多了
轨迹很飘, 建图还行
简化启动
上述启动步骤需要启动 3 个终端, 挺麻烦的, 所以可以选择写一个脚本来自动启动这 3 个终端. 参考资料
新建 DSO_with_AndroidPhone.sh, 在其中填入:
- gnome-terminal --title="roscore" -x bash -c "roscore"
- sleep 2s;
- gnome-terminal --title="AndroidPhone" -x bash -c "cd YOUR_PATH/Android_Camera-IMU; roslaunch android_cam-imu.launch"
- sleep 2s;
- gnome-terminal --title="DSO" -x bash -c "rosrun dso_ros dso_live image:=/camera/image_raw calib=YOUR_PATH/myCamera.txt"
之后赋予权限 (仅需一次):
chmod +x DSO_with_AndroidPhone.sh
运行:
./DSO_with_AndroidPhone.sh
即可一次性打开 3 个终端, 并运行相关命令. 之后手机再打开 App 就可以了.
注意: 此时终端运行结束后会自动退出, 如果不想自动退出, 可 在 terminal 点右键, 选择 Profiles->Profile Preferences 然后找到 Title and Command, 里面有一项 When command exits, 后面选择为 Hold the terminal open. 参考资料
参考资料
ORB-SLAM2 运行 -- ROS + Android 手机摄像头
https://github.com/JakobEngel/dso_ros
编译安装 DSO 并在线运行摄像头
vSLAM 实践课程 --DSO--class(1-5) https://www.bilibili.com/video/av69168083?p=3
- could not parse argument "mode=1"!! #43 https://github.com/JakobEngel/dso_ros/issues/43
- DSO/dso_ros https://www.itread01.com/content/1545470952.html
来源: https://www.cnblogs.com/MingruiYu/p/12425855.html