一
我們說向量的組成一般指的是向量的座標
首先需要定義座標系,根據右手系建立。
三個向量張成整個空間,然後可以通過線性組合表示向量。
向量之間的運算,可以直接對座標進行運算。
加減,內積,外積(向量張成的平行四邊形的面積)
反對稱矩陣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下壓縮包。