最近在看滤波slam算法相关的东西,从KF到EKF到EKF slam都有相应的python程序可以学习演示,没想到到了msckf这一步仍然有人写了python版本,还是双目的:stereo_msckf

顺便安利一下作者uoip,这位hub主写了好几个python版的视觉slam相关算法,包括Stereo-PTAM、rgbd-PTAM等。

uoip的stereo_msckf直接翻译自Kumar版的msckf,且剥离了ros,所以单独用Pangolin做了显示界面,README中写的是基于python 3.6+,以下是我在ubuntu 16.04,ros kinetic(意味着我系统里有一大堆python 2.7),python 3.5.2环境下的使用测试。

安装pangolin

为了做结果显示,需要安装作者自己改装的python版pangolin

安装前需要确保安装了numpy和PyOpenGL。

按照pangolin/README进行操作,直到最后一步(我系统里python 2\3并行,所以得用python3命令):

sudo python3 setup.py install

报出错误:

File “setup.py”, line 22, in run
assert len(lib_file) == 1 and len(install_dirs) >= 1
NameError: global name ‘install_dirs’ is not defined

去网上一搜就发现了issue:就是作者有笔误了。把/pangolin/setup.py里第19和第25行的“install_dir”都改成“install_dirs”就行了。

错误不再报出,安装执行完毕。

安装cv2

pip安装一下opencv-python:由于opencv-python包的体积比较大,网速不行的话会比较慢,可以换国内的库比如清华的:

sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

安装stereo_msckf

其实stereo_msckf不需要安装,直接执行算法就行。但是刚开始运行:

python3 vio.py --view --path path/to/your/EuRoC_MAV_dataset/MH_01_easy

的时候会提示错误:

ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

显然是py路径上python 2.7的opencv挡路了,所以在程序里import cv2会报错。

找到整个程序脚本里第一次import cv2,在前面把python 2.7的路径去掉就行了。比如在这里就是,打开/stereo_msckf/config.py,在最前面加入:

import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

另外,因为我是python 3.5,有一个

print(f’*******’)

的3.6+版本的特性我用不了,为了不报错,把文件image.py msckf.py dataset.py中的print函数的输出都改掉不要f就行了。

最后需要注意的,一个是:

path/to/your/EuRoC_MAV_dataset/MH_01_easy

指向的是文件夹式的数据集,而不是rosbag,毕竟作者剥离了ros。

另外就是这只是一个演示性质的python包,你会发现/stereo_msckf/config.py里边把参数都固定了,只针对/stereo_msckf/README里提到的数据集。

最终演示效果:

效果