JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

所有可能動作構成的空間

為什麼規劃器把機器人看作在抽象姿態空間中移動的一個點,而不是房間裡的一條手臂或幾個輪子。

卡在門口的沙發

凡是搬過沙發進門的人都懂那種感覺。只要你把沙發斜成某個角度、進門時轉一下、在恰當的時機抬起一端,它就能塞進去;可一旦順序或角度弄錯,它就卡死了。讓人懊惱的是,房間裡明明有大把空地——問題完全出在沙發的形狀,以及你一路上怎麼轉動它。

機器人面對的正是同樣的難題,而且更棘手。機械臂是一串由連桿和關節組成的鏈條;移動機器人轉彎時,機身會掃過一片佔地範圍。問「機器人能不能從這裡走到那裡?」,從來都不只是兩個點離得遠不遠的問題,而是機器人身體的每一部分能否一路通行、不撞到任何東西。如果在雜亂的三維房間裡一個關節一個關節地推敲,很快就會讓人頭暈。

把整個機器人壓縮成一個點

訣竅在這裡。我們不再追蹤機器人每個部位在哪裡,而是問:要徹底鎖定機器人的姿態,最少需要幾個數?對一條兩關節的機械臂來說,就只要兩個數——肩部的角度和肘部的角度。一旦知道這兩個角度,每根連桿的位置就完全確定了,再沒什麼要補充的。每個這樣的數就是一個自由度,是機器人可以獨立活動的一種方式。

現在,把這些數各自當作圖上的一根坐標軸。肩部角度沿一根軸展開,肘部角度沿另一根軸展開。整條機械臂——連桿、關節、一切——的任何一個姿態,在這張圖上都恰好對應一個點。彎一下肘,點就滑動;擺一下肩,點就朝另一個方向滑。這張抽象的圖就是位形空間(C 空間),其神奇之處在於:機器人不再是一具笨拙的多關節身軀,而成了一個點。

同樣的配方也適用於在地面上滾動的移動機器人。它的姿態由三個數確定:x 坐標、y 坐標,以及它面朝的方向。於是它的 C 空間是三維的;同樣地,整個機器人——輪子、機身、感測器——又坍縮成一個點,隨著它行駛和轉向,在那個空間裡漂移。

點不能進入的地帶

把機器人壓縮成一個點,只是這套戲法的一半。另一半,是問障礙物會變成什麼樣。如今機器人的每個姿態都是 C 空間裡的一個點,於是我們能把這些點分成兩堆:機器人什麼都不碰的姿態,和身體某處嵌進了牆、桌子或自身的姿態。這種劃分就是自由空間與障礙空間。自由空間是點可以待的所有地方;障礙空間則是禁區。

意外來了。真實房間裡一根簡單粗壯的柱子,到了 C 空間裡卻不再簡單。因為只要機器人身體的任何部位會與障礙物重疊,它就被擋住,於是一根小小的圓柱也能切出一大片歪斜、形狀古怪的禁區——其確切形狀取決於機器人自身的身軀,以及關節轉動時這身軀如何變化。判斷某個姿態落在這條邊界的哪一側,正是碰撞檢測的工作;每個規劃器都要調用它成千上萬次。

這恰恰解釋了門口為何那麼棘手。在房間裡看,那道縫似乎夠寬。可在沙發的 C 空間裡——它的位置加上它的傾斜角——門口卻是穿過自由空間的一條又窄又扭的走廊,你得讓那個點沿著它穿過去。機器人的形狀並沒有消失,它只是搬進了障礙區的幾何形態裡,讓規劃器得以乾淨俐落地推敲它。

規劃,無非是畫一條線

一旦世界被這樣重新表述,整個運動規劃的目標,說起來便簡單得驚人。機器人從一個點(當前姿態)出發,想抵達另一個點(目標姿態)。一份規劃,就是任何一條把起點連到終點、且全程不踏入障礙空間的連續曲線。就這麼簡單。找到這樣一條線,你就找到了機器人真正能執行的一連串姿態。

注意這條曲線是什麼,又不是什麼。它是一條路徑:一組有序的姿態,一條穿過自由空間的路線。它還完全沒說要走多快、何時加速、何時為轉彎減速。給它加上時間安排和速度,才會把光禿禿的路徑變成一條軌跡——那是後面的步驟,等我們講路徑與軌跡時再談。眼下的收穫是觀念上的:一團糾纏的關節與障礙,化成了「用一條始終留在白色區域裡的線,把兩個點連起來」。

為什麼關節一多,空間就爆炸

化點的戲法很美,卻是要付帳的,而且帳單漲得飛快。每多一個自由度,C 空間就多一根坐標軸——點又多了一個可以移動的維度。兩關節機械臂活在一個平坦的二維空間裡,畫在紙上就行。一條典型的工業機械臂有六個關節,於是它的 C 空間是六維的。一台雙臂人形機器人,則可能有幾十維。

為什麼這事如此要緊?設想用鋪網格的辦法去逐一檢查每個姿態。在二維裡,一張 100 乘 100 的網格是一萬個格子——輕鬆。多加一維就是一百萬;六維則是一萬億個格子。每多一個關節,工作量就成倍疊乘,於是待搜索的姿態空間膨脹到再無指望逐一查完。這種爆炸式增長,正是規劃之所以困難的核心原因,也正是後續篇章裡那些精巧的採樣與搜索方法存在的理由:它們能找到一條路徑,而無須把整個空間都畫出來。