標籤:

旋轉表示法(持續更新)

旋轉表示法(持續更新)

Note:

  • 旋轉的正方向:

使用右手坐標系統的是用右手螺旋定則定義的.

(右手拇指指向旋轉軸的正方向,其它四個手指彎曲的方向即為旋轉的方向)

旋轉矩陣:

矩陣就是變換,旋轉矩陣就是用來做旋轉操作的變換

旋轉矩陣是用來描述三維空間中兩個不同笛卡爾坐標系之間姿態(不含位置)關係的一個3×3矩陣。

描述三維空間中兩個不同笛卡爾坐標系之間姿態(不含位置)關係的方法(求真)

  1. 旋轉矩陣
  2. Rodrigues公式(一個旋轉軸+一個角度)
  3. 歐拉角
  4. 四元數

Elementary(basic) quad Rotations

旋轉矩陣一般分 3 個理解, R_x(	heta),R_y(	heta),R_z(	heta) ,分別對應繞 x,y,z 軸旋轉 	heta 角。先直接(可直接記住)寫出來如下:

R_z(	heta)=egin{pmatrix} cos(	heta)&-sin(	heta)&0\ sin(	heta)&cos(	heta)&0\ 0&0&1 end{pmatrix}

由羅德里格斯(Rodrigues)formula可以推出來這個結果R=e^{hat{w}	heta}=I+hat{w}sin	heta+hat{w}^2(1-cos	heta)in SO(3),代入 w=left[ egin{matrix}   0\  0\ 1\  end{matrix}
ight] 即可,以下同理。這是map(exp)的形式,由 一個旋轉軸+一個角度(w,	heta) onto映射到 SO(3) .

什麼是 onto

R_x(	heta)=egin{pmatrix} 1&0&0\ 0&cos(	heta)&-sin(	heta)\ 0&sin(	heta)&cos(	heta) end{pmatrix}

R_y(	heta)=egin{pmatrix} cos(	heta)&0&sin(	heta)\ 0&1&0\ -sin(	heta)&0&cos(	heta) end{pmatrix}

一個梨子:

A frame和B frame一開始重合,

B frame 先繞z-axis of B frame 轉 alpha 角度

然後 繞y-axis of B frame(New)轉 eta 角度

最後 繞z-axis of B frame(New)轉 lambda 角度

Note:

  • (alpha,eta ,lambda) 被稱為 ZYZ Euler angles,因為分別繞了 z-axis、y-axis、z-axis 旋轉。Q:這種是不是適用於四軸?而不適用於六軸?
  • R_{ab} :B frame 到 A frame 的旋轉變換

故該旋轉矩陣:

R_{ab}=


  • 二維旋轉:

現在看看複數與二維旋轉的關係:

  • 三維旋轉:

思路:旋轉的分解 overrightarrow v=overrightarrow v_{//} +overrightarrow v_{ot}

overrightarrow v_{//} =|overrightarrow v_{} |cos(	heta)  frac{overrightarrow u}{|overrightarrow u_{} |}, 其中 |overrightarrow v_{} |cos(	heta) 為其大小,  frac{overrightarrow u}{|overrightarrow u_{} |} 為其方向

egin{equation} egin{split} overrightarrow v_{//} &=|overrightarrow v_{} |cos(	heta)  frac{overrightarrow u}{|overrightarrow u_{} |}\ &=|overrightarrow v_{} | frac {overrightarrow voverrightarrow u}{|overrightarrow v||overrightarrow u|}   frac{overrightarrow u}{|overrightarrow u_{} |}\\ &=  frac {overrightarrow voverrightarrow u}{||overrightarrow u||^2}    overrightarrow u \ &=(overrightarrow voverrightarrow u )overrightarrow u end{split} end{equation}

因為 ||overrightarrow u||=1

egin{equation} egin{split} overrightarrow v_{ot}  &=overrightarrow v-overrightarrow v_{//}  \ &= overrightarrow v-(overrightarrow voverrightarrow u )overrightarrow u  end{split} end{equation}

overrightarrow v_{ot} 與旋轉軸 overrightarrow u 正交,由俯視角,可以看作是平面的旋轉。

左圖中, overrightarrow voverrightarrow voverrightarrow u 旋轉 	heta

右圖中, overrightarrow w=overrightarrow u	imes overrightarrow v_{ot} ,我們現在可以把 overrightarrow v_{ot} 投影到 overrightarrow woverrightarrow v_{ot} 上,

egin{equation} egin{split} overrightarrow v_{ot}&=overrightarrow v_{v}+overrightarrow v_{w}\ &=cos(	heta) overrightarrow v_{ot}+sin(	heta)overrightarrow w\ &=cos(	heta)overrightarrow v_{ot} +sin(	heta)(overrightarrow u 	imes overrightarrow v_{ot})  end{split} end{equation}

以下補充推導向量點乘公式(求角度餘弦):

proof:

向量 overrightarrow a , overrightarrow c 為二維向量, 	heta_1overrightarrow ax 軸的夾角,	heta_2overrightarrow cx 軸的夾角,向量 overrightarrow a , overrightarrow c 間的夾角 	heta=	heta_2-	heta_1

egin{equation} egin{split} overrightarrow a overrightarrow c &=left[ egin{matrix}   a_x\  a_y\  end{matrix}
ight] left[ egin{matrix}   b_x\  b_y\  end{matrix}
ight]  \ &=a_xb_x+a_yb_y\ &=|overrightarrow a|sin	heta_1|overrightarrow c|sin	heta_2+|overrightarrow a|cos	heta_1   |overrightarrow c|cos	heta_2                 \ &=|overrightarrow a||overrightarrow c| (sin	heta_1sin	heta_2+cos	heta_1cos	heta_2)  \ &=|overrightarrow a||overrightarrow c| cos(	heta_2-	heta_1)\  &=|overrightarrow a||overrightarrow c| cos	heta end{split} end{equation}

定理 (3D旋轉公式)

  1. (平行情況)

overrightarrow v_{//} 平行於旋轉軸 overrightarrow u 時,旋轉 	heta 角度後的 overrightarrow v_{//} 用四元數可以寫為:

overrightarrow v_{//} =overrightarrow v_{//}

2. (垂直情況)

overrightarrow v_{ot}  正交於旋轉軸 overrightarrow u 時,旋轉 	heta 角度後的 overrightarrow v_{ot} 用四元數可以寫為: overrightarrow v_{ot} =cos(	heta)overrightarrow v_{ot} +sin(	heta)(overrightarrow u 	imes overrightarrow v_{ot})

歐拉角:

歐拉角轉四元數時的單位是什麼?取值範圍是什麼?

圖示,旋轉步驟如下:

  • 物體繞全局z 軸旋轉 psi 角(因為要和世界保持聯繫,否則就和世界完全沒有關係了。)
  • 繼續繞自己X 軸旋轉 	heta
  • 最後繞自己Z 軸旋轉 phi

很顯然,按照不同的旋轉步驟,旋轉的結果是不一樣的。

會導致Gimbal-Lock ,而且依賴於三個坐標軸的選定。

局部坐標是很直觀,但是導致歐拉角有一個重大缺陷,萬向節死鎖!

要規避萬向節死鎖,需要選擇合適的旋轉順序(有12種旋轉順序),在編程中很難規避死鎖問題,所以現在很多時候都使用四元數實現旋轉。

歐拉角是用來表示三維坐標系中方向方向變換的。要指出,我們平時說的歐拉角其實還可以細分為歐拉角(Euler-angles)和泰特布萊恩角(Tait-Bryan-angles),這兩種方法都利用了笛卡爾坐標系的三軸作為旋轉軸,主要區別在於選取順序。歐拉角的選取順序有 (x, y, x), (x, z, x), (y, x, y), (y, z, y), (z, x, z), (z, y, z) 這6種,可見選取順序是a,b,a這樣的順序,也就是繞a軸旋轉某角度後,繞新生成的b軸旋轉一個角度,最後繞兩次旋轉以後的a軸再旋轉一個角度,以此表示最終的方向。泰特布萊恩角的旋轉軸選取有 (x, y, z), (x, z, y), (y, x, z), (y, z, x), (z, x, y), (z, y, x) 這6種,也就是歷遍笛卡爾坐標系的三軸,比如我們最常見到的Roll-Pitch-Yaw角就是其中 (x,y,z) 的情況。但這兩種方法,其實都是在空間中用最直觀的方式和最少的參數表示任意方向的通用方法,用它們表示方向沒有計算要求和容量需求的區別。

——出處

四元數:

四元數(Quaternions)是由愛爾蘭數學家哈密頓(William Rowan Hamilton)1843 年提出。大多數人用漢密爾頓四元數就只是做三維空間的旋轉變換。

三維空間的任意旋轉,都可以用繞三維空間的某個軸旋轉過某個角度來表示,即所謂的 Axis-Angle (軸角式)表示方法。這種表示方法里,Axis可用一個三維向量 (x,y,z) 來表示,θ可以用一個角度值來表示,直觀來講,一個四維向量 (θ,x,y,z) 就可以表示出三維空間任意的旋轉。

Note:

右手坐標系統,也就是說旋轉的正方向是用右手螺 旋定則定義的.你可以用右手拇指指向旋轉軸 overrightarrow u 的正方向,其它四個手指彎曲的方向即為旋轉的方向.

如果∥q∥ = 1,也就是說q是一個 單位四元數(UnitQuaternion),單位四元數(norm=1)則存在於四維空間的一個球面上。因為這個映射是滿射,我們可以說所有的單位四元數都對應著一個3D旋轉.或者說,一個四維單位超球面(也叫做 S^3 )上任意一點所對應的四元數(∥q∥ = 1)都對應著一個3D旋轉,這一點會在之後討論旋轉插值的時候會用到。

表格最左列中一個元素右乘以頂行中一個元素的結果就位於這兩個元素行列的交叉處

數值計算怎麼防止矩陣出現數值問題

四元數插值:

先複習一下怎麼用 四元數 旋轉 矢量 overrightarrow v_0 ,可對照下圖

只需要三步:

第一步,定義純四元數 v=(0,overrightarrow v_0)=0+xv_{0x}overrightarrow i+v_{0y}overrightarrow j+v_{0z}overrightarrow k

第二步,確定旋轉軸 overrightarrow u_t ,比如 overrightarrow u_t=(frac{1}{sqrt{14}},frac{2}{sqrt{14}},frac{3}{sqrt{14}}) ,轉過的角度 	heta=frac{pi}{3}

那麼對應的變換四元數 q= left[ egin{matrix}   cosfrac{	heta}{2}\  sinfrac{	heta}{2} overrightarrow u_{tx}\   sinfrac{	heta}{2} overrightarrow u_{ty}\   sinfrac{	heta}{2} overrightarrow u_{tz}\  end{matrix}
ight] = left[ egin{matrix}   cosfrac{pi}{6}\  sinfrac{pi}{6} frac{1}{sqrt{14}}\   sinfrac{pi}{6} frac{2}{sqrt{14}}\   sinfrac{pi}{6}frac{3}{sqrt{14}}\  end{matrix}
ight] =cosfrac{pi}{6}+sinfrac{pi}{6} frac{1}{sqrt{14}}overrightarrow i+sinfrac{pi}{6} frac{2}{sqrt{14}}overrightarrow j+sinfrac{pi}{6} frac{3}{sqrt{14}}overrightarrow k

此時它的共軛 q^*=  left[ egin{matrix}   cosfrac{	heta}{2}\  -sinfrac{	heta}{2} overrightarrow u_{tx}\  - sinfrac{	heta}{2} overrightarrow u_{ty}\  - sinfrac{	heta}{2} overrightarrow u_{tz}\  end{matrix}
ight] = left[ egin{matrix}   cosfrac{pi}{6}\  -sinfrac{pi}{6} frac{1}{sqrt{14}}\   -sinfrac{pi}{6} frac{2}{sqrt{14}}\   -sinfrac{pi}{6}frac{3}{sqrt{14}}\  end{matrix}
ight] =cosfrac{pi}{6}-sinfrac{pi}{6} frac{1}{sqrt{14}}overrightarrow i-sinfrac{pi}{6} frac{2}{sqrt{14}}overrightarrow j-sinfrac{pi}{6} frac{3}{sqrt{14}}overrightarrow k

對於單位四元數來說,它的逆 q^{-1}=q^*

第三步,進行四元數運算,則在這個旋轉下的新的坐標 v=qvq^{-1}=(0,overrightarrow v)=...

其中, qvq^{-1}=q_Lvq_R ,即對四元數 v 進行一個 q_L 的左旋轉,和一個 q_R 的右旋轉。

Note: 四元數左乘 
ot= 右乘。

那麼,依據上圖,假設設有兩個旋轉變換 q_0 = [cos(θ_0), sin(θ_0)u_0]q_1 = [cos(θ_1), sin(θ_1)u_1] ,我們希望找出一些中間變換 q_t ,讓初始變換 q_0 能夠平滑地過渡到最終變換 q_1

t 的取值可以 是 t ∈[0,1] .當 t = 0 時, q_t 等同於初始變換 q_0 ,而 t = 1 時,q_t 等同於最終變換 q_1

由於插值的對象是兩個變換,想像起來可能非常困難,我們不妨假設3D空間中有任意一個向量 overrightarrow v .那麼變換四元數 q_0 會將 overrightarrow v 變換到四元數形式的  v_0= q_0vq^? _0 ,而變換四元數q_1 會將 overrightarrow  v 變換到四元數形式的 v_1 = q_1vq^? _1 . 我們需要找出中間向量的四元數形式 v_t = q_tvq^?_ t 所對應的變換 q_t ,使 overrightarrow v 旋轉到 overrightarrow  v_0overrightarrow  v_1 中間的某個 位置 overrightarrow  v_t

我們可以看到,這個旋轉的變化量其實對應的仍是一個旋轉.它將由 q_0 變換到 v_0 的向量進一步旋轉到 v_t .這個旋轉擁有某一個固定的旋轉軸 overrightarrow u_t ,我們只需要縮放這 個變換所對應的?度 varphi 就能夠達到插值的目的了.

page38

Note: 四元數乘法的順序,和矩陣與函數的複合非常相似,都是從右往左疊加.

推薦閱讀:

TAG:四元數 | 矩陣 |