視覚SLAM十四講-第九講ノート

11345 ワード

本論は完全なフロントエンドフレームワークを構築した.マッチングスキームでは、隣接する2つのフレームマッチング、地図マッチングの2つの方法が使用される.在位姿勢推定法には,PNP法,PNP+bundle adjustment法を用いた.このコードは,PnPであるが3 d点の深さを推定するのではなく,深さマップから取り出したポテンシャル推定と最適化のみを実現した.地図の特徴点の位置も最適化されていません.
一、プログラムフレームワーク
1.データ構造
1.1. camera
カメラ内パラメータ、座標変換を実現します.
メンバー変数
カメラ内パラメータ
メンバー関数
座標変換関数:2 dcameraworkldの3つの座標系の相互変換.
1.2. frame
フレーム(Frame)
メンバー変数
現在のフレームを含む外部パラメータ(姿勢情報)は、カラーマップの各フレームの識別情報、ID、タイムスタンプなどを李代数で表す
メンバー関数
画像中の一点とフレームのインタラクションを実現し、例えば対応する点の深さを見つけ、現在のフレーム内にあるかどうかを判断する.
1.3. maopoint
フィーチャーポイント
メンバー変数
点位置の記述情報:pos,norm,id点特徴の記述情報:descriptor点マッチングの記述情報:観察回数,正確なマッチング回数など
1.4. map
地図、すなわち特徴点の集合.このコードにはローカルマップが実装されており,すべての特徴点を加えず,現在のカメラからの距離とマッチング回数で削減されている.
メンバー変数
2つのhash listを維持し、キー値がid:フィーチャーポイントのlistキーのlist
メンバー関数
フィーチャーポイントとキーフレームの削除を実現
2.フレーム
データ構造を実装すると、プロセス全体を完了する他のファイルも必要です.
2.1. visual_odometry
voの改善プロセスを実現する.
メンバー変数
一つenum、現在voの状態を維持する[LOST,INIT,OK]二つframe、前フレームが参照フレームref_、現在フレームcurr_一つmap特徴記述関連:現在フレームの特徴点セット、マッチング点セット、特徴点記述子、特徴点対応2 d点のid_.2フレームマッチングの場合、前のフレームの特徴点の3 d座標セットを記録する必要があります.
メンバー関数
  • フロー制御addFrame.新しく来たフレームごとにマッチングと推定を行います.
  • 特徴抽出extractKeypointconputeDescriptorfeatureMatching.これら3つはopencvの関数を使用して完了します.featureMatching部分では、地図の特徴点と一致し、2フレーム間の一致であれば、前回の特徴点セットを使用します.最終的には、現在のフレームが一致する3 Dフィーチャーポイントセットと対応する2 dポイントセットが更新されます.ここで一致する点セットが一致しない可能性がある
  • 姿勢推定
  • poseEstimationPnP .まずsolvePnPRansacを用いて,マッチングした特徴点からポテンシャルを推定し,推定した回転行列,平行移動行列,内点セットを得た.内点はRansan後,正しく一致する点であることを証明した.bundle adjustmentを使用するとPnPの結果を初期値として反復最適化を行う.このステップは最終的に推定されたポテンシャル(李代数表現)を得た.
  • checkEstimatePose現在推定されているポテンシャルが十分でないことを検証するには、内点数、向きなどである.

  • 地図メンテナンス
  • optimizeMap:現在のフレームカメラが遠すぎて、向きが偏りすぎて、いつも見えるのに一致しない点を削除します.
  • addKeyFrame:このキーフレームシーケンスを維持することが何なのかわからないので、現在は使われていないようですが、後に図面やバックエンドが使われるようです.
  • addPointMaps:現在の地図の中の点が少なすぎる場合は、現在のフレームの特徴点から、地図を追加します.


  • 2.2. config
    ファイルからパラメータを読み込むことができます.さまざまなタイプのパラメータフィールドを返すテンプレートが実装されています.
    2.3. common_include
    ヘッダーファイル
    2.4. g2o_types
    反復最適化を実現した場合のg 2 o依存スキーム.computerErrorlinearizeOplusを書き換え、再投影誤差とヤコビ行列を実現した.
    2.5. run_vo
    呼び出しセクション.データ読み出しを実現し、フレームごとにvisual_に与えるodometryは,推定されたポテンシャルを得,可視化した.
    二、ファイル構造
    このファイル構造もlinuxの下のc++プロジェクトの古典的な構造で、学ぶ価値があります.
  • /include
  • /src
  • /bin:コンパイルされた実行可能ファイル
  • /libs:コンパイルされたライブラリ
  • /test:run_co.cppはここに置いて、各モジュールをテストします.
  • /config:プロファイル
  • /data
  • CMakeLists

  • 三、実現の詳細
    1. namespace
    このコードにはslamに関するすべての内容が含まれていますmyslamネーミングスペースに含まれています.
    2.スマートポインタ
    すべてのクラスには、スマートポインタメンバー変数が作成され、オブジェクトはほとんど直接作成されません.スマートポインタはメモリ管理を容易にするはずです.
    //   
    typedef std::shared_ptr<Frame> Ptr;
    ......
    //   
    myslam::Frame::Ptr curr_(new myslam::Frame);
    

    3.工場モードFrameおよびMapPointクラスではファクトリモードが使用されており、複数のインスタンスの作成が容易である.静的メンバー変数factory_id_、およびcreat関数を設定し、インスタンスを作成する必要がある場合:
    Frame::Ptr Frame::createFrame()
    {
        //     ,                  0,        , ++。
        static long factory_id = 0;
        return Frame::Ptr(new Frame(factory_id++));
    }
    

    一方factory_id_この例のidとして、コンストラクション関数にリストを初期化する.
    4 .単一モードConfigクラスは一例モードを使用し、すべてのファイルがその一例を共有する.静的なポインタを定義し、自分を指します.このポインタはnullptrに初期化されています.
    shared_ptr<Config> Config::config_ = nullptr;
    

    静的関数とプロファイルの読み込み
    static void setParameterFile(const std::string& filename);
    void Config::setParameterFile(const std::string &filename)
    {
        
        if (config_ == nullptr)
            config_ = shared_ptr<Config>(new Config);
        config_->file_ = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
        if (config_->file_.isOpened() == false)
        {
            std::cerr << "parameter file " << filename << "does not exist." << std::endl;
            config_->file_.release();
            return;
        }
    }
    

    5.命名規範
    すべてのメンバー変数のネーミングに下線curr_ref_を付け、パラメータと一時変数と区別します.
    6.リスト初期化
    リスト初期化が広く用いられている.
    Frame::Frame(long id, double time_stamp, SE3 T_c_w , Camera::Ptr camera , Mat color , Mat depth ) 
    : id_(id), time_stamp_(time_stamp), T_c_w_(T_c_w), camera_(camera), color_(color), depth_(depth)
    {
    }