亲宝软件园·资讯

展开

DSO 运行 —— dso_ros + Android 手机摄像头

MingruiYu 人气:1
转载请注明出处,谢谢 原创作者: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 系列博文](https://www.cnblogs.com/MingruiYu/tag/ORB-SLAM2/)),也实现了以 Android 手机摄像头为输入,实时运行 ORB-SLAM2([ORB-SLAM2 运行 —— ROS + Android 手机摄像头](https://www.cnblogs.com/MingruiYu/p/12404730.html))。这几天在了解直接法 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](https://vision.in.tum.de/research/vslamhttps://img.qb5200.com/download-x/dso?redirect=1) 为 TUM Vision Group 介绍 DSO 的网站,其中包括论文链接。 # ROS 配置安装 参照 [ROS 官方安装教程](http://wiki.ros.org/melodic/Installation/Ubuntu) 和我的博文 [ORB-SLAM2 运行 —— ROS + Android 手机摄像头](https://www.cnblogs.com/MingruiYu/p/12404730.html)。 # DSO 配置安装 参照 [JakobEngelhttps://img.qb5200.com/download-x/dso (GitHub 文档)](https://github.com/JakobEngelhttps://img.qb5200.com/download-x/dso#dso-direct-sparse-odometry): ## 下载 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/JakobEngelhttps://img.qb5200.com/download-x/dso.git ``` ## 依赖安装 ### 基础依赖 ``` sudo apt-get install libsuitesparse-dev libeigen3-dev libboost-all-dev ``` ### OpenCV & Pangolin 之前跑 ORB-SLAM2 的时候已经安装过了,还没装过的朋友可以参考我的博文 [ORB-SLAM2 初体验 —— 配置安装](https://www.cnblogs.com/MingruiYu/p/12286752.html)。 ### 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/binhttps://img.qb5200.com/download-x/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/JakobEngelhttps://img.qb5200.com/download-x/dso#3-usage)。 运行效果展示:
# dso_ros 安装 以上的过程我都进行的非常顺利,然而接下来就是踩坑之旅了。 JakobEngelhttps://img.qb5200.com/download-x/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/JakobEngelhttps://img.qb5200.com/download-x/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/srchttps://img.qb5200.com/download-x/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 srchttps://img.qb5200.com/download-x/dso_ros export DSO_PATH=YOUR_PATHhttps://img.qb5200.com/download-x/dso rosmake ``` # Android 手机摄像头与 PC 进行基于 ROS 的通信 参考我的博文 [ORB-SLAM2 运行 —— ROS + Android 手机摄像头](https://www.cnblogs.com/MingruiYu/p/12404730.html) 其中的“Android 手机摄像头与 PC 进行基于 ROS 的通信”一节。 # 手机摄像头标定 参考我的博文 [ORB-SLAM2 运行 —— ROS + Android 手机摄像头](https://www.cnblogs.com/MingruiYu/p/12404730.html) 其中的“手机摄像头标定”一节。 **注意:** 在 ORB-SLAM2 中,系统所需的相机畸变参数为 k1, k2, p1, p2, k3。而在 DSO 中,系统所需的相机畸变参数为 k1, k2, p1, p2。所以需要在标定环节中修改 VID5.xml 时,将 `````` 的 0 该为 1,这样就会保持 k3 = 0,使得得到的畸变参数满足 DSO 系统的要求。 ### 参数填入 DSO 的相机标定文件 在某处建立一个 myCamera.txt 文件,用于按照 DSO 要求的格式存放相机的参数。 myCamera.txt 文件格式可参考 [DSO/Geometric Calibration File](https://github.com/JakobEngelhttps://img.qb5200.com/download-x/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/JakobEngelhttps://img.qb5200.com/download-x/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个终端。[参考资料](https://blog.csdn.net/zhubaohua_bupt/articlehttps://img.qb5200.com/download-x/details/53925641) 新建 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。[参考资料](https://www.cnblogs.com/chay/p/10303873.html) # 参考资料 * [ORB-SLAM2 运行 —— ROS + Android 手机摄像头](https://www.cnblogs.com/MingruiYu/p/12404730.html) * [JakobEngelhttps://img.qb5200.com/download-x/dso](https://github.com/JakobEngelhttps://img.qb5200.com/download-x/dso#dso-direct-sparse-odometry) * [JakobEngelhttps://img.qb5200.com/download-x/dso_ros](https://github.com/JakobEngelhttps://img.qb5200.com/download-x/dso_ros) * [编译安装DSO并在线运行摄像头](https://blog.csdn.net/qq_17232031/articlehttps://img.qb5200.com/download-x/details/79540286) * [vSLAM实践课程--DSO--class(1-5)](https://www.bilibili.com/video/av69168083?p=3) * [could not parse argument "mode=1"!! #43](https://github.com/JakobEngelhttps://img.qb5200.com/download-x/dso_ros/issues/43) * [DSOhttps://img.qb5200.com/download-x/dso_ros](https://www.itread01.com/content/1545470952.html)

加载全部内容

相关教程
猜你喜欢
用户评论