為什麼SLAM中很多使用四元數而不使用李代數?優勢是什麼?

時間 2021-06-03 16:11:43

1樓:wuRDmemory

樓主的問題不太對吧?樓主應該問為什麼用四元數而不是李群吧?

李代數是李群在么元處的切空間,其實本質上也是矩陣([a]^組成的空間),雖然很多書都說可以把李代數看做乙個向量空間,但是實際上李代數是乙個反對稱矩陣組成的空間,只不過兩者一一對應;

而通常SLAM中優化問題解得增量是旋轉向量,可不是真正意義上的李代數,而旋轉向量與四元數之間的轉換關係更簡單,僅僅就是除2並進行三角函式運算;

那麼退一步,如果樓主問的是為什麼不用旋轉向量而是用四元數?

個人認為是說

1. 旋轉向量雖然是最小表示,但真正在做向量旋轉時候還是要用旋轉矩陣,所以還是要把旋轉向量通過羅德里格斯公式變為旋轉矩陣,而四元數有現成的運算;

2. 求得增量之後四元數的更新也比李群表示的更新方便快捷很多,同時四元數僅僅存四個數就可以,比儲存李群那樣的矩陣要方便一些;

3. 從便於理解的角度來說,我們最容易感受的其實是尤拉角,而不是旋轉向量表示的給你乙個旋轉軸和旋轉角度,那麼從這個角度出發,四元數依舊是直接的公式,而旋轉向量依舊需要一步羅德里格斯公式;

總結來說,我個人認為兩者皆可表示旋轉,只不過四元數有更多現成的運算,不必像旋轉向量(或者樓主所說的李代數)一樣處處羅德里格斯。

最後還需要說明一下的是,李代數必須是李群(也就是旋轉矩陣)在么元處的切空間,如果用李代數就意味著你演算法後續的擾動都是在global系下的,而不能是local系下的,這點要特別注意。

2樓:成風醉雅

其實兩種方式都有,李代數的底層實現一般也是使用四元數,比如說Sophus。

個人認為李代數(包括李群)在做矩陣運算包括優化時更直觀,我一般都用李代數。

3樓:BigWaterMelon

在工程上,四元數和矩陣形式相比有以下好處:

僅需四個浮點數表示。占用記憶體比旋轉矩陣更小,乘積操作更快。

可以用向量形式表徵。適合整合在卡爾曼濾波類演算法中,更新時可使用計算成本較低的加和操作(仍需一步矯正,使其滿足模長為1的約束)。

一些球面差值的表示式更簡潔。

為什麼四元數沒有乘法交換律?

事實上,可以證明有限維可除交換含麼R 代數只有R和C這兩種。以下是sketch of proof。詳詢Hatcher的代數拓撲173頁Theorem 2B.5.1 設上有乙個可除交換含麼R 代數結構,則考慮對映,請驗證這個對映是連續的 trivial 然後自然有,從而我們誘導了乙個商對映。2 可除交...

為什麼很多OIer ACMer不使用vector而使用陣列?

慢。類似的問題還有 為什麼不用set map替代平衡樹 申請新空間的速度真是感人。類似的習慣還有 寫線段樹之類的時候,先建乙個記憶體池,新建節點的時候直接從裡面取,不要申請新的單元 vector最大特性就是動態長度,也就是自動擴容。用不上這個特性的話可以直接退化為new個陣列。至於為什麼用陣列不用n...

為什麼Malab使用迴圈要慢很多?

starseeker 很重要的乙個原因是y的長度沒有固定,每次matlab需要重新給他分配記憶體導致了速度很慢。我舉乙個例子 x rand 10000000,1 tic for i 1 length x y i exp x i end toc Elapsed time is 2.831120 sec...