ROS四元數初探

2021-09-27 12:34:35 字數 3560 閱讀 9677

**

## ros四元數初探

**把四元數看做乙個標量和乙個3維向量的組合。實部w表示標量,虛部表示向量標記為v或三個單獨的分量(x,y,z),則四元數可以記為[ w, v]或[ w,(x,y,z)]也可以計為[v,w]或[(x,y,z),w]。

任意乙個四元數可以表示為:

q=[x,y,z,w]

=xi+yj+zk+w

其中,虛部規則

i^2=j^2=k^2=ijk=−1,

ij=k, ji=-k,

jk=i, kj=-i,

ki=j, ik=-j,

注意ij=k,但是ji≠k。四元數的長度(模長)表示為∥q∥=sqrt(x^2+y^2+z^2+w^2),通常將四元數規一化(normalized),即:

q=[x/∥q∥, y/∥q∥, z/∥q∥; w/∥q∥]

四元數本質上是複數(complex number),複數就存在乙個共軛的概念。若兩個複數的實部相等,虛部互為相反數,則稱這兩個複數互為共軛(conjugate),q的共軛複數q∗表示為:q∗=

[−x,−y,−z,w]

**四元數的逆**

q^−1=q∗/∥q∥^2

單位四元數摸的平方==1,它的逆:

q^−1=q∗

四元數間的運算,遵循複數間運算法則。

**乘法**

乘法是把qa=

[sa,va]

=[sa,xa,ya,za]

的每一項與qb=

[sb,vb]

=[sb,xb,yb,zb]每項相乘,最後相加,虛部要按照虛部規則進行:

qa qb=sa sb − xa xb − ya yb − za zb

+(sa xb + xa sb + ya zb − za yb)i

+(sa yb − xa zb + ya sb + za xb)j

+(sa zb + xa yb − xb ya + za sb)k

雖然稍為複雜,但形式上也是整齊有序的。如果寫成向量形式並利用內外積運算,該表達會更加簡潔:

qa qb=

[sa sb−va⋅vb+ sa vb+sb va+va×vb]

加深記憶換個代號再重複一遍

例如有q1=

[x1,y1,z1,w1]

;q2=

[x2,y2,z2,w2]

則q1 * q2 =

(w1*w2 - x1*x2 - y1*y2 - z1*z2) +

(w1*x2 + x1*w2 + y1*z2 - z1*y2) i +

(w1*y2 - x1*z2 + y1*w2 + z1*x2) j +

(w1*z2 + x1*y2 - y1*x2 + z1*w2) k

由於q = w + x i + y j + z k中可以分為純量w與向量x i + y j + z k,所以為了方便表示,將q表示為(s, v),其中s表示純量w,v表示向量x i + y j + z k,所以四元數乘法又可以表示為:

q1 * q2 =

(s1 + v1)*(s2 + v2)

= s1*s2 - v1.v2 + v1xv2 + s1*v2 + s2*v1

## **用四元數表示旋轉**

三維空間上任意的伸縮旋轉變換可用四元數的乘積來表示。

如果已知乙個三維空間的伸縮旋轉的轉軸u=

[α, β, γ]、旋轉角度θ和伸縮比例 t,來求相應的四元數.

旋轉的軸是(α, β, γ)已經歸一化,即( α^2 + β^2 + γ^2 = 1),

q=sqrt(t) [cos(θ/2)

; α sin(θ/2), β sin(θ/2), γ sin(θ/2)

]一般t==1時,即放縮比例為1時

q =[cos(θ/2)

; α sin(θ/2), β sin(θ/2), γ sin(θ/2)

]相反,給定乙個四元數q=

[x,y,z,w],∥q∥=1,求出它表示的旋轉軸和角度,如下所示:

u=(x/sqrt(1−w^2), y/sqrt(1−w^2), z/sqrt(1−w^2)

)θ=2⋅acos(w)

其中,若w=±1,則q表示繞著任意軸旋轉0度。

設存在乙個向量u=

(ux,uy,uz)和乙個四元數q=

[v,θ],∥q∥=1,v=

(α, β, γ),把向量u進行q旋轉變換,得到新向量u1,可以表示為:

u1=q[ux,uy,uz,0]q∗

u1=[α, β, γ,θ]

[ux,uy,uz,0]

[-α, -β, -γ,θ]

若向量u2進行四元數q的變換後得到向量u,則u2(u對q的逆變換)可以表示為:

u2=q∗[ux,uy,uz,0]q

u2=[-α, -β, -γ,θ]

[ux,uy,uz,0]

[α, β, γ,θ]

**## 四元數的插值

**這裡的插值指的是球面線性插值。

設t是乙個在0到1之間的變數。我們想要基於t求q1到q2之間插值後四元數q。它的公式是:

q3 =

(sin((

1-t)a)

/sin(a))

q1 + (sin((ta)

/sin(a))

q2)q = q3/|q3|,即單位化

**四元數到旋轉矩陣的轉換**

設四元數q=q0+q1i+q2j+q3k

,對應的旋轉矩陣r

為:r=

|1−2q2^2−2q3^2 2q1q2+2q0q3 2q1q3−2q0q2|

|2q1q2−2q0q3 1−2q1^2−2q3^2 2q2q3+2q0q1|

|2q1q3+2q0q2 2q2q3−2q0q1 1−2q1^2−2q2^2|

反之,由旋轉矩陣到四元數的轉換如下。假設矩陣為r=

,i,j∈[1,2,3]

,其對應的四元數q由下式給出:

q0=sqrt(tr(r)+1)/2,

q1=(m23−m32)/4q0,

q2=(m31−m13)/4q0,

q3=(m12−m21)/4q0

值得一提的是,由於q和−q

表示同乙個旋轉,事實上乙個r的四元數表示並不是惟一的,存在其他三種與上式類似的計算方式。實際程式設計中,當q0接近0時,其餘三個分量會非常大,導致解不穩定,此時會考慮使用剩下的幾種方式計算。

**`**尤拉角到四元數:**`

**給定乙個尤拉旋轉(x, y, z)(即分別繞x軸、y軸和z軸旋轉x、y、z度),則對應的四元數為:

x = sin(y/2)sin(z/2)cos(x/2)+cos(y/2)cos(z/2)sin(x/2)

y = sin(y/2)cos(z/2)cos(x/2)+cos(y/2)sin(z/2)sin(x/2)

z = cos(y/2)sin(z/2)cos(x/2)-sin(y/2)cos(z/2)sin(x/2)

w = cos(y/2)cos(z/2)cos(x/2)-sin(y/2)sin(z/2)sin(x/2)

q =((x, y, z), w)

ros要學習的四元數初探

把四元數看做乙個標量和乙個3維向量的組合。實部w表示標量,虛部表示向量標記為v或三個單獨的分量 x,y,z 則四元數可以記為 w,v 或 w,x,y,z 也可以計為 v,w 或 x,y,z w 任意乙個四元數可以表示為 q x,y,z,w xi yj zk w 其中,虛部規則 i 2 j 2 k 2...

初探ros 四 node簡介

節點實際上只不過是ros包中的可執行檔案而已。ros節點使用ros客戶端庫與其他節點進行通訊。節點可以發布或訂閱主題。節點也可以提供或使用服務。ros客戶端庫允許使用不同程式語言編寫的節點進行通訊 roscore是使用ros時應該執行的第一件事。roscore 輸出結果 出現上述資訊,則代表rosc...

初探ros 一 ros安裝

在ros維基中將ros定義為 ros是乙個開放源 的機械人元作業系統。它提供了 我們對作業系統期望的服務,包括硬體抽象 低階裝置控制 常用功能的實現 程序之間 的訊息傳遞以及功能包管理。它還提供了用於在多台計算機之間獲取 構建 編寫和執行 的工具和庫。換句話說,ros包括乙個類似於作業系統的硬體抽象...