最近在看滤波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里提到的数据集。
最终演示效果: