2017/08/05

LSD-SLAMの特徴

こんにちは!

に導入したLSD-SLAMの特徴について書きたいと思います!




まず,LSD-SLAMは,こんな感じのやつです.



特徴ベースとDirectの話


ORB-SLAMやPTAMのような,マップを特徴的な点のみからあらわす(特徴ベース)のSLAMと違い,DirectなSLAMは直接輝度をマップに反映したり,自己位置推定に用いているので,作成される地図が目で見てわかりやすい(傾向が強い)です.

*厳密には,目で見てわかりやすいのはdirectであることよりも,密であることの影響である.だが,directであるものは密で,特徴ベースのものは逆に疎であることがほとんど.密な地図は再利用性が高くなります.

直接(directに)輝度を用いることで,点ではなくて線でデータを扱うことができます.面ではなくて線なのは,全部の輝度を使うと計算負荷が高いので輝度勾配の高いところをデータとして扱っているからです.DTAMという手法は,全輝度のデータを扱うので面です

特徴ベースのSLAMは輝度を特徴点に「変換」しており,さらに「一部」のデータしか用いないため,情報がそぎ落とされます.また,カメラから遠すぎる特徴点,近すぎる特徴点の一致を得ることはできません.directな手法ならばそれらの欠点をとりのぞくことができる!ということです.

実際,directな手法がのほうが,精度がよいとされます.(ORB-SLAMにLSD-SLAMは精度で負けるので一概には言えない).

特徴ベースのSLAMでは,特徴点の抽出に計算時間のかなりの部分をもっていかれますが,DirectなSLAMではそこには時間が割かれません.しかし,大量のデータを扱うため,結局Directな手法のほうが時間がかかる傾向にあります.

directな手法はカメラの,測定距離に限りがない,密な面のデータを得られるといったレーザとは違う利点を生かした手法といえます.あと使っていない情報は天気や表情など,距離以外の情報もとれるってことかな.

LSD-SLAMはDirectな手法の中でどんな立ち位置なのかって話


LSD-SLAMはSLAMとしての機能を一通りそろえた,directなSLAMのとりあえずの完成形といっていいような気がします.というのも,これまでに出た主なdirectなSLAMは,GPUを用いて,すべての画素を扱ったDTAM,CPUでDirectなSLAMを行ったが,特徴点の力を借りざるを得なかった(なのでSemi-Directといわれる)SVOで,どちらもLoop Closureを持たなかったし,それほど広い環境では動作できませんでした.

LSD-SLAMはSVOを発展させ,完全にDirectに!CPUで(スマホ程度でも)!大規模で!マップも見やすく!SLAMを実装しました.ただ,Loop Closureは特徴点に頼ってますけど.directにLoop Closureできる方法はいつ出るんだろう.もうでてるのかな?Deep Learningの発展形になる気がする.


アルゴリズムの話

で,アルゴリズムは

引用:J. Engel, T.Schöps, and D.Cremers. “LSD-SLAM: large-scale direct monocular SLAM,” Computer Vision–ECCV, springer international publishing, pp.834-849, 2014.

上図に示す通りになります.

LSD-SLAMもまた,PTAMの流れを汲み,マップ作成(Depth Map Estimation)と自己位置推定(Tracking)を並列して別スレッドで行います.

マップはここで局所的なものであり,全体の整合性を保つために,マップ全体最適化のスレッド(Map Optimization)も動作する.


以下説明するけど,

あまりメインとしてあつかわなかったので疑ってかかってください.

マップ表現

キーフレーム(KF)群からなるpose graph(姿勢のグラフ)です.各KFには,逆depth map(KFの各pixelがどれくらいの距離にあるか,の逆数),逆depthの分散,画像をそれぞれ紐づけます.depth mapは強度勾配が高いところのみを計算する.ゆえにsemi-denseといわれる.キーフレーム同士は距離と向き,共分散行列で結ばれている.

初期化

まず,最初のキーフレームにランダムな大きな分散の各画素のDepth(距離)を表した,Depth Mapを関連付けます.最初の数秒で十分に距離カメラを並進運動すれば妥当な初期値に収束するので,そこで初期化完了とします.

Tracking thread

キーフレームから見た現在のカメラの姿勢を前フレームを初期値として測光誤差を最小化することで計算.
測光誤差最小化っていうのは...カメラが少し移動しても同じ場所は同じ輝度であるはずだと考える.ある画像Aからある画像Bに移動したとき,対応するpixelならば,その輝度差は0に近い.運動が確定すれば,対応する点同士がわかる.よって,注目する点に関して,全体の輝度差を最小化する姿勢を採用する.

分散で重み付けした(測光誤差+depth誤差)っていうのがSVOと比べると特徴的.
うーん,たぶん図とか式とか見たほうがわかりやすいので示しとく.たぶんこんな感じ?

目的

手順


Depth Map Estimation

カメラが閾値よりも激しく動いた場合キーフレーム(KF)であるとする.
近接するKFに投影されている特徴点を現在フレームに投影することで新しいKFとなる.

カメラが閾値よりも小さく動いた場合,KFをrefine(修正的な)する
SVOで提案されたように,フィルタリングを行う.

depthの推定自体はたぶん以下のような感じでやってるはず??

目的

手順





MAP Optimization

KFが置き換わった時,相似変換(スケール変化)を計算してglobal map(全体のマップ)にdepth mapを反映する.
ループ閉鎖もここで行う.ループ閉鎖検出にはFAB-MAP→reciprocal tracking checkを行い,判断する.reciprocal tracking checkとは例えばフレームiとフレームjがループ閉鎖と判断されたらi→jのトラッキング,j→iのトラッキングを行い,同じような姿勢変換になったら同じだと判断する感じのやつ.
これらの作業をしていない時は常に,pose-graphの最適化(g2oが有名)を回し続け,MAPを最適化し続ける.

以上です,また!







0 件のコメント:

コメントを投稿