Extended Kalman Filter based Monocular SLAM
Real-Time Single Camera SLAM 单目摄像头的3D运动轨迹的算法
本文设计了一种可以实时复现在未知场景里随机运动的单目摄像头的3D运动轨迹的算法。
我们叫这个系统为MonoSLAM,它是第一个成功地利用一个移动端的不可控制的摄像头获得“纯粹的视觉”的系统
,在用移动的方法无法预知接口的情况下可以达到实时且无漂亮的表现。
这个方法的核心是在一个概率框架内实时在线地创建一些稀疏但持久的自然landmark。
关键贡献点包括一种映射和测量的积极的方式,一种为摄像头平滑运动设计的通用移动模型的使用,
以及单目特征初始化和特征方向估计的解决方案。
综合以上,我们设计了非常有效和鲁棒的算法,
在普通PC和摄像头可以运行到30HZ。 这些工作扩展了robotic系统的范围,也开辟了SLAM在其中应用的大门。
最后我们把MonoSLAM应用于高性能全自由度的仿人机器人和人手持摄像头的增强现实中。
Please also refer to the following links; http://hanmekim.blogspot.com/2012/10/scenelib2-monoslam-open-source-library.html https://github.com/hanmekim/SceneLib2
- What is SceneLib2? *
SceneLib2 is an open-source C++ library for SLAM originally designed and implemented by Andrew Davison and colleagues at the University of Oxford.
- Why is it named SceneLib2? *
His version, SceneLib 1.0, was released with full source code under the LGPL, and as SceneLib2 is a reimplemented version of it, I gave the same name with a new version number to this library.
- Why is it reimplemented? *
I reimplemented his version with the following objectives;
- Understand his MonoSLAM algorithm in code level.
- Replace older libraries (i.e. VW34, GLOW, VNL, Pthread) with newer ones (Pangolin, Eigen3, Boost).
- Support USB camera instead of IEEE1394.
- Make it more portable and convenient by using CMake and git repository.
- Implementation *
I tried to make it as same as the original version, so that I can easily find any problems that I might have introduced to it by accident (I didn't even change most of functions' and variables' name). But, at the same time, I also tried to make it easier to understand by using different class architectures and various changes.
To give you the same executable example program like MonoSLAMGlow in SceneLib 1.0, I implemented a very similar one called MonoSlamSenceLib1, and again I tried to make it as same as the original version.
- Notes and Warnings *
Even though my intention is to make it as a cross-platform library, I only added and tested it for the following platforms, but, of course, I will increase its portability continuously (you can check the following platforms list later on).
- Ubuntu 12.04 LTS - 32bits
- Ubuntu 12.04 LTS - 64bits (thanks to Prof. Davison for testing it)
- Ubuntu 12.10 - 64bits
- Ubuntu 14.04 LTS - 64bits
- Mac OS X 10.9
- Mac OS X 10.10
This library is a research-level software which is still in development. It will be frequently changed without notification to fix bugs, to add more features and to make it better.
- Installation *
-
Install various development related packages $ sudo apt-get install build-essential $ sudo apt-get install git cmake $ sudo apt-get install freeglut3-dev libglu-dev libglew-dev $ sudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev
-
Install Engen3 $ sudo apt-get install libeigen3-dev
-
Install Boost $ sudo apt-get install libboost-all-dev
-
Install OpenCV $ cd MY_EXTERNAL_LIBRARIES_DIRECTORY $ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2 $ tar xvf OpenCV-2.4.2.tar.bz2 $ cd OpenCV-2.4.2 $ mkdir BUILD $ cd BUILD $ cmake .. $ make -j4 $ sudo make install
-
Install Pangolin $ cd MY_EXTERNAL_LIBRARIES_DIRECTORY $ git clone https://github.com/stevenlovegrove/Pangolin.git $ cd Pangolin $ mkdir BUILD $ cd BUILD $ cmake .. $ make -j4 $ sudo make install
-
Install SceneLib2 $ cd MY_WORK_DIRECTORY $ git clone git://github.com/hanmekim/SceneLib2.git SceneLib2 $ cd SceneLib2 $ mkdir BUILD $ cd BUILD $ cmake .. $ make -j4
-
Download an example image sequence $ cd MY_IMAGE_DIRECTORY $ wget www.doc.ic.ac.uk/~ajd/Scene/Release/testseqmonoslam.tar.gz $ tar xvf testseqmonoslam.tar.gz
- How to use *
1-1. Modify the configuration file to use the example image sequence $ gedit MY_WORK_DIRECTORY/SceneLib2/data/SceneLib2.cfg
input.mode = 0; input.name = MY_IMAGE_DIRECTORY/TestSeqMonoSLAM;
cam.width = 320; cam.height = 240; cam.fku = 195; cam.fkv = 195; cam.u0 = 162; cam.v0 = 125; cam.kd1 = 9e-06; cam.sd = 1;
1-2. Modify the configuration file to use a USB camera $ gedit MY_WORK_DIRECTORY/SceneLib2/data/SceneLib2.cfg
input.mode = 1;
input.name = convert:[fmt=RGB24]//v4l:///dev/video[number];
cam.width = 320; cam.height = 240; cam.fku = 195; cam.fkv = 195; cam.u0 = 162; cam.v0 = 125; cam.kd1 = 1e-12; cam.sd = 1;
- Run MonoSlamSceneLib1 $ cd MY_WORK_DIRECTORY/SceneLib2/BUILD/examples $ ./MonoSlamSceneLib1
- Known issues *
There are known issues, and they will be resolved as soon as possible.
- Detected features are slightly different to the original version's.
- Most of member functions and variables are currently public for convenient debugging, and they will be properly encapsulated later.
- Thanks to *
I really appreciate Professor Andrew Davison for sharing his great achievement, and I promise him that I will share every findings based on this to help others who are interested in this field as he is doing continuously in various ways. Thank you.