姿態解算進階之理解旋轉矩陣(也稱方向餘弦矩陣)

2021-02-13 無人機

背景介紹:
Sugar 已寫完連續 5 篇的姿態解算入門系列,這個系列的特點是:特別簡單、起點特別低。
算法類推文比技能類推文難寫,Sugar 本來想姿態解算的算法系列在入門後就不再寫了,但有讀者下載了 Sugar 在 5 篇入門系列共享的 MATLAB 代碼之後表示對其中一些方法不理解,所以 Sugar 再開個進階系列。
注意:深入算法無終點,打算進階的讀者需要自行補一點數學基礎。

旋轉矩陣為何五花八門

關於旋轉矩陣的基本原理 Sugar 就不再重寫了,網上非常多。

有初學的讀者問 Sugar 這樣一個問題:剛學,基礎不太好,很勤奮的去網上找講基礎知識的文章,發現同類內容不同的文章講得不一樣,卻又都是看起來很對的樣子,究竟學哪個才是對的?
Sugar 回答是:寫出來的文章在其文章本身環境下基本不會出錯。能把握住核心的讀者會理解 Sugar 的回答,但對於初學者並不知道什麼是「核心」。下面 Sugar 就來舉個例子。
對於繞 Z 軸的旋轉,網上的文章裡有兩種表述:

兩種表述符號不同無傷大雅,但「負號不在同一位置」就讓很多初學者撓頭了(頭髮揪淨了都不知道哪個對,Sugar 稱此類問題為「揪淨問題」)。
上圖中都表示「繞 Z 軸旋轉的偏航角」,只是轉向不同。在 Sugar 之前的推文中一直是以「標準的笛卡爾右手系規則」來定義轉角正方向的,上面兩個截圖中的「第二種表述」是符合笛卡爾右手系規則的,而「第一種表述」與笛卡爾右手系規則正好相反。
對單軸的旋轉矩陣最終會影響到最終的姿態旋轉矩陣,這裡 Sugar 給出下面的 MATLAB 代碼,讀者要自己動手試一下這個影響究竟是什麼樣的:

clearclc% cr:cos(roll)  sr:sin(roll)% cp:cos(pitch) sp:sin(pitch)% cy:cos(yaw)   sy:sin(yaw)syms cr sr cp sp cy sy% RX:Rotate X axis% RY:Rotate Y axis% RZ:Rotate Z axissyms RX RY RZ
RX = [ 1 0 0; 0 cr -sr; 0 sr cr]RY = [ cp 0 sp; 0 1 0; -sp 0 cp]RZ = [ cy -sy 0; sy cy 0; 0 0 1]%--from_euler_xyz--% column : x y z% row : a b c% x y z% a [ cp*cy, cy*sp*sr - cr*sy, sr*sy + cr*cy*sp]% b [ cp*sy, cr*cy + sp*sr*sy, cr*sp*sy - cy*sr]% c [ -sp, cp*sr, cp*cr]from_euler_xyz = RZ*RY*RX

至此就不難理解 Sugar 說的「在其文章本身環境下」是什麼意思了,直白說就是:每個文章對旋轉正方向的定義不同,所以公式存在差異。Sugar 推薦一律採用笛卡爾右手系,這樣不容易出錯。有些文章是 X-Y 符合笛卡爾右手系規則,而 Z 與笛卡右手系規則相反,那麼之後所有的旋轉都要把 Z 單獨轉向才行,這樣不利於算法總體的統一。

跟 Sugar 一起看 ArduPilot 裡的旋轉矩陣

ArduPilot 是符合「標準笛卡爾右手系規則」的。下面 Sugar 對 ArduPilot 代碼結合 MATLAB 做一個圖形化解讀。

先看一下 Sugar 從 github 上截的 ArduPilot 旋轉矩陣代碼的圖:

不難看出 Sugar 上面 MATLAB 代碼裡的注釋就是對這段代碼寫的。這就是「先繞 X 軸旋轉、再繞 Y 軸旋轉最後繞 Z 軸旋轉」的旋轉矩陣(網上也有叫「方向餘弦矩陣」的)。下面 Sugar 解釋一下旋轉矩陣的用法和注意點。

一、列向量左乘旋轉矩陣
在笛卡爾三維直角坐標下,一個有方向的線段用三維向量表示。為了能夠使用上面的旋轉矩陣對向量進行旋轉,這個表示有向線段的三維向量要以「列向量」形式存在。所以:

對一個三維列向量施加一個三維旋轉的方法就是:將這個三維列向量左乘旋轉矩陣。

下面看下 Sugar 用 MATLAB 做的旋轉效果:

二、不同的旋轉順序得到不同的結果
Sugar 習慣使用的旋轉順序是:X-Y-Z 順序。就是上面說到的:先繞 X 軸旋轉、再繞 Y 軸旋轉最後繞 Z 軸旋轉。下面 Sugar 以「橫滾 30 度、俯仰 30 度、偏航 90 度」為例,看看「X-Y-Z 順序」和「Z-Y-X 順序」有多大差別。

事實說明:同樣的旋轉角度、不同的旋轉順序,效果可以是天差地別

三、gimbal lock 萬向鎖
關於萬向鎖網上能找到的解釋很多,Sugar 在這裡不再贅述。下面 Sugar 通過分步 Z-Y-X 順序旋轉為例,演示一下 gimbal lock 現象在姿態解算上引起的烏龍事件(也說明一下上面 Z-Y-X 順序的圖為什麼轉成了那個樣子)。
按上面的角度,首先繞 Z 軸轉 90 度,如下:

上圖就是下面烏龍事件的起因,下面我們該繞 Y 軸轉出 30 度的俯仰角了,結果卻:

因為第一步繞 Z 轉遇到了 gimbal lock,所以導致第二步繞 Y 轉俯仰角的效果變成了轉出橫滾的效果。
這裡要注意的是:第二步繞 Y 軸轉指的是「第一步旋轉前的 Y 軸」(是上圖中與紅色虛線重合的綠色實線,而不是那個綠色虛線)。
下面還剩一步,繞紅色實線 X 軸轉出 30 度的橫滾角。當然,因為第一步的 gimbal lock 導致變成了轉俯仰角的效果,如下:

完整的無人機動力系統測試解決方案

相關焦點

  • 姿態解算進階之加速度姿態解算
    在姿態解算入門系列裡 Sugar 以初中數學為基礎展開了用加速度計的姿態解算方法。
  • 姿態解算進階之加速度姿態解算;後附付費服務!
    >在姿態解算入門系列裡 Sugar 以初中數學為基礎展開了用加速度計的姿態解算方法。上一篇《姿態解算進階之理解旋轉矩陣(也稱方向餘弦矩陣)》進行了一次理論進階。本篇 Sugar 用進階的理論重寫一下用加速度計做姿態解算的方法,然後與入門級算法對比一下結果有哪些改進。
  • 通過 Unity 實踐渲染的基礎知識 #1 利用矩陣來進行空間變換
    當然,我們可以依賴於 Unity 自帶的 Transform 組件及 Shader 去處理這些事情,但是,如果你想要對物體的變換擁有絕對的控制權,那麼理解它們背後的實現原理就是十分重要的!為了完全理解全部過程,我們最好來創造一次自己的實現方式。位移,旋轉及縮放 Mesh 通過控制頂點的位置來實現,我們稱其為空間變換。我們最好將整個空間可視化,以了解我們究竟在做些什麼。
  • 坐標系與相機旋轉表示
    >在講旋轉矩陣前,先介紹下向量的概念,因為旋轉矩陣的推導是根據同一向量在不同坐標系下的坐標表示得出的。上面的表示稱為3-1-3順序;在航空航天領域(如無人機)採用1-2-3順序,也稱RPY,分別旋轉θ度(翻滾角);θ度(俯仰角);θ度(偏航角)。
  • 旋轉矩陣和歐拉角相互轉換及代碼實現(八十九)
    旋轉矩陣與旋轉向量旋轉矩陣(Rotation Matrix)旋轉向量(Rotation Vector)旋轉向量到旋轉矩陣的轉換是通過羅德裡格斯公式(Rodrigues's Formula),轉換公式如下:其中,  為旋轉軸單位向量,  為旋轉角度,  為向量到反對稱矩陣的運算符。
  • 矩陣的乘法
    首先,在數學上,矩陣乘法的嚴格定義如下:設A=(aij)是sxn矩陣,B=(bij)是nxm矩陣,則規定我們是從二階矩陣開始的。關於矩陣乘法這部分,我們目前只讓小段練習了二階矩陣和三階矩陣的情形,主要是想讓他了解一些抽象的「規則」,同時加強他加法和乘法運算的能力。
  • 基於雙框架變速控制力矩陀螺的太空飛行器姿態控制研究
    隨著空間技術的快速發展,許多空間任務對太空飛行器的姿態機動能力有更高的要求,快速、穩定、高精度的姿態控制系統成為空間技術的重要研究方向。本文引用地址:http://www.eepw.com.cn/article/201610/306724.htm目前用於衛星姿態機動主動控制的執行機構類型主要有推力器、反作用飛輪、控制力矩陀螺等。
  • Jacobian矩陣和Hessian矩陣
    Hessian矩陣統治的恐懼嗎?本文清晰易懂的介紹了Jacobian矩陣和Hessian矩陣的概念,並循序漸進的推導了牛頓法的最優化算法。希望看過此文後,你對這兩類矩陣有一個更深刻的理解。在向量分析中,雅可比矩陣是一階偏導數以一定方式排列成的矩陣,其行列式稱為雅可比行列式. 還有, 在代數幾何中,代數曲線的雅可比量表示雅可比簇:伴隨該曲線的一個代數群,曲線可以嵌入其中。
  • 矩陣的重要特性:特徵向量
    矩陣實際可以看作一個變換,方程左邊就是把向量x變到另一個位置而已;右邊就是把向量x作了一個拉伸,拉伸量是lamda。那麼它的意義就很明顯了,表達了矩陣A的一個特性就是這個矩陣可以把向量x拉長(或縮短)lamda倍,僅此而已。任意給定一個矩陣A,並不是對所有的x它都能拉長(縮短)。
  • 矩陣:特徵向量(Eigenvector)
    矩陣實際可以看作一個變換,方程左邊就是把向量x變到另一個位置而已;右邊就是把向量x作了一個拉伸,拉伸量是lamda。那麼它的意義就很明顯了,表達了矩陣A的一個特性就是這個矩陣可以把向量x拉長(或縮短)lamda倍,僅此而已。任意給定一個矩陣A,並不是對所有的x它都能拉長(縮短)。
  • 其實矩陣並不陌生,完全可以從中學知識「遷移」
    線性代數主要有兩個重要的概念,行列式和矩陣,且兩個概念有些相似性;行列式本質上是一種運算,而矩陣是一個數組,可以被看成有多個行或列向量組成。有些教材從線性方程組入手,介紹消元法,n維向量空間,線性相關性以及矩陣,然後是矩陣的秩、線性方程組解的判定定理,解的結構。學完這部分內容,基本上可以認為線性方程組的問題似乎是完全解決了的。
  • 教孩子寫遊戲:矩陣在3D遊戲編程中是如何被使用的?
    如果這個世界上沒有電腦,我們還停留在用紙和筆計算的時代,那矩陣真的沒什麼用(其實,當時數學家發明矩陣就處於這樣的時代背景下,所以,數學家的思維一直都是超前的)。在大多數人的眼中,矩陣除了可以快速解多元一次方程外,沒有其他任何用處。說真的,在現實生活中,我們用到矩陣的地方也非常非常少。
  • HALCON高級篇:3D坐標之剛性轉換和齊次轉換矩陣
    事實上,一個剛性轉換已經是一個鏈了,因為其實由平移和旋轉組成的:如果旋轉是由多次繞軸旋轉組成的,則單獨的旋轉也可以被寫成如下的齊次轉換矩陣:從右向左讀這條鏈,你可以遵循點的轉換:首先,其繞著z軸旋轉,然後繞著(舊)y軸旋轉,最後其被平移。
  • 教孩子寫遊戲:3D遊戲編程離不開矩陣,我們要如何理解矩陣?
    矩陣,可以說是本課程中的第一塊硬骨頭。雖然說,我們不需要對矩陣有非常深入的理解,但是,這並不代表著我們可以不學矩陣。這麼說吧,如果你對矩陣一無所知,那麼,整個3D遊戲編程你是學不懂的。你可以靠著強大的記憶力把本課程的代碼記住,並且也能通過自己的摸索寫出類似的3D遊戲來,但是,你對其中的原理是不理解的,將來想要寫功能更強大的3D遊戲,就純粹是天方夜譚了。但是,擺在我面前的難題是:一個成年人想要學習矩陣都有點困難,如何讓小孩子也明白矩陣的一些道理呢?
  • 矩陣的瑰寶:深入挖掘特徵值和特徵向量,直觀地看抽象概念
    因為一切都是由數據定義的,矩陣是處理數據的最佳工具,而它們又是矩陣中的瑰寶,可以揭示矩陣的性質。理解特徵值和特徵向量是什麼,如何推導它們,以及它們的應用,對于欣賞矩陣之美,以及更廣泛地理解數據和數學在世界中扮演的角色,都是不可或缺的。首先,讓我們考慮二維向量,它有兩個元素,每個元素對應於二維平面上的一個坐標。它們代表著從一個坐標到另一個坐標的運動。
  • 剛體旋轉知識
    那麼,三維空間坐標系的旋轉可以描述為一個三維向量,即旋轉向量。如向量  a :        a =[ a1, a2, a3 ]        其中,向量方向(單位向量)即旋轉軸,向量大小即旋轉角度。),其虛部值即為旋轉後的坐標值優缺點:1)當旋轉角為 0 時,此時軸角法無法明確旋轉軸,但是有固定的四元數與之對應,即:        q=[ ±1, 0, 0, 0 ]        2)任意兩次旋轉q1、q2等效為一次旋轉 q』        q』=q1∗q2        上述旋轉向量和四元數均可以理解為通過一次旋轉表示姿態
  • 基礎丨Python下的矩陣操作(3)
    關鍵詞:線性代數 / 矩陣 / 運算今天小編將詳細介紹矩陣的運算規則與數學符號應用在矩陣上的含義,如同算數字的加減法需要了解計算公式的規則一樣,矩陣的運算雖然與單純數字運算相似,但其細節的相異處還需要多加注意。
  • 教程| 從特徵分解到協方差矩陣:詳細剖析和實現PCA算法
    機器之心編譯參與:蔣思源本文先簡要明了地介紹了特徵向量和其與矩陣的關係,然後再以其為基礎解釋協方差矩陣和主成分分析法的基本概念,最後我們結合協方差矩陣和主成分分析法實現數據降維。本文不僅僅是從理論上闡述各種重要概念,同時最後還一步步使用 Python 實現數據降維。首先本文的特徵向量是數學概念上的特徵向量,並不是指由輸入特徵值所組成的向量。
  • 2.3——矩陣的乘法與轉置
    矩陣的乘法運算是線性代數的本質運算,它的實質是線性變換。
  • 《線性代數》公式大全【系列02】:矩陣運算及性質
    則角.,稱實數矩陣 A 為正交矩陣.另外,還有一些特殊的方陣,比如:對角矩陣,數量矩陣,上(下)三角矩陣,等等,就不再贅述了。對角矩陣    (1) 兩個對角矩陣相乘可以交換;    (2) 對角矩陣的冪、逆、乘法、伴隨、秩、行列式等,都是一眼就可以看出來的。因此,從這個意義上來說,對角矩陣是最簡單的矩陣。這就是為什麼我們希望將一個普通矩陣通過相似變換化為對角矩陣的原因。c.