Learning Objectives
- 把偵測結果的方位角接到 P 控制,讓機器人轉向並走向目標
- 處理目標不在視野內:什麼時候該找、什麼時候該停
- 說明延遲與低更新率為什麼會造成振盪
- 用信心門檻決定要不要動作,並說明判斷錯的代價
把偵測接上控制
第 14 課的模型告訴你「椅子在這個框裡」,第 13 課告訴你框的中心對應哪個方位角,第 9 課告訴你有誤差就修正。三個接起來,就是視覺伺服(visual servoing):讓機器人依照看到的東西動作。
相機 → 偵測(框)→ 方位角 → P 控制 → /cmd_vel → 機器人轉了 → 相機看到的也變了
這一課的偵測結果是模擬的。 第 14 課是真的模型在看影像;這裡的 /camera/detections 是模擬世界直接用幾何算出來的,沒有影像,也沒有經過模型:
[{"label": "chair", "bearing": 0.464, "distance": 2.24}]
bearing 是方位角(弧度,左正右負),distance 是距離(公尺)。在視野內(預設 ±30°)、距離內(預設 4 公尺)就看得到。和真實的差別要記住:
- 不會認錯、不會漏掉,也沒有信心分數(待會由一個課程寫的節點加上)。
- 模擬的偵測穿得過牆,真實相機不行。
distance在真實系統要另外來:光達、深度相機,或第 13 課的已知大小估算。- 要接成真實系統,就是寫一個節點,訂閱相機影像、跑第 14 課的模型、依第 13 課的公式算方位角,再發布同樣格式的訊息。控制的部分不用改,這正是拆成節點的好處。
這個模擬世界的偵測是每秒 5 筆(0.2 秒一筆),比控制迴路(0.1 秒)慢。
用數字看延遲造成的振盪
不用 ROS,只用一個變數代表方位角,每一步(0.2 秒)下一次指令。同樣的增益跑兩次:沒有延遲時方位角一路收斂到 0;延遲兩步時,它衝過 0,跑到 −0.52 才回頭。
目標不見了要怎麼辦
「看不到目標」有兩種完全不同的情況,要分開處理:
| 情況 | 訊息 | 意思 | 該做的事 |
|---|---|---|---|
| 目標不在視野內 | 訊息有來,清單是空的 | 相機正常,只是沒看到 | 可以找:原地慢慢轉,或回到上次看到的方向 |
| 感測器失效 | 訊息不來了 | 不知道現在是什麼情況 | 停下來 |
第二種最危險。程式把最後一筆資料留在變數裡,看起來一切正常,機器人卻是用幾秒前的資料在走。所以要記下最後一次收到訊息的時間,太久沒收到就停。真實系統裡可以用訊息的 header.stamp,也要注意相機和電腦的時鐘有沒有對齊。
now = self.get_clock().now().nanoseconds / 1e9
if now - self.last_msg_time > 1.0:
self.pub.publish(Twist()) # 全部是 0:停下來
return
注意是發布全 0,不是不發布。這個模擬世界和許多真實底盤一樣,收不到新指令時可能繼續照上一個指令走(要看驅動程式怎麼設定)。
這和看門狗(watchdog)是同樣的想法:預設是停,有持續的新資料才能動。真實機器人的馬達驅動器常常也有同樣的設計:太久沒收到速度指令就自動停止。
信心低的時候要不要動作
第 14 課看到模型會把海報當真。下面的練習模擬這個情況:牆邊的海報被標成 chair,分數 0.42;真的椅子在更遠的地方,分數 0.86。這兩個分數是課程寫死的示意值,由 scorer.py 加上去,不是模型算的。
門檻怎麼設取決於判斷錯的代價:
| 門檻 | 誤判 | 漏掉 |
|---|---|---|
| 太低 | 走向海報,可能撞牆 | 很少 |
| 太高 | 很少 | 真的椅子也不動作,任務永遠完成不了 |
介入的動作越大、越難復原,門檻就要越高。「信心不夠時先停下來問人」常常比「賭一把」或「什麼都不做」都好。
確認一下
偵測結果的方位角是 +0.3(目標在左邊),程式寫成 cmd.angular.z = -1.0 * bearing。會發生什麼?
把偵測從每秒 5 筆降到每秒 1 筆,增益不變。最可能怎樣?
程式裡 self.target 只在收到訊息時更新,tick 一直用 self.target 下指令。相機斷線之後會怎樣?
這一課的 /camera/detections 和第 14 課的偵測結果差在哪裡?
機器人只是要走向一個可能的目標,信心 0.45,旁邊有人。下面哪個作法最合理?
重點整理
- 視覺伺服:偵測 → 方位角 → P 控制 → 機器人轉 → 看到的也變了。
- 這一課的偵測結果是模擬世界算的,第 14 課才是真模型。真實系統要多一個節點把兩者接起來,還要處理模型的錯誤與影像的延遲。
- 延遲與低更新率讓控制器修正過去的誤差,增益太大就來回擺。降增益或補償延遲。
- 「沒看到目標」可以找;「訊息不來了」要停下來。要記錄最後收到資料的時間。
- 信心門檻取決於判斷錯的代價:動作越大越難收回,門檻越高;不確定時放慢、多看或問人。
下一課換一個問題:機器人怎麼邊走邊把光達的資料畫成地圖。