一個矩陣承載完整位姿
在本章裡,我們一直把旋轉和位置分開存放:旋轉矩陣告訴你某物朝向哪個方向,位置向量告訴你它的原點落在何處。但真實的物體——夾爪、相機、輪子——同時擁有這兩者。我們把這種「在哪裡」加「朝哪邊」的組合稱為位姿,而把一個剛體移動到新位姿、既不彎折也不拉伸,就是一次剛體變換。這最後一課的巧妙之處在於:你可以把旋轉和平移摺疊進同一個物件,不必再兩頭兼顧。
這個單一物件就是齊次變換矩陣:一個 4×4 的方格,把 3×3 的旋轉塞進左上角,把 3 個數的平移放進右側那一列,再用固定的 0 0 0 1 把底行補滿。底行在物理上不做實事——它只是一行記帳位,讓矩陣能乾淨地相乘。回報是:這一個 4×4 現在一舉回答了兩個問題——「朝哪個方向?」和「坐落在何處?」。
T = [ R R R | px ] R = rotation (which way it faces)
[ R R R | py ] p = translation (where the origin sits)
[ R R R | pz ]
[ 0 0 0 | 1 ] bottom row is bookkeeping
to move a point: p_new = T · [ p_old ; 1 ]相乘變換沿機器人逐節走
把兩者打包進一個矩陣之所以重要,原因就在這裡:變換透過普通的矩陣乘法來組合。回想本章前面講過,機器人的每個部件都有自己的座標系,我們還區分固定的世界座標系與各自的本體座標系。假設你知道從世界到機器人底座的變換,又知道從底座到肩部、從肩部到肘部……一路到指尖的各段變換。把這些 4×4 矩陣按順序相乘,就得到一個從世界直達指尖的變換——整條手臂被壓縮成單一的位姿。
這條由連桿和關節構成的鏈,正是你在課程機構部分見過的運動鏈。把它每個關節的變換組合起來,就是正運動學背後實打實的算術——輸入關節角,把矩陣相乘,手最終落在哪裡就跳出來了。有一點要當心:順序很重要。矩陣乘法不滿足交換律,所以「先底座後肩部」和「先肩部後底座」給出的答案不同。要按座標系實際嵌套的方向去讀這條鏈。
你這樣搭出來的每個變換,都屬於一個齊整的家族,名叫特殊歐幾里得群 SE(3)。「群」是個數學詞,指一個集合,其成員相互組合卻永遠不會跑出這個集合:兩個 SE(3) 變換相乘,得到的還是一個 SE(3) 變換;每個變換都有一個把它撤銷的逆;什麼也不做(單位元)也算在內。它那只管旋轉的同胞SO(3),是純旋轉的家族。SE(3) 不過是在它之上再添了平移——它是三維空間中剛體運動的完整詞彙表。
tf 變換樹:機器人座標系的即時地圖
一台真實的機器人有幾十個座標系——底座、每個輪子、每個關節、雷射雷達、兩台相機、夾爪——而且大多在運動。靠人工把這些變換理清簡直是噩夢。於是機器人軟體維護著一個活的目錄,叫做變換樹(tf):一張圖,每個座標系是一個節點,每個已知變換是一條把父座標系連到子座標系的邊。因為它是一棵樹,任意兩個座標系之間恰好只有一條路徑,所以軟體總能串聯這些邊,回答「座標系 A 相對於座標系 B 在哪裡?」
這棵樹是活的,因為每個變換都蓋有時間戳,並隨機器人運動而刷新。一個關節編碼器轉動,兩段臂連桿之間的邊就更新;底座向前滾動,從地圖到底座的邊就更新。在某個瞬間向 tf 詢問相機到夾爪的變換,它會把那個時刻、那條路徑上正確的邊縫合起來。正是這一點,讓機器人能融合那些以不同座標系、在略有差異的時刻到達的資料。
- 雷射雷達返回一個在它自身座標系中測得的點——比如,正前方 2 公尺處。
- 你想把這個點放到地圖座標系裡,好讓它落在一張共享地圖上。你向 tf 索取從雷射雷達座標系到地圖座標系的變換。
- tf 沿著「雷射雷達 → 底座 → 里程計 → 地圖」這條路徑行走,把沿途的 4×4 邊變換相乘,合成為一個組合變換。
- 把這個變換作用到該點上,同一個障礙物現在就處在地圖座標裡了——可以與機器人見過的其他一切作比對。
前沿:位姿如何運動
變換是一張快照——它告訴你某個座標系此刻被定格在哪裡。但機器人是會動的,所以我們還需要描述一個位姿此刻正如何變化。把這件事緊湊打包的方式,就是旋量速度(twist),也稱空間速度:六個數,把一個物體的瞬時角速度(轉得多快、繞哪根軸)和它的線速度(原點滑得多快)打包在一起。旋量速度之於變換,就如速度之於位置——是它的變化率。
這裡還藏著一個更優雅的想法。力學中有一條定理說:任何剛體運動,無論多複雜,都等價於一次單一的擰螺絲運動——繞空間中某條直線旋轉,同時沿著同一條直線滑動,就像擰一顆螺栓。那條直線就是螺旋軸,而事實證明,每個旋量速度都指向它自己的螺旋軸。所以「又轉又移」和「繞螺旋軸擰」是同一個運動的兩種看法,而螺旋這種看法常常讓數學出奇地乾淨。
旋量速度是你後續學習下一部分的門戶。一旦你問起「關節轉動時夾爪移動得多快」——也就是速度運動學——你就在和旋量速度打交道了。它們還支撐著平滑的運動控制,以及「向世界施力」這件事背後的數學。你現在還不需要全套理論框架;只要帶上這幅圖景:變換把位姿定格,旋量速度讓它動起來。
這把你帶向何處
退一步,看看這一個 4×4 矩陣替你換來了什麼。整章——座標系、朝向、旋轉矩陣、歐拉角及其萬向鎖陷阱、四元數——都在朝著這一點搭建:一種單一、可組合的方式,用來說清一切「在哪裡」和「朝哪邊」。把這些變換沿手臂組合,你得到正運動學;把問題反過來問——哪組關節角能到達這個位姿?——你便得到逆運動學。
同樣的代數遠不止於手臂。一台機器人在為陌生場所建圖,它解的是同步定位與建圖(SLAM),其本質是一道龐大的拼圖:同時估計 SE(3) 中成千上萬個位姿。而把一次測量從一個座標系重新表達到另一個座標系——也就是 tf 變換樹的日常工作——正是感測器融合背後默默的支柱:來自眾多感測器的讀數,必須先被帶進同一個座標系,才能彼此吻合。把變換掌握到家,機器人裡許多看似魔法的部分就不再神祕了。