1. 程式人生 > >三維空間座標系變換——旋轉矩陣

三維空間座標系變換——旋轉矩陣

空間中三維座標變換一般由三種方式實現,第一種是旋轉矩陣和旋轉向量;第二種是尤拉角;第三種是四元數。這裡先介紹旋轉矩陣(旋轉向量)與尤拉角實現三維空間座標變換的方法以及兩者之間的關係。

       這裡以常見的世界座標系與相機座標系間的變換為例。

一、首先介紹從相機座標系轉換到世界座標系,也就是比較通用的body到世界座標系間的轉換。

       那麼旋轉的尤拉角按從世界座標系轉換到相機座標系的過程,先按z軸旋轉、之後y軸旋轉、之後x軸旋轉,最終得到相機座標系,得到的角度分別是yaw、pitch、roll,那麼從相機座標系到世界座標系的旋轉矩陣按如下方式定義:

那麼得到的相機(body)座標系到世界座標系間的旋轉矩陣為:

cv::Mat IMUReader::angleToRotation(COORDINATES& carrier)
{
// R
cv::Mat R = cv::Mat::eye(3, 3, CV_32F);
R.at<float>(0, 0) = cos(carrier.yaw)*cos(carrier.pitch);
R.at<float>(0, 1) = cos(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch) - cos(carrier.roll)*sin(carrier.yaw);
R.at<float>(0, 2) = sin(carrier.yaw)*sin(carrier.roll) + cos(carrier.yaw)*cos(carrier.roll)*sin(carrier.pitch);
R.at<float>(1, 0) = cos(carrier.pitch)*sin(carrier.yaw);
R.at<float>(1, 1) = cos(carrier.yaw)*cos(carrier.roll) + sin(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch);
R.at<float>(1, 2) = cos(carrier.roll)*sin(carrier.yaw)*sin(carrier.pitch) - cos(carrier.yaw)*sin(carrier.roll);
R.at<float>(2, 0) = - sin(carrier.pitch);
R.at<float>(2, 1) = cos(carrier.pitch)*sin(carrier.roll);
R.at<float>(2, 2) = cos(carrier.roll)*cos(carrier.pitch);

return R;
}

對於平移矩陣為相機座標系原點在世界座標系下的座標T,最終得到的座標變換方程如下:

其理解過程為從世界座標系經過z,y,x的旋轉以及平移T後得到相機座標系,那麼從相機座標轉換的世界座標實際上是反變換過程,最後一步是x旋轉,那麼通過定義Rx為反旋轉將相機座標反旋轉過來,之後依次是y,z,旋轉後得到的值為與世界座標系同方向,但是有一個平移的T的座標系下的座標,之後再加一個T座標就得到了在世界座標系下的座標。

二、下面介紹從世界座標系旋轉到相機座標系,這是一個正向旋轉的過程,首先繞z,y,x旋轉並平移T得到相機座標系,那麼從世界座標系到與相機座標系同向的座標系是隻經過旋轉,那麼旋轉矩陣為:

RxRyRz,而此時三個維度的旋轉分別是:

對於平移矩陣是,此時座標已經是與相機座標系同向,但是與世界座標系原點重合的座標下的座標,轉換相機座標系還需要加上的平移是世界座標系原點在相機座標系下的座標T。

其理解過程就是一個在世界座標系依照順序進行z,y,x的旋轉,之後再平移的過程。

其中對於z,y,x方向的旋轉都是按照右手系定則,大拇指指向軸線方向,四指方向為旋轉的正方向。

下面為之前整理,可能有錯誤,僅借鑑。

界座標系下的座標(Xw,Yw,Zw)轉換到相機座標系下(Xc,Yc,Zc)。

     那麼這裡涉及到旋轉矩陣和平移矩陣。對於旋轉我們有尤拉角描述,根據尤拉角計算出旋轉矩陣。對於尤拉角指的是座標系繞某個軸旋轉的角度,那麼從一個座標系旋轉到另一個座標系需要三次旋轉能夠完成。對於繞座標軸旋轉分為兩種,一種是繞原座標系的固定軸旋轉,一種是繞部分旋轉後的座標軸旋轉,這裡介紹比較常用的繞部分旋轉後的座標軸旋轉。同時,對於繞座標軸旋轉其旋轉的順序也是有關係,如繞XYZ旋轉和繞ZYX旋轉。那麼一種比較常用的表示方式是航空航天的偏航-俯仰-滾轉表示法,其中座標可以沿機頭朝向為x軸,飛機左側為y軸,飛機正上方為z軸。那麼偏航為繞z軸旋轉,之後俯仰是繞y軸旋轉,滾轉是繞x軸旋轉,即該尤拉角的旋轉順序為ZYX.

       上面介紹了旋轉方式-尤拉角,下面介紹旋轉矩陣的生成。這裡分開不同軸討論,先繞X軸旋轉。我們定義旋轉變換公式為:

其中,M為旋轉矩陣,公式定義的是從世界座標系向相機座標系的轉換,那麼我們就按世界座標向相機座標旋轉,如下:

這裡我們定義了從左側的世界座標轉到右側的相機座標,其旋轉為繞X軸正向旋轉90度,這裡的正向旋轉是以沿X軸方向看,順時針旋轉為正向,否則為負向。那麼從世界座標系向相機座標系的旋轉矩陣即為:

此時從世界座標向相機座標的轉換過程如下:

所以,這裡需要注意的是幾點:(1)座標是從世界座標系向相機座標系旋轉,所有對於旋轉方程是旋轉矩陣乘以世界座標得到相機座標;(2)旋轉是從世界座標向相機座標的旋轉,即從源座標系向目標座標系旋轉,這裡是從世界座標系向相機座標系旋轉;(3)旋轉角度是沿著座標軸的正向看,順時針為正,逆時針為負;(4)旋轉矩陣的形式如上,繞座標軸旋轉的軸座標是不會變化的,所以是對應位置是1,接下來是0 cos(theta)  sin(theta), 在接下來是0   -sin(theta)  cos(theta)。

以上四個點的方向是與最終的變換公式相關的,有一個地方發生變化,那麼最終的旋轉變換公式也會發生變化,為了統一,那麼這裡按這樣的規定,從而確定旋轉變換公式的固定。

        上面介紹了繞X軸旋轉的情況,其它繞Y軸和Z軸的旋轉矩陣相同,分別是:

繞Y軸旋轉矩陣:

繞Z軸旋轉矩陣:

那麼假如從世界座標系向相機座標系的旋轉過程中,顯示繞Z軸旋轉了theta,之後繞旋轉後坐標系的Y軸旋轉了beta,之後繞旋轉後坐標系X軸旋轉了alpha,那麼最終的旋轉矩陣如下:

以上是對旋轉矩陣的描述,那麼對三維座標系的轉換,除了包含旋轉,還要包含平移。即座標系先從源旋轉到與目標座標系相同的方向,之後再平移。對於平移這裡也規定從源座標向目標座標系。

這裡目標座標系在源座標系下的座標是(1,3,2),那麼從源座標系轉到目標座標系的變換即為:

於是這裡規定幾點:(1)變換是從源座標系到目標座標系,這裡是從世界座標系到相機座標系;(2)平移變換是目標座標系原點在源座標系旋轉到與目標座標系相同方向後的座標系下的座標,這裡即變換矩陣是目標座標系原點在世界座標系變換為與目標座標系相同方向後在變換後世界座標系中的座標位置;(3)此時的變換矩陣需要加上負號。

如果不加負號,也可以將變換矩陣定義為源座標系原點在目標座標系下的位置,這裡不用變換源座標系。經過以上步驟可以將源座標系中的座標點轉換到目標座標系下。

對於旋轉矩陣的旋轉向量以及尤拉角的關係與變換:

對於旋轉矩陣與旋轉向量:

上面介紹了通過旋轉矩陣和平移矩陣描述兩個座標系間的變換,其實也相當於表示了6自由度的三維剛體執行。但是旋轉矩陣有幾個缺點:SO(3)的旋轉矩陣有9個量,但一次旋轉只有3個自由度。因此,這種表示式冗餘。而且對於旋轉矩陣自身也有約束,它必須是正交矩陣,且行列式為1,這些約束會使求解變得困難。一種更緊湊的方式是使用旋轉xian向量描述。即對於座標系的旋轉,任意旋轉都可以用一個旋轉軸和一個旋轉角來刻畫。於是,我們可以使用一個向量,其方向與旋轉軸yizh一致,而長度等於旋轉角。這種向量稱為旋轉向量(或軸角,Axis-Angle)。這種表示法只需一個三維向量即可描述旋轉。對於xuan旋轉向量和旋轉矩陣間的轉換可以通過羅德里格斯公司(Rodrigues Formula)來計算。

對於旋轉矩陣與尤拉角: