msckf_mono构建运行方法
程序员文章站
2022-04-18 12:46:09
...
背景
博主是在读Davide Scaramuzza投稿到ICRA
2018的VIO综述文章《A Benchmark Comparison of Monocular Visual-Odometry Algorithms for Flying Robots》时,发现论文给出了单目版msckf算法参考实现的github链接地址,此前,这份参考实现并没有开放源代码。
构建过程及运行
1. 依赖项
- ROS Kinetic(应该主要是为了用到rviz的可视化)
- OpenCV
- 直接用系统默认的,没有的话,运行如下命令:
$ sudo apt-get install libopencv-dev
- 直接用系统默认的,没有的话,运行如下命令:
- Boost
- 直接用系统的,没有的话,运行如下命令:
$ sudo apt-get install libboost-dev
- 直接用系统的,没有的话,运行如下命令:
- Eigen
- 直接用系统的,没有的话,运行如下命令:
$ sudo apt-get install libeigen3
- 直接用系统的,没有的话,运行如下命令:
- fast
- 这是唯一一个需要自行编译的第三方依赖库,源码来自uzh-rpg,构建指令如下:
$ cd ANY_PATH
$ git clone https://github.com/uzh-rpg/fast
$ cd fast
$ mdkir build
$ cd build
$ cmake ..
$ make
- 这是唯一一个需要自行编译的第三方依赖库,源码来自uzh-rpg,构建指令如下:
2. 构建msckf_mono
- 先建立ROS工作空间,指令序列如下:
$ cd ANY_PATH
$ mkdir catkin_ws
$ cd catkin_ws
$ mkdir src
- 接下来就是拉取msckf_mono的源码到工作空间的src路径下,指令是:
$ cd src ## 延续上一步
$ git clone https://github.com/daniilidis-group/msckf_mono
- 在正式构建之前,稍微修改一下目录msckf_mono下的CMakeLists.txt文件,使之能找得到刚刚自行编译的fast库,方法如下:
- 将find_package(fast REQUIRED)一行注释掉
- 在其下添加如下两行指令:
set(fast_INCLUDE_DIRS ${ANY_PATH}/fast/include)
set(fast_LIBRARIES ${ANY_PATH}/fast/build/libfast.a)
注:这里之所以要这么做,是因为我没有将fast安装到系统的标准位置,而是手动指定了一下。为了方便,就偷个懒,请见谅。
- 构建msckf,指令如下:
$ cd ANY_PATH/catkin_ws
$ catkin_make
$ source devel/setup.bash
3. 运行
运行的方法就是README中的那一条指令了,以MH_01_easy数据集为例,如下:
$ roslaunch msckf_mono asl_msckf.launch data_set_path:=YOUR_DATASET_PATH/MH_01_easy/mav0 stand_still_end:=1403636625413555456.
这里,要注意的地方有两点
第一,源码对EuRoC的数据集有一个小要求,就是所有的.yaml文件,都要在首行添加一句%YAML:1.0
,这样做,仅仅是为了满足代码中OpenCV函数能顺利读取.yaml文件。
第二,也是最重要的一点,就是stand_still_end参数,要设置成数据集里飞机起飞时刻的时间戳。建议感兴趣的读者,利用二分法试验各个数据集,找到起飞点的时间戳。
下面,给出一个运行截图:
简评
- 算法对初始化的运动模式要求很苛刻,对于EuRoC数据集来说,一定要在飞行器起飞的瞬间开始运行程序。以MH_01_easy为例,博主是在试验了不同的起始时间戳之后,才使初始化位姿不发散。直接从数据序列的起点开始运行,初始化的效果很差,轨迹甚至会直接飞掉。
- 从MH_01_easy数据集的运行结果直观看,轨迹的精度不算差。一方面,真值曲线(绿色)和估计的轨迹曲线全程的重合度相对较高,另一方面,轨迹最终以较小的偏差延伸到了飞行器出发位置。但根据前述文章的评测,其精度相较于OKVIS等算法,要逊一些。
- 当然,根据论文作者的评测,这个版本的实现在鲁棒性、实时性方面还是很好的,见论文的DISCUSSION部分及相关的数据表格。