DSO 运行 —— dso_ros + Android 手机摄像头
转载请注明出处,谢谢
原创作者: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 官方安装教程 和我的博文 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 的标定参数,详见论文)文件。
(photometric calibration:光度标定,是 TUM Vision Group 提出的一种相机除了几何标定之外的光度参数的标定方法,详细内容可参考)
运行:
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,运行的时候就可以找到了。参考资料
安装 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 参数,也就是根本没有定义这些参数(迷惑)。参考资料
再仔细一看,在 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 手机摄像头
- JakobEngel/dso
- JakobEngel/dso_ros
- 编译安装DSO并在线运行摄像头
- vSLAM实践课程--DSO--class(1-5)
- could not parse argument "mode=1"!! #43
- DSO/dso_ros
- DSO之光度标定
DSO 运行 —— dso_ros + Android 手机摄像头的更多相关文章
- ORB-SLAM2 运行 —— ROS + Android 手机摄像头
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12404730.html 本文要点: ROS 配置安装 解决 sud ...
- Android手机摄像头编程入门
本讲内容:Android手机摄像头编程入门智能手机中的摄像头和普通手机中的摄像头最大的区别在于,智能机上的摄像头可以由程序员写程序控制, 做一些有趣的应用譬如,画中画,做一些有用的应用譬如二维码识别, ...
- 关于降低android手机摄像头预览分辨率
假设现在有这样一个需求需要一直开着手机摄像头 但是不做任何拍照动作 但是每个手机的相机分辨率都不同 而默认预览的时候参数是最大分辨率 这样有时候就回导致电量损耗的加快 所以我们可以采取降低相机分辨率的 ...
- Android 手机上安装并运行 Ubuntu 12.04
ubuntu.sh脚本的原地址变动了,导致下载不了,现在更新了网盘地址.小技巧:遇到一些下载失效的时候可以试一试p2p下载工具(如 easyMule.迅雷等)试一试,说不定有人分享过~* —————— ...
- android 通过wifi 热点实现手机摄像头数据共享(转)
原文地址:http://blog.csdn.net/sinat_35845281/article/details/52674946 最近想搞一个新奇的玩意儿~~~ 最近一直在在学习通过两个Androi ...
- win7 cmd终端连接android手机运行adb shell脚本命令
win7 cmd终端连接android手机运行adb shell脚本命令 (2013-03-22 20:13:57) 转载▼ 标签: android it shell 连接 linux 分类: 嵌入式 ...
- [Android相机]通过手机摄像头识别环境亮度(转)
源: [Android相机]通过手机摄像头识别环境亮度 iOS利用摄像头获取环境光感参数
- appium常见问题05_修改Android手机运行环境(adb指令修改hosts)
自动化测试过程中,手机有时会跳网,怎样保持手机测试的环境稳定性,可以通过adb指令修改android手机hosts,保持手机运行在hosts中配置的环境中: 修改方法如下: 前提条件:已安装andro ...
- android 手机上运行图像算法
在pc上调试好的图像处理算法想要在android手机上跑一下看看速度需要一下几个步骤 1.建立一个android application,通过ndk调用你写好的图像算法的c/c++ code 2. 然 ...
随机推荐
- 新年在家学java之基础篇-参数&修饰符&构造器
可变参数 不知道可能给方法传递多少个参数时使用这个方法 public void printInfo (String[] args) --可以定义一个数组,在调用这个方法适合赋值给一个数组 public ...
- 十、linux-mysql下的mysql数据库增量恢复
1.全量备份 全量数据就是数据库中所有的数据,全量备份就是把数据库中所有的数据进行备份. 备份所有库: mysqldump -uroot -ppoldboy -S /data/3306/mysql.s ...
- jmeter 配置csv 登陆网站 报错
0 环境 系统环境:win7 1 正文 1 问题 创建csv 格式为utf-8后 jmeter csv配置好后 post请求登陆报错 2 解决 查看了一下报告 post请求里用户名乱码了 仔细一看网站 ...
- Random variable
\(\underline{cdf:}\)cumulative distribution function \(F(x)=P(X \leq x)\) \(\underline{pmf:}\)probab ...
- TPO1-3 Timberline Vegetation on Mountains
Wind velocity also increase with altitude and may cause serious stress for trees,as is made evident ...
- 点分治——POJ 1741
写的第一道点分治的题目,权当认识点分治了. 点分治,就是对每条过某个点的路径进行考虑,若路径不经过此点,则可以对其子树进行考虑. 具体可以看menci的blog:点分治 来看一道例题:POJ 1741 ...
- SQL语句简单应用(未完)
简介: SQL(structured query language)结构化查询语句,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系型数据库系统,同时也是数据库脚本文件的扩展名 ...
- tmux的基本用法
tmux的基本用法: tmux #启动 C-b d #挂起,效果如同screen中的C-a d tmux attach #恢复会话,效果如同screen中的screen -r 更多功能(需要在tmux ...
- hadoop-2.5.2 源码学习1
- SHELL用法五(Case语句)
1.SHELL编程Case语句案例实战 1)Case选择条件语句的格式: case $INPUT in Pattern1) 语句1 ;; Pattern2) 语句2 ;; esac 2)Case语句企 ...