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

從路徑到平滑、帶時間的運動

一串路點還不是運動——把它變成軌跡,意味著加入時間、進行平滑,並尊重機器人實際能夠運動的方式。

一條路線還不是一段運動

想像你剛向規劃器要了一條穿過雜亂房間的路線,它遞回給你一串整齊的路點:先到這裡,再到這裡,然後到那裡,最後到門口。這串列表就是一條路徑——一條純幾何的路線,是穿過空間的曲線,沒有附帶任何時鐘。它告訴機器人去*哪裡*,卻對*何時*隻字未提。路徑與真實運動之間的區別正是本篇的核心,這個術語叫做路徑與軌跡之分

軌跡則是給同一條路線裝上了速度和時鐘:此刻在這裡、以這個速度運動,零點一秒後到那裡。路徑回答的是「經過哪些點?」;軌跡回答的是「在哪個瞬間到哪個點、有多快?」只有軌跡才能交給馬達,因為馬達需要知道*每一個時間刻度*的目標,而不只是一串目的地。

時間為什麼如此重要?設想這樣開車:以全速從一個路點瞬間跳到下一個路點,機器人會猛地顛簸、急剎停下,把貨物甩翻。解法是平滑地滑過這些路點——平穩加速、保持舒適的巡航速度,再緩緩停下。給路徑加上這個時鐘、並把速度抹平的這一步叫做時間參數化,正是它把一條光禿禿的路徑變成真實機器能夠跟隨的東西。

把路徑彎成一條好軌跡

規劃器的原始輸出往往很毛糙——充滿尖銳的拐角和來回的曲折,因為規劃器只在乎避開障礙,並不在乎平順。軌跡最佳化就是把這條粗糙路線彎成一條平滑、低代價曲線的技藝。你把「好」的含義寫成一個代價函數——懲罰急促的變化、懲罰貼近牆壁、懲罰浪費時間——然後讓最佳化器一點點微調曲線,直到代價盡可能地低。

關鍵在於,最佳化器並非可以為所欲為。它要在硬性限制下工作:最高速度、最大加速度,往往還有對加加速度的上限(加速度的變化率——就是你感到的那種突然的頓挫)。這些限制來自馬達和機械結構,一條好軌跡會尊重其中的每一條,同時仍能到達目的地。可以把它想成新手手忙腳亂地猛踩踏板,與老司機在車流中行雲流水之間的差別。

這個思路還有一個更古老、卻非常直觀的「近親」值得認識:人工勢場法。把目標想像成一塊磁鐵,把機器人往自己這邊拉;把每個障礙想像成一座小山,把機器人往外推。機器人只需沿著合力一路「下坡」,滑向目標,同時被牆壁排斥開。它便宜又優雅,不過有時會卡在一個其實並非目標的山谷裡——所謂的局部極小值——這也是為什麼常常要在它之上再疊加最佳化和取樣方法。

為什麼汽車不能橫著滑

許多聰明的路徑正是在這裡悄無聲息地「夭折」。並不是每個機器人都能朝它所指向的任意方向移動。這個區別就是完整運動與非完整運動之分。完整型機器人無論自己朝向何方,都能即刻向任意方向移動——想想裝有特殊輪子的全向驅動平台,它能直接橫向挪動,根本無需先轉身。非完整型機器人則做不到。

汽車是典型的非完整例子,而你早已對它瞭如指掌。汽車沒法直直地橫向滑進一個平行車位——它必須前後挪動、擺動車頭,因為前輪只能轉向,不能像螃蟹那樣橫行。這種轉向幾何有個名字,叫阿克曼轉向,它禁止側向滑移。一個更簡單的、採用差速驅動的兩輪機器人同樣是非完整的:它能原地旋轉,卻無法不先轉身就橫向平移。

這一約束重新塑造了哪些路徑在物理上是可行的。一個無視它的規劃器,可能會興高采烈地畫出一個直角急轉彎或一次橫向輕挪——幾何上成立,對汽車而言卻物理上不可能。而一個考慮約束的規劃器,會給出車輛真正能描出的曲線:帶有最小轉彎半徑的平緩弧線,以及需要倒車時的換檔。路徑不再是一張隨意的草圖,而成了車輪能夠老老實實執行的東西。

當一條聰明的路徑仍然開不出來

把這些拼在一起,一個發人深省的事實浮現出來:一條路徑可以在幾何上完美無缺——最短、最通暢、最優雅——卻依然開不出來。也許它要求一次汽車做不到的橫向滑動;也許它的拐角對轉彎半徑來說太尖;也許它需要馬達給不出的加速度,或者需要一次急到沒有任何平滑軌跡能夠滿足的速度變化。地圖說行,機器卻說不行。

這正是為什麼真實系統會把工作拆分開來:一個負責找出粗略全域路線的規劃器,和一個把它轉化為可行、帶時間運動的局部層——這種拆分被稱為全域規劃器與局部規劃器之分。全域規劃器在地圖上勾勒出長程路線;而更貼近硬體的局部規劃器,則把每一小段重新塑造成機器人真正能執行的軌跡,時刻尊重它的運動約束和馬達極限。

於是本篇的旅程,正是一次出行的旅程:規劃器遞給你一條路徑,你給它裹上時鐘、抹成一條軌跡,再把這條軌跡彎到尊重速度與加速度限制,最後反覆核對它是否服從機器人被允許的運動方式。只有當這一切都成立,那串點才終於變成運動——成為車輪能夠穩穩當當執行、毫不踉蹌的東西。