視覺SLAM十四講---第三講三維空間剛體運動

視覺SLAM十四講---第三講三維空間剛體運動

我們說向量的組成一般指的是向量的座標
首先需要定義座標系,根據右手系建立。

三個向量張成整個空間,然後可以通過線性組合表示向量。

向量之間的運算,可以直接對座標進行運算。
加減,內積,外積(向量張成的平行四邊形的面積)
在這裏插入圖片描述
反對稱矩陣a^.

座標系之間如何變化?

三維空間的剛體運動

平移很簡單
對於旋轉
對於空間中一個向量
在這裏插入圖片描述
在這裏插入圖片描述
因爲對於同一個座標來說,不同軸之間是相互正交的,因此左邊得到一個單位矩陣

這裏首先是向量不變,座標系旋轉。然後經過左乘變成單位矩陣以後,就可以轉換爲在原來座標系下的向量旋轉。

旋轉矩陣是一個正交矩陣,行列式是+1.
又叫特殊正交羣

旋轉矩陣定義了一種旋轉
在這裏插入圖片描述
齊次變換矩陣
在這裏插入圖片描述
齊次座標矩陣特殊歐式羣
其次座標矩陣的逆
在這裏插入圖片描述

操作環境EIGEN
eigen是隻有頭文件,沒有源文件,因此只需要在cmakelists中引用庫就可以,不需要鏈接。

這裏的意思主要是,沒有提供實現功能的函數定義,也就是說只有定義類型的文件是可以只有頭文件的
同時在目錄下打開後發現有程序中頭文件和src文件夾,打開後發現src文件夾中放的是頭文件中引用的頭文件函數定義。

eigen是在c++下的矩陣庫
首先需要安裝,發現已經裝好

sudo apt-get install libeigen3-dev

位置在/usr/include/eigens

和matlab比較像,數據都是矩陣的形式
可以定義固定大小的尺寸和動態的尺寸兩種,使用固定大小的尺寸的代碼是可以加速的。

聲明尺寸

Eigen::Matrix<float, 2, 3> a_matrix;

對於小矩陣,可以直接調用eigen中定義好的,比如Matrix3f a;

然後初始化矩陣

輸入數據是按照順序輸入的

matrix_23 <<1,2,3,4,5,6;

訪問數據可以用小括號運算符matrix_23(1,2),對於向量可以用中括號運算符。

矩陣相乘必須同維,同類型,這裏與c++中不同,c++可以自動升級。

例如:不同維
在這裏插入圖片描述
可以求和,求轉置,逆,行列式,特徵值分解等操作

可以解方程
AX=B
求逆或者用QR分解計算

旋轉矩陣:旋轉有三個自由度,但是用9個元素去描述,因此6個是約束條件。

旋轉矩陣有時候比較麻煩,可以用旋轉向量表示,而且就是三個量表示,沒有約束。
繞某個軸轉一定角度。

旋轉向量和旋轉矩陣通過羅德里格斯公式聯繫:
在這裏插入圖片描述
當知道旋轉矩陣以後,旋轉向量的軸就是旋轉矩陣特徵值爲1的特徵向量

歐拉角:
形象的表示,從人的角度取看旋轉,通常用於人機交互中。
將旋轉分解爲三次不同軸的旋轉。
繞z軸轉,是偏航角;
再繞轉動之後的y軸轉,俯仰角;
再繞旋轉之後的x軸轉,滾轉角。
yaw-pitch-roll是常見的歐拉角。
但是存在萬向鎖,當第二次旋轉把x轉到之前z的反方向。因此第三次轉的時候就和第一次一樣了。少了一個自由度。因此很少用歐拉角表示位姿。

四元數:
緊湊,沒有奇異
對於複數,如果乘以一個虛數表示逆時針旋轉90度
四元數具有三個虛部,可以表示三維空間的旋轉
在這裏插入圖片描述
四元數本身支持計算
在這裏插入圖片描述
四元數與旋轉向量的關係
在這裏插入圖片描述
怎麼用四元數轉一個空間點
任何一個虛的四元數都可以表示一個空間點
在這裏插入圖片描述
但是經過四元數作用的結果往往得到的是一個四維的數,因此需要將實部轉換得到0
在這裏插入圖片描述
當然也等於直接RP

四元數優點:緊湊,無奇異。

eigen中幾何表示
代碼在上節課中展示的github中下載,代碼解釋見代碼。

c++中重載:
函數重載
同樣代碼中用到了運算符重載,具體代碼在頭文件中都有定義。
.xxx(),表示成員函數

可視化
首先安裝pangolin,具體見高翔老師github下壓縮包。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章