天天看點

機器人學——1.7-繞任意向量旋轉

對于空間中兩個任意姿态的坐标系,總可以在空間裡找到某個軸,使其中一個坐标系繞該軸旋轉一個角度就能與另一個坐标系姿态重合。以先前使用過的一個旋轉

我們可以确定如下的一個角度和一個向量:

>> [theta, v] = tr2angvec(R)
theta =
    0.3816
v =
    0.3379    0.4807    0.8092
           

其中,

theta

是旋轉的角度大小,

v

是旋轉軸的向量。

這些資訊實際上包含在 R R R 的特征值和特征向量中。使用 MATLAB 的内部函數

eig

可以求矩陣的特征值和特征向量:

>> [v, lambda] = eig(R)
v =
   0.6655 + 0.0000i   0.6655 + 0.0000i   0.3379 + 0.0000i
  -0.1220 - 0.6079i  -0.1220 + 0.6079i   0.4807 + 0.0000i
  -0.2054 + 0.3612i  -0.2054 - 0.3612i   0.8092 + 0.0000i
lambda =
   0.9281 + 0.3724i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.9281 - 0.3724i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i   1.0000 + 0.0000i
           

矩陣

lambda

中的對角線元素即傳回的特征值,其相應的特征向量位于矩陣

v

中對應的列向量。

一個正交旋轉矩陣總有一個實特征值 λ = 1 \lambda=1 λ=1,以及一對共轭複特征值 λ = cos ⁡ θ ± i sin ⁡ θ \lambda=\cos\theta\pm i\sin\theta λ=cosθ±isinθ,其中 θ \theta θ 代表旋轉的角度。根據特征值和特征向量的定義有

R v = λ v Rv=\lambda v Rv=λv其中, v v v 是對應于 λ \lambda λ 的特征向量。當 λ = 1 \lambda=1 λ=1 時:

R v = v Rv=v Rv=v這意味着對應的這個特征向量 v v v 是不随旋轉發生改變的。這樣的向量隻有一個,而旋轉就是以這個向量為軸發生的。上面的例子中第三個特征值等于 1 1 1,是以旋轉軸應是矩陣 v v v 中的第三列。

反過來,使用羅德裡格斯(Rodrigues)旋轉方程,可以從角度和向量計算出相應的旋轉矩陣:

R = I 3 × 3 + sin ⁡ θ S ( v ) + ( 1 − cos ⁡ θ ) ( v v T − I 3 × 3 ) R = I_{3\times 3}+\sin\theta S(v)+(1-\cos\theta)(vv^T-I_{3\times 3}) R=I3×3​+sinθS(v)+(1−cosθ)(vvT−I3×3​)其中 S ( v ) S(v) S(v) 表示 v v v 的斜對稱矩陣形式。

前面我們熟悉的一個繞 x x x 軸旋轉 π / 2 \pi/2 π/2 的例子,其旋轉矩陣為

>> angvec2r(pi/2, [1 0 0])
ans =
    1.0000         0         0
         0    0.0000   -1.0000
         0    1.0000    0.0000
           

我們注意到,繞任意軸旋轉這種表示法都可以參數化為4個數字:3個代表旋轉軸,1個代表旋轉角度。然而,空間中的方向可以用一個隻有兩個獨立參數的機關向量表示,因為第三個元素可以由下式計算:

v 3 = 1 − v 1 2 − v 2 2 v_3=\sqrt{1-v_1^2-v_2^2} v3​=1−v12​−v22​

這樣真正獨立的參數隻有3個。或者,我們也可以把機關向量和角度相乘,得到另外一種3個參數的表示方法 v θ v\theta vθ。雖然這些表示方法對于資料存儲來說是最小和最高效的,但在分析研究時是存在問題的。其他學者還提出過多種變形,包括 v sin ⁡ ( θ / 2 ) v\sin(\theta/2) vsin(θ/2) 和 v tan ⁡ ( θ ) v\tan(\theta) vtan(θ),但它們在 θ = 0 \theta=0 θ=0 時都呈現病态。

矩陣指數幂

考慮一個描述繞 x 軸旋轉的矩陣

>> R = rotx(0.3)
R =
    1.0000         0         0
         0    0.9553   -0.2955
         0    0.2955    0.9553
           

早在讨論二維情況的時候我們就使用 MATLAB 函數

logm

計算過矩陣的對數

>> S = logm(R)
S =
         0         0         0
         0         0   -0.3000
         0    0.3000         0
           

這也是一個反對稱矩陣,求其反變換,可以得到對應軸的旋轉角度

>> vex(S)
ans =
    0.3000
         0
         0
           

對于三位的情況,工具箱函數

trlog

的效果是一樣的

>> [th, w] = trlog(R)
th =
    0.3000
w =
    1.0000
         0
         0