1. 程式人生 > >maplab系列10:優化框架

maplab系列10:優化框架

maplab封裝了一個基於ceres的優化框架。其中有幾個關鍵的類:

struct ProblemInformation

  • 使用者能操作的主要是這個類,裡面定義了cost_function等資訊。其實就是ceres那些介面類作為基類的各種類。
  • 定義好後使用ceres_error_terms::buildCeresProblemFromProblemInformation,把ProblemInformation的資訊轉換為ceres::Problem,就可以直接用ceres求解了。
  • parameterizations:是一個std::map,key是要優化的變數指標,value是這個變數對應的引數化。
  • 引數化是指那些不使用正常加運算的變數,比如旋轉變換。
  • parameter_bounds:每個變數能夠設定一個下邊界的限制範圍,不過大多優化問題都是無限制邊界的。
  • parameter_block_group_id:把多個變數組成不同的group,每隔group有個id。
  • active_parameter_blocks:哪些變數是對優化沒影響的。
  • ceres直接使用變數的指標作為變數的id(索引)
  • constant_parameter_blocks:哪些變數是要固定的。
  • residual_blocks:儲存每個殘差項的資訊,裡面主要是一個ResidualInformation的結構。
    • ResidualInformation中包含了:ceres::CostFunction,ceres::LossFunction,parameter_blocks等資訊。
    • 我們主要要做的就是實現各種不同的ceres::CostFunction的派生類,然後加入到residual_blocks中。
    • residual_blocks是一個map,key是ceres::CostFunction,具體什麼用,現在也不太清楚。
  • 使用addResidualBlock加入各種殘差項
  • 使用setParameterization設定個個變數的運算規則
  • 使用setParameterBlockConstant設定某個變數fix

map_optimization::constructViProblem

  • 把vi-map轉化一個BA的問題
  • 具體操作在addInertialTerms和addVisualTerms裡面
  • addVisualTerms
    • 具體邏輯在addVisualTermsForVertices裡面
      • 具體邏輯在addVisualTermForKeypoint裡面
        • 主要邏輯在ceres_error_terms::VisualReprojectionError裡面