OpenCVでカメラ画像から自己位置認識 (Visual Odometry)

書籍ROSではじめる ロボットプログラミング」を一通り読み終わって、何となくロボットの自己位置認識の重要性を感じている。



ロボット自身の移動量を計測する手法全般を”Odometry“と言うらしい。
中でも1番簡単なやり方は、車輪などの駆動装置の回転数を加算して移動距離とみなす方法。これはWheel Odometryとか呼ばれるらしい。この手法は手軽だがもちろん欠点もあって、車輪が滑るなどして空転した分も移動量として加算されてしまう。なので、Wheel Odometryではロボットが遠くへ移動するほど、どんどん誤差が溜まってしまう。

これに対して、カメラ画像を使って自己位置認識を行うのがVisual Odometry(VO)という分野。ロボットの自己位置認識では、ステレオカメラやDepthカメラといった3Dカメラを用いたVisual Odometryの手法がたくさんあるようだ。

以前見たコレは単眼カメラで撮影した2Dの画像を用いて自己位置を認識するMonocular Visual Odometry手法の1つ↓
画像認識による位置情報取得 - Semi-Direct Monocular Visual Odometry (SVO)
今日たまたまTwitterのTLで見かけたやつ。単眼のカメラ映像からリアルタイムに位置情報を取得している。論文はこちらそして、GitHubにROSで動作するソースコードが公開されている。


この技術のすごさがやっと分かってきた。
このSVO(Semi-Direct Monocular Visual Odometry)はROSで試せるようですよ↓
http://kivantium.hateblo.jp/entry/2014/07/01/000651


スポンサーリンク


単眼カメラによるVisual Odometry技術に関するチュートリアル、およびOpenCVを使って実装したサンプルが公開されているのを知った↓
https://avisingh599.github.io/vision/visual-odometry-full/
https://avisingh599.github.io/vision/monocular-vo/


ソースコード(C++)はこちら

mono-vo

これは、OpenCV 3.0をベースにMonocular Visual Odometry手法(単眼カメラによる自己位置認識)を実装したものです。

アルゴリズム

基本行列の推定にNisterの5点アルゴリズムを使用し、トラッキングにはFAST特徴量とKanade-Lucas-Tomasi Feature Tracker(Lucas–Kanade法)を使用しています。
詳細はこちらのレポートこちらのブログ記事をご覧ください。

注意事項:
このプロジェクトはまだ相対スケールの推定精度が低いです。そのため、スケール情報はKITTIデータセットのground truthファイルから取得しています。


スポンサーリンク

見たところ、ソースコードはそれほど大規模じゃなさそうだけど、OpenCVを使うとそんなに簡単に書けちゃうものなのだろうか。
ここで出てくるKITTIデータセットというのは自動車ビジョン向けの大規模データセットらしいです↓

自動車ビジョン向けの新しい大規模データセット「KITTI Vision Benchmark Suite」



このVisual Odometry技術でロボットの移動量を正確に認識して、さらにその情報から地図を作成するところまで発展するとSLAMなんですかね。(良く解ってない)

2020年5月 追記:最近はPythonでVisual OdometryできるpySLAMというのがありますね↓
https://github.com/luigifreda/pyslam

2通りの再構成方法

カメラで撮影した連続画像(動画)から移動量を測るための再構成方法には大きく2通りあるらしい。

  • indirect (feature-based):画像から特徴点を抽出し、疎(sparse)な情報のマッチングで再構成する
  • direct:密(dense)な画素情報をそのまま使って再構成する

上記mono-voのコードは特徴点ベースだから、indirectな方法を実装しているということですね。

単眼カメラによるSLAMで有名なLSD-SLAMは、directな手法↓
http://vision.in.tum.de/research/vslam/lsdslam

LSD-SLAMのソースコードは公開されてはいるけど、まだ試せるほど知識がない。

追記:directな手法とindirectな手法を組み合わせたDirect Sparse Odometry(DSO)という手法があるらしい↓
https://vision.in.tum.de/research/vslam/dso



ソースコードもある↓
https://github.com/JakobEngel/dso

追記:第1回3D勉強会@関東でDSOについて解説されていました↓


スポンサーリンク

関連記事

html5のcanvasの可能性
PyDataTokyo主催のDeep Learning勉強会
Deep Fluids:流体シミュレーションをディープラーニングで近似する
BGSLibrary:OpenCVベースの背景差分ライブラリ
Paul Debevec
ブログをGoogle App EngineからAmazon EC2へ移行
Photogrammetry (写真測量法)
Google Colaboratoryで遊ぶ準備
CGレンダラ研究開発のためのフレームワーク『Lightmetrica (ライトメトリカ)』
Cartographer:オープンソースのSLAMライブラリ
konashiのサンプルコードを動かしてみた
Open3D:3Dデータ処理ライブラリ
ManuelBastioniLAB:人体モデリングできるBlenderアドオン
OpenCV 3.1から追加されたSfMモジュール
MFnDataとMFnAttribute
GAN (Generative Adversarial Networks):敵対的生成ネットワーク
3Dスキャンに基づくプロシージャルフェイシャルアニメーション
SSII2014 チュートリアル講演会の資料
プログラミングスキルとは何か?
書籍『OpenCV 3 プログラミングブック』を購入
MB-Lab:Blenderの人体モデリングアドオン
Math Inspector:科学計算向けビジュアルプログラミングツール
Windows10でPyTorchをインストールしてVSCodeで使う
KelpNet:C#で使える可読性重視のディープラーニングライブラリ
Mayaのプラグイン開発
Fast R-CNN:ディープラーニングによる一般物体検出手法
Adobeの手振れ補正機能『ワープスタビライザー』の秘密
UnrealCLR:Unreal Engineで.NET Coreを利用できるプラグイン
オープンソースの物理ベースGIレンダラ『appleseed』
Seleniumを使ったFXや株の自動取引
AR (Augmented Reality)とDR (Diminished Reality)
書籍『ゼロから作るDeep Learning』で自分なりに学ぶ
ブログの復旧が難航してた話
クラスの基本
UnityのTransformクラスについて調べてみた
Unity ARKitプラグインサンプルのチュートリアルを読む
Raspberry Pi 2のGPIOピン配置
Google XML Sitemap Generatorプラグインを3.4.1へダウングレード
為替レートの読み方 2WAYプライス表示
UnityでShaderの入力パラメータとして行列を渡す
オープンソースのプリント基板設計ツール『KiCad』
Managing Software Requirements: A Unified Approach

コメント

  1. […] monocular-visual-odometry-using-opencv [OpenCV][カメラ] […]

  2. […] OpenCVでカメラ画像から自己位置認識 (Visual Odometry) […]