同一個杯子,兩個不同的答案
想像一隻機械臂坐在廚房餐桌旁,面前放著一隻咖啡杯。問機器人「杯子在哪裡?」,它會說:「在我正前方 30 公分處。」問房間同樣的問題,它會說:「在窗邊,餐桌的左半邊。」這兩個答案都完全正確,描述的是同一隻杯子。可是數值卻完全不同——而且沒有哪一個比另一個更「真實」。
這正是機器人幾何中最重要的一個觀念:位置從來不只是懸在空中的三個數字。三個數字只有在你說清楚是從什麼量起時才有意義。「前方 30 公分」需要一個有「前方」的東西;「窗邊」需要一個有牆的房間。換一個測量的參照物,數字就變了,儘管實物根本沒有移動。
座標系到底是什麼:一個原點加三個箭頭
那個「你測量的參照物」有個正式名字:座標系(又稱參考系)。座標系不過是兩樣東西黏在一起。第一是原點——一個被選定、算作「零」的點,是你開始測量的起點。第二是三條座標軸——從原點伸出的三個箭頭,通常標記為 x、y、z,每一條都與另外兩條互相垂直。它們合起來就像一套插在空間裡的小尺子:一個箭頭管「左右」,一個管「前後」,一個管「上下」。
座標系一旦插好,描述任何一個點就成了一道簡單的步驟:站在原點,沿 x 箭頭走一段,沿 y 走一段,沿 z 走一段,就到達那個點。這三個「沿各箭頭走多遠」的距離,就是該點在這個座標系裡的座標。一旦移動原點或旋轉箭頭,同一個實體點就會獲得一組全新的三個數字。
房間不動,機器人隨身帶著自己的座標系
機器人幾乎總是同時擁有至少兩個座標系,而它們之間的對比正是後面一切的關鍵。第一個是世界座標系:一個固定在房間本身上的座標系。也許它的原點是地板的某個角落,x 箭頭沿一面牆延伸,z 箭頭朝天花板向上。它永遠不動,是大家都能認同的共享地圖。
第二個是機體座標系:黏在機器人自身上的座標系,機器人走到哪它就跟到哪。它的原點可能在機器人的胸口,或在機械臂的底座;它的 x 箭頭指向「前方」,也就是機器人面朝的方向。機器人在房間裡移動時,機體座標系隨之移動;機器人轉身時,它的箭頭也跟著轉。正是這個座標系,讓機器人能說「杯子在我正前方 30 公分」——「在我前方」只有在隨機體移動的座標系裡才有意義。
真實的機器人不止兩個座標系。攝影機有自己的座標系,機械臂的每個關節有一個,夾爪有一個,每個輪子也有一個。一台機器可以帶著十幾個座標系,時時刻刻彼此相對移動。機器人軟體把它們組織成一棵分叉的結構,叫做變換樹——而整棵樹的種子,正是這個「世界對機體」的區分。
一個點,多組數字——以及為何需要換算
我們用一個位置向量把這件事說具體——位置向量就是那串三個數字 (x, y, z) 的正式名稱,它相對某個座標系把一個點釘住。杯子在桌上從未移動,但在同一瞬間,從兩個座標系看,它的描述是這樣的:
Same cup, same instant, two frames:
in BODY frame (origin = robot, x = forward):
cup = ( 0.30, 0.00, 0.00 ) # 30 cm straight ahead
in WORLD frame (origin = room corner, x = along wall):
cup = ( 1.85, 2.40, 0.75 ) # near window, table height
The cup did not move. Only the frame we asked in changed.於是實際的麻煩來了。機器人的攝影機看到杯子,並以攝影機座標系報告它的位置。可機械臂的馬達只聽得懂以機械臂自身底座座標系表述的指令。而人類監督者又用世界座標系畫了一個「禁入區」。三個座標系,同一隻杯子有三組不同的數字——在被換算到同一個共享座標系之前,它們無法一起使用。
這種座標系之間的換算——拿到杯子在一個座標系裡的數字,算出它在另一個座標系裡的數字——幾乎是機器人所做一切的發動機:看見、伸手、抓取、導航。這條學習線後面的內容,其實就是對本篇提出的問題一個漫長而細緻的回答:已知一個點在某座標系裡的數字,怎樣求它在另一座標系裡的數字?要乾淨地完成這件事,還需要知道座標系的扭轉與傾斜,也就是它的姿態,而不只是原點的位置——這正是我們接下來要去的地方。