ORB-SLAM2 ソース コード分析 (単眼) - ローカル マッピング スレッド

ORB-SLAM2 ソース コード分析 (単眼) - ローカル マッピング スレッド

1. ローカル マッピング スレッドの概要

ここに画像の説明を挿入

ローカル マッピング スレッドの主な機能:
(1) 前後を接続します。トラッキング スレッドによって入力されたキーフレームを受信し、ローカル マップの最適化、冗長なキーフレームの削除などを実行し、最適化されたキーフレームを閉ループ スレッドに送信します。
(2)中期的なデータ連携を実現する。追跡スレッドでは、隣接する通常のフレームまたはキー フレームの情報のみが使用され、現在のフレームのポーズのみが最適化され、複数のポーズが一緒に最適化されることはなく、マップ ポイントも最適化されません。ローカル マッピング スレッド内の特定の共通ビュー関係を満たす複数のキー フレームとそれに対応するマップ ポイントはすべて、最適化に関与します。キーフレームのポーズとマップ ポイントをより正確にします。
(3) コモンビュー キーフレームを使用して再照合し、より多くの新しいマップ ポイントを取得し、マップ内のマップ ポイントの数を増やすと、追跡の安定性が向上します。
(4) 冗長なキーフレームを削除すると、ローカル BA の規模と時間を削減できます。リアルタイムのパフォーマンスを向上させます。
トラッキングスレッドとローカルマッピングスレッドの操作範囲の比較:
ここに画像の説明を挿入

追跡スレッドでは前のフレームのデータのみが関連付けられますが、部分マッピング スレッドではすべてのキー フレームが関連付け処理に使用されます。部分
マッピング スレッドの流れは次のとおりです。

ここに画像の説明を挿入

		局部建图线程、跟踪线程、闭环线程是并行的关系

2. 冗長なマップ ポイント (MapPointCulling) とキー フレーム (KeyFrameCulling) を削除します。

冗長なマップ ポイントを削除します (MapPointCulling):
ここに画像の説明を挿入

(1) カメラの種類に応じて異なる観測閾値を設定する
ここに画像の説明を挿入

以降のマップ ポイントの検出に使用される観測数。閾値より小さい場合は、キー フレームでマップ ポイントが表示される回数が少なすぎることを意味し、マップ ポイントは削除されます。(2)新しく追加されたマップ ポイントをトラバースして確認し、
マップ ポイントを削除するかどうかを決定します。
ここに画像の説明を挿入

冗長なキーフレームの削除 (KeyFrameCulling):すべてのキーフレームを処理した後、共通ビュー内のマップ ポイントの冗長度に応じて、共通ビュー内の現在のキーフレームのキーフレームを検出するために冗長なキーフレームを削除する操作を実行します

キーフレームの表示
冗長キーフレームの判定: マップ ポイントの 90% 以上が他のキーフレーム (少なくとも 3 つ) によって観察可能
ここに画像の説明を挿入

(1) コモンビューに従って、現在のキーフレームのすべてのコモンビュー キーフレームを抽出します。
ここに画像の説明を挿入

(2) すべての共通ビュー キーフレームを横断する
ここに画像の説明を挿入

(3) コモンビュー キーフレームのすべてのマップ ポイントをトラバースします。そのうち、少なくとも 3 つの他のキーフレームで観察できるマップ ポイントは冗長マップ ポイントです。
ここに画像の説明を挿入

(4) キー フレームの有効なマップ ポイントの 90% 以上が冗長であると判断された場合、キー フレームは冗長であるとみなされ、キー フレームを削除する必要があります。
ここに画像の説明を挿入

3. 現在のフレームがキーフレームであるかどうかを確認します (NeedNewKeyFrame)

現在のフレームがキーフレームかどうかを判断します
ここに画像の説明を挿入

(1) 純粋な VO モードとローカル マップ スレッドが占有されている場合、検出は行われません。
ここに画像の説明を挿入

キー フレームが検出されると、キー フレームはローカル マップ スレッドに挿入されますが、ローカル マップ スレッドがループ クロージャ検出によって使用されている場合は挿入は行われません。
(2) 現在のマップのキーフレーム数を取得する 前回の再配置からの距離が近く、キーフレーム数が上限を超えた場合、キーフレームは挿入されません
ここに画像の説明を挿入

(3) 現在のフレーム内で他のキー フレームによって観察されたマップ ポイントの数

ここに画像の説明を挿入

(4) 現在のフレームをキーフレームとして挿入するかどうかを決定します
ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

4. キーフレーム間に新しいマップポイントを生成する(CreateNewMapPoints)

現在のキーフレームと隣接するキーフレームは、三角測量によって新しいマップ ポイントを生成し、トラッキングをより安定させます。
(1) 現在のキーフレームのコモンビュー キーフレームの中でコモンビューの度合いが最も高い nn フレームの隣接するキーフレームを見つけます。
ここに画像の説明を挿入

(2) 隣接するキー フレームを走査し、一致を検索し、エピポーラ制約を使用して不一致を排除し、最後に三角形分割します。
ここに画像の説明を挿入

(3) カメラモーションのベースラインが十分に長いかどうかを判断する
ここに画像の説明を挿入

(4) ポーズに基づいて 2 つのキーフレーム間の基本行列を計算します。
ここに画像の説明を挿入

(5) 2 つのキー フレームの不一致の特徴点をワード バッグを通じて迅速に照合し、エピポーラ制約で外れ値を抑制し、新しい一致点のペアを生成します。
ここに画像の説明を挿入

(6) Triangulate 関数と同様に、一致ペアごとに三角形分割によって 3D 点を生成します。
一致する特徴点を取り出します
。一致点の逆投影を使用して視差角を取得します
。双眼鏡の場合は、双眼鏡を使用して視差角を取得します。視差角を取得します; 単眼カメラの場合は特別な操作はありません
· 三角形分割により 3D ポイントが復元されます
· 生成された 3D ポイントがカメラの正面にあるかどうかを検出し、そうでない場合はこのポイントを破棄します
· 現在の条件下で 3D ポイントの再投影誤差を計算しますキー フレーム
· スケールの連続性をチェック
· 三角形分割により 3D ポイントが正常に生成され、構築されます。 MapPoint になります。 MapPoint
に属性を追加します
。 新しく生成されたポイントを検出キューに入れます。

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

5. 重複するマップポイントの融合(SearchInNeighbors)

すべてのキーフレームを処理した後、フュージョンでマップ ポイントの操作を繰り返します。
現在のキーフレームと隣接するフレーム (2 レベルの隣接) の間で繰り返されたマップ ポイントを確認してフュージョンします。
(1) 共通ビューで現在のキーフレームのウェイト ランキングを取得します。 nn の隣接するキーフレーム
ここに画像の説明を挿入

(2) 第 1 レベルの隣接キーフレームとその第 2 レベルの隣接キーフレームを保存する
ここに画像の説明を挿入

(3) 現在のフレームのマップ点を隣接する 2 つのキー フレームにそれぞれ投影し、一致する点に対応するマップ点を見つけて融合します。これを前方投影融合と呼びます。
ここに画像の説明を挿入

(4) 隣接する 2 つのキーフレームのマップ ポイントをそれぞれ現在のキーフレームに投影し、フュージョンの一致点に対応するマップ ポイントを見つけます。これを逆投影フュージョンと呼びます。
ここに画像の説明を挿入

(5) 現在のフレーム マップ ポイントの記述子、深度、平均観測方向、その他の属性を更新します。
ここに画像の説明を挿入

(6) 現在のフレームと他のフレームとのコモンビュー接続関係を更新する
ここに画像の説明を挿入

6. ローカルスレッド BA (LocalBundleAdjustment)

ここに画像の説明を挿入

(1) 現在のキーフレームとそのコモンビュー キーフレームをローカル キーフレームに追加します
ここに画像の説明を挿入

(2) ローカル キーフレーム (第 1 レベルで接続されている) 内のキーフレームをトラバースし、それらによって観察されるマップ ポイントをローカル マップ ポイントに追加します。
ここに画像の説明を挿入

(3) ローカル マップ ポイントによって観察できるが、ローカル キー フレーム (セカンダリ接続) に属さないキー フレームを取得します。これらのセカンダリ接続キー フレームは、ローカル BA 最適化中に最適化されません。
ここに画像の説明を挿入

(4) g2o オプティマイザーの構築
ここに画像の説明を挿入

(5) 最適化するポーズ頂点を追加: ローカルキーフレームのポーズ
ここに画像の説明を挿入

(6) 最適化されていないポーズ頂点を追加します。キーフレームのポーズを修正します。ここで vSE3->setFixed(true) が呼び出されていることに注意してください。なぜ最適化せずに追加するのでしょうか
? 回答: 制約情報を追加するため
ここに画像の説明を挿入

(7) 最適化するローカルマップポイントの頂点を追加
ここに画像の説明を挿入

(8) マップ ポイントを追加した後、関連するマップ ポイントとキーフレームのペアごとにエッジを構築します
ここに画像の説明を挿入

ここに画像の説明を挿入

(9) 2 段階で最適化を開始します。
ここに画像の説明を挿入

(10) 外れ値を検出し、次回最適化しないように設定する
ここに画像の説明を挿入

(11) 誤差の大きい外れ​​値を除外した後に再最適化 – 最適化の第 2 段階
ここに画像の説明を挿入

(12) 最適化後に誤差を再計算し、接続誤差が比較的大きいキーフレームやマップポイントを削除

ここに画像の説明を挿入
ここに画像の説明を挿入

(13) 最適化後、キーフレームの姿勢、マップ点の位置、平均観測方向などの属性を更新します。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_43391596/article/details/129692929