旋轉矩陣
旋轉矩陣是一格九個數字的整齊方陣——三行三列——它刻畫的是一個姿態,也就是一個物體究竟是怎麼轉著的。讀它最清爽的辦法是一列一列地看:它的三列各自告訴你,轉動之後某根座標軸現在指向哪裡。把這三個答案並排擺好,這個小方陣就裝下了整個旋轉,既不必擺弄角度,也不用操心繞圈打轉的問題。把這個方陣交給機器人,它就精確知道夾爪、相機或者整個機身朝著哪個方向。
同一個方陣也是一台給箭頭重新瞄準的機器。讓一個位置向量乘上一個旋轉矩陣,出來的就是這同一個向量在旋轉之後的樣子——或者同樣有用地,是同一個物理點的數字從一個座標系翻譯到另一個座標系後的結果。這正是空間機器人裡日常的主力動作:相機報告說杯子在左上方,乘上正確的旋轉矩陣之後,就變成了機械臂真正能朝著去的一個方向。把兩次旋轉的矩陣相乘,就能連著施加兩次轉動,像一步步照路線走那樣乾淨俐落地把轉動串接起來。
不是隨便九個數字都行。真正的旋轉矩陣是正交規範的——它的三列各自恰好是一個單位長,且兩兩完全垂直——除此之外它還必須是右手的(行列式為 +1,從而排除鏡像翻轉)。這兩組條件合起來,正是它在轉動東西時既不會拉伸、壓扁、扭歪、也不會鏡像翻轉它們的原因。長度和角度都原封不動地保留下來;一個正方體仍是正方體,只是轉了個向。這一族乖巧的矩陣,數學家稱之為 SO(3),即特殊正交群,這不過是「所有規規矩矩的三維旋轉」的一個正式名稱。它最大的優點是可靠;它略微的代價是,用九個數字去釘住一件其實只需要三個數字的事,這也是當記憶體或平滑性要緊時人們常常更偏愛四元數的原因之一。
機器人的相機在它的左上方發現一個目標,但機械臂是按底座座標系思考的。把目標方向乘上「相機到底座」的旋轉矩陣,就把「鏡頭的左上方」重新表述成機械臂可以揮臂朝向的一個具體方位——同一個點,換成機械臂聽得懂的語言重新說一遍。
一次乘法,就把一個方向從相機座標系改寫到底座座標系。
由於它的各列都是單位長且互相垂直,旋轉矩陣的逆——也就是反向轉動——恰好就是它沿對角線翻折後的樣子(即它的轉置),這讓「撤銷一次旋轉」既省力又精確。