三次轉動命名任意朝向
假設一架無人機正在懸停,而你想描述它指向哪裡。它的位置告訴你它在哪裡;它的朝向則告訴你它在空間中如何扭轉。給這種扭轉命名最直觀的方式,就是把它拆成三種熟悉的轉動:橫滾(左右傾斜)、俯仰(機頭上下)和偏航(像指南針那樣旋轉)。這三個數就是歐拉角,幾乎所有人都會先想到它們,因為它們對應著人類能夠想像出來的詞。
關鍵在於這三次轉動是有先後順序的:你一個接一個地施加,每次繞某個軸轉動。從一個參考座標系(比如世界座標系)出發,你先偏航、再俯仰、最後橫滾,物體最終落在哪裡就是它的最終朝向。把這三次按順序組合起來,你就得到一個完整的描述,它等價於一個完整的旋轉矩陣——只不過用三個友善的角度來儲存,而不是九個數。
陷阱:萬向鎖
歐拉角讀起來很美好,卻藏著一道鋒利的刃。想像三個嵌套的環,每個都能繞一個軸自由旋轉——這就是曾經用來穩定船用羅盤和航天儀器的機械萬向架。只要這些環彼此保持一定角度,你就能到達任意朝向。但只要把中間那個環傾斜 90 度,其中兩個環就會對齊。此時它們繞同一個軸旋轉,你三次獨立轉動中的一次就悄悄地不再產生任何新變化了。這種坍縮就是萬向鎖。
具體地說,在 ZYX(偏航-俯仰-橫滾)約定下,把機頭俯仰到正上方 90 度,偏航軸和橫滾軸此時就指向同一個方向。偏航和橫滾變得無法區分——你在描述中丟失了一個自由度,儘管物理上的無人機依然能朝各個方向自由旋轉。被卡住的從來不是物體,而是你那套三角度的命名方案。阿波羅任務的慣性導航平台正是出於這個原因,才會面臨真實的萬向鎖隱患。
一根軸、一個角,沒有鎖
這裡有一條逃生通道。一個深刻的結論——歐拉旋轉定理——指出:任何你能透過三次轉動到達的朝向,也都能透過繞某根巧妙選定的軸轉動一次來到達。這就給出了軸-角表示:指定一個單位向量(要繞之旋轉的軸)和一個角度(轉多遠)。它不是三次會彼此坍縮的連續轉動,而是一次誠實的旋轉——而且沒有中間環可對齊,所以萬向鎖根本不會發生。
工程師真正採用的表示法,把這個軸-角思想打包成四個數,它們能優雅地組合與插值:單位四元數。一個四元數把一個純量和一個三數的向量部分綑在一起;對於繞單位軸 (x, y, z) 轉角 θ 的旋轉,你儲存半角的餘弦,以及被半角正弦縮放後的軸。半角乍看很怪,但正是它讓兩次旋轉能夠透過簡單的乘法組合起來。
axis-angle: unit axis n = (x, y, z), angle theta unit quaternion q = ( w, vx, vy, vz ) w = cos(theta/2) vx = x * sin(theta/2) vy = y * sin(theta/2) vz = z * sin(theta/2) always keep ||q|| = sqrt(w^2 + vx^2 + vy^2 + vz^2) = 1 (a UNIT quaternion) q and -q name the SAME rotation
兩大好處讓四元數成為機器人、遊戲引擎,以及融合陀螺儀讀數的 IMU 代碼中的預設選擇。第一,沒有萬向鎖——每個朝向都被同樣平滑地表示,沒有誰特殊。第二,你可以用一種叫作球面線性插值(slerp)的乾淨運算,沿最短路徑混合兩個朝向,得到歐拉角無法保證的、穩定而均勻的鏡頭掃攝與關節運動。在內部,這些都是活在同一個群——SO(3)——裡的旋轉;四元數不過是它們一組緊湊、性質良好的座標。
經驗法則:用歐拉角讀,用四元數算
這些表示法沒有誰是錯的;它們各擅其長。大多數機器人團隊遵循的實用工作流,是一種清晰的分工:在人看的地方用友善的那一種,在跑數學的地方用穩健的那一種。
- 把朝向展示給人看時——儀表板、日誌、控制滑桿——用歐拉角,因為橫滾、俯仰、偏航容易想像和推理。
- 一旦你需要在代碼裡儲存、組合或插值一個旋轉,就轉換成單位四元數,把所有真正的運算都放在那裡做,遠離任何萬向鎖奇異點。
- 每次乘法之後,把四元數重新歸一化回長度 1,這樣累積的浮點誤差就永遠不會讓它偏離一個有效的旋轉。
- 只在最後、為了顯示,才轉換回歐拉角——並記住 q 與 -q 是同一個旋轉,所以當符號翻轉時不必驚訝。