GTSAM學習(一) 自定義Factor

2021-09-02 18:16:29 字數 1143 閱讀 7436

開始上手折騰gtsam,gtsam是乙個基於因子圖模型非常完整的優化庫,在多感測器融合領域有非常重要的意義。gtsam裡有許多已經定義好的因子比如imufactor, 相機投影因子等等,但是當需要用到gtsam沒有的因時,也可以自定義。

每次學乙個優化庫,我都會從乙個曲線擬合的例子開始。曲線方程為:f(x

)=em

x+

cf(x) = e^

f(x)=e

mx+c

,令m,c的真實值分為0.3,0.1,取樣一組帶雜訊的資料

n\left\_n

n​,然後去估計m,c的值。

gtsam的自定義factor必須繼承public gtsam::noisemodelfactor(n),如果是一元邊,就是noisemodelfactor1,二元邊就是noisemodelfactor2,以此類推。類內要初始化建構函式,定義evaluateerror(),這個函式是父類的虛函式,用於定義雅克比矩陣和誤差向量。在處理這部分時遇到了一些問題,對於上述曲線擬合的例子來說,誤差向量就一維,狀態向量2維,那麼雅克比矩陣就是h1×

2h_

h1×2

​,對應**為以下**中注釋的部分,而在實際這麼設定後執行程式時會報錯,必須把返回的誤差向量設定為2維,雅克比矩陣設定為2x2才能執行,於是我把多餘部分的資料就賦0了,這樣之後給出的結果也是正確的。

class curvefitfactor:public gtsam::noisemodelfactor1

virtual ~curvefitfactor() {}

vector evaluateerror(const vector2& q, boost::optionalh = boost::none) const

virtual gtsam::nonlinea***ctor::shared_ptr clone() const

};

gtsam裡的優化器一共三種:levenbergmarquardtoptimizer, doglegoptimizer和gaussnewtonoptimizer,三種都測試了一下,發現doglegoptimizer有比較魯邦的表現,gn和lm需要在初值相近的時候才會給出正確結果,當初值為m=0,c=0時,gn和lm給出的結果就跑偏了,而dogleg在初值為0的情況下依然能返回相對正確的結果。

自定義註解的學習 一

註解 annotation 也叫元資料。一種 級別的說明。它是jdk5.0及以後版本引入的乙個特性,與類 介面 列舉是在同乙個層次。它可以宣告在包 類 字段 方法 區域性變數 方法引數等的前面,用來對這些元素進行說明,注釋。自定義註解類似於介面,為了區分與介面的區別,們需要將它宣告為 inte ce...

自定義元件 學習

通過對android的學習,大家都知道,谷歌提供的api demo的一些基本元件雖然很豐富,但遠遠滿足不了我們設計華麗介面的需求,所以這就需要我們自己來定義我們所需要的元件.還好谷歌提供一些自定義控制項的一些方法.現將本人從網上收集以及本人學習的自定義控制項的使用方法列下,供各位參考,如有不妥之處歡...

自定義View Canvas Paint學習

主要學習blog 步驟1 建立乙個畫筆 private paint mpaint new paint 步驟2 初始化畫筆 根據需求設定畫筆的各種屬性,具體如下 private void initpaint 步驟3 在建構函式中初始化 public carsonview context context...