四元數是復數的一種擴展,或叫超復數,記作一個標量加上一個向量:
其中,
,
,正交復數
,
,
的定義如下
我們將一個四元數表示為
早期反對四元數的一-個理由是其乘法不可交換,但正如我們在上面看到的,這種不可交換性正好符合坐標系旋轉的情況。除去最初的爭論不說,四元數以其格式優雅、功能強大、計算簡單已被廣泛應用於機器人、計算機視覺、計算機圖形學以及航空航天慣性導航領域。
在機器人工具箱中,四元數是由名為Quaternion
的類來實現的。構造函數將傳遞的參數轉換為四元數,例如:
>> q = Quaternion(rpy2tr(0.1, 0.2, 0.3))
q =
0.98186 < 0.064071, 0.091158, 0.15344 >
為了描述坐標系的旋轉,我們使用單位四元數。這些四元數為一個單位大小,即 或 。例如:
>> q.norm
ans =
1
單位四元數具有一個特殊屬性,它可以被看作是繞單位向量
旋轉了
角,該旋轉與四元數組的關系為
與繞任意向量旋轉相似。
Quaternion
類可以重載一些標准方法和函數。四元數的乘法通過重載乘法運算符調用:
>> q = q * q;
求一個四元數的共軛為
>> q.inv()
ans =
0.98186 < -0.064071, -0.091158, -0.15344 >
一個四元數乘以它的逆四元數為
>> q * q.inv()
ans =
1 < 0, 0, 0 >
或者
>> q / q
ans =
1 < 0, 0, 0 >
得出一個單位四元數,它代表一個無效旋轉。
一個四元數可以用以下方式轉化為一個正交旋轉矩陣:
>> q.R
ans =
0.9363 -0.2896 0.1987
0.3130 0.9447 -0.0978
-0.1593 0.1538 0.9752
我們也可以用以下函數繪制一個四元數所指的方向:
>> q.plot()
在四元數的情況下,廣義位姿是
,且
上式被稱為四元數積或漢密爾頓積,並有
這是四元數的共軛。零位姿
,為單位四元數。一個向量
被旋轉,表示為
,其中
被稱為純四元數。
將一個三元向量傳遞給構造函數,將產生一個純四元數:
>> Quaternion([1 2 3])
ans =
0 < 1, 2, 3 >
其中的標量為 。使用重載的乘法運算符,一個向量可以被一個四元數旋轉:
>> q*[1 0 0]'
ans =
0.9363
0.3130
-0.1593