Learning Objectives
- 說明全域規劃與局部避障為什麼要分開,各自負責什麼
- 說明動態視窗法的步驟:取樣速度、預測軌跡、刪掉不安全的、評分
- 用光達寫一個會閃避障礙物的節點,說明只看一條射線的問題
- 讀懂 Nav2 的架構與 NavigateToPose 的介面,說明卡住時的恢復行為
路上突然有東西
機器人沿著規劃好的路徑走到走廊中間,有人推著一台推車走出來。地圖裡沒有這台推車,全域路徑也沒有考慮它。
重新規劃整條路徑可以解決嗎?可以,但太慢:全域規劃要處理整張地圖,機器人以每秒半公尺前進,又要在幾十毫秒內做出反應。而且推車還在動,算好的路徑馬上又過時了。
所以導航系統通常分兩層:
| 全域規劃(global planner) | 局部控制(local controller) | |
|---|---|---|
| 看什麼 | 整張地圖 | 機器人附近幾公尺,最新的感測器資料 |
| 多久算一次 | 幾秒一次,或有需要才算 | 每秒數次到數十次 |
| 產出 | 一條路徑 | 這一刻的速度指令 |
| 擅長 | 繞過大範圍的牆,不走死路 | 閃開路上的東西,遵守機器人的運動限制 |
| 弱點 | 看不到新的東西、反應慢 | 目光短淺,會走進死路 |
兩者互補:全域規劃給方向,局部控制負責安全地往那個方向走。這一課的重點在局部控制。
動態視窗法:在做得到的速度裡選一個最好的
動態視窗法(Dynamic Window Approach,DWA)由 Fox、Burgard 與 Thrun 在 1997 年提出。它的特別之處是直接在速度空間裡搜尋,而不是在地圖上找路。差速機器人的指令只有兩個數字:v(前進速度)和 ω(轉速),所以問題變成:這一刻要下哪一組 (v, ω)?
每個控制週期做四件事:
- 動態視窗:機器人有慣性,下一個週期能達到的速度只有目前速度附近的一小塊。在這個範圍裡平均取樣,例如 5 種
v× 11 種ω= 55 組。 - 預測:假設每一組速度維持不變,往前模擬 1~2 秒,得到一條弧線。
- 刪除不安全的:弧線會碰到障礙物的刪掉;以這個速度來不及煞住的也刪掉,也就是
v² / (2a)要小於到障礙物的距離。 - 評分:剩下的每一條打分數,選最高的,只執行一個週期,下一個週期整個重來。
總分 = α × heading + β × clearance + γ × speed
heading 預測終點的朝向有多對準目標
clearance 預測軌跡離最近的障礙物有多遠
speed 走得多快
三個權重就是機器人的「個性」:α 大的急著對準目標,β 大的膽小、離東西遠遠的,γ 大的不想慢下來。
如果沒有任何一組速度是安全的,就下 v = 0。機器人的控制器要能接受「現在最好的選擇是不動」,這不是失敗。
下面的工具用的是教學上簡化的評分:三項都換算到 0~1 直接相加。原始論文與 Nav2 的控制器細節都不完全相同,想法是一樣的。
一步一步看一組速度怎麼被打分數
只看一組 (v, ω):預測 1 秒,算離障礙物多遠,再算分數。實際的控制器每個週期對幾十組都做一次。
動手寫:選出最高分的速度
predict 已經寫好,回傳預測終點與離障礙物最近的距離(邊緣到邊緣)。補上評分,並且刪掉 clear <= 0 的軌跡,然後印出最高分的那組。
用光達寫一個最簡單的避障
動態視窗法需要知道障礙物在哪裡,真實機器人的這份資訊來自光達。下面的節點比動態視窗法簡單得多,叫做反應式避障:不預測,看到前面太近就轉彎。
寫這種程式最常見的錯,是只看正前方那一條射線:
front = msg.ranges[len(msg.ranges) // 2] # 只有一條線
機器人有寬度,一條射線只知道中心線上的狀況。障礙物偏一點點,射線完全打不到,車身卻會撞上去。所以要看一個扇形:取一個角度範圍裡的最小值,範圍至少要涵蓋車身寬度。程式裡的 sector_min 就是這樣做,用 angle_min 和 angle_increment 把索引換成角度,這樣換一台光達也不用改。
確認一下
動態視窗法裡,機器人現在的速度是 0.5 m/s,最大減速度 0.5 m/s²。前面 0.2 公尺有障礙物。這個速度會被刪掉嗎?
把局部控制的預測時間從 1.5 秒加到 10 秒,會發生什麼事?
局部控制用的是感測器最新的資料,全域規劃用的是舊地圖。走廊的門今天被關起來了。比較可能發生什麼事?
機器人的恢復行為設定成卡住時無限重試,一直往前擠。這樣有什麼問題?
Nav2 的元件為什麼大多做成外掛,又用 action 互相呼叫?
重點整理
- 全域規劃看整張地圖、慢;局部控制看附近、快。局部控制目光短淺,靠全域路徑才不會走進死路。
- 動態視窗法:在下一刻做得到的速度裡取樣,預測,刪掉不安全的(包括煞不住的),評分,只執行一個週期。
- 權重決定行為,太看重目標會卡在障礙物前面。沒有安全的速度就停下來。
- 感測要涵蓋車身,不能只看一條射線。
- Nav2 由 BT Navigator、Planner、Controller、Behavior 等元件組成;外部用
NavigateToPose下目標。卡住時有限度地恢復,用盡就回報失敗。
最後一課把這些接起來,再加上一個更難的問題:機器人看到東西的時候,該不該動。