Learning Objectives
- 把巡邏、感知與決策接成一個會判斷的系統
- 依信心分成三種反應:動作、問人、不理;用判斷錯的代價來決定門檻
- 做出立刻生效的緊急停止,以及感測器失效時預設停下的行為
- 知道怎麼把這條軌道學到的東西接到真實的 ROS 2 環境
看得到,不代表應該動
這條軌道到現在,你寫的機器人都在回答「怎麼做」:怎麼定位、怎麼規劃、怎麼閃開。最後一課要回答另一個問題:該不該做。
想像晚上在圖書館巡邏的機器人。相機看到走廊上有一個背包,它可以:靠過去通報、問值班的人、或是繼續走。如果那其實是一張海報上的背包呢?如果它正在靠近的時候有人在旁邊讀書呢?
很多機器人程式把感知的結果直接接到動作:if 看到: 靠過去。第 14 課已經看到偵測會錯,把會錯的東西直接接到會動的東西上,錯誤就進了真實世界。
這個專題把判斷寫成明確的規則:
| 情況 | 機器人該怎麼做 | 為什麼 |
|---|---|---|
| 信心高 | 動作 | 有足夠依據 |
| 信心中等 | 不動作,先問人 | 不確定時,不要讓旁人承擔誤判的後果 |
| 信心低 | 繼續原本的工作 | 不要被雜訊牽著走,也不要一直打擾人 |
| 有人按停止 | 立刻停,什麼都不能蓋掉它 | 人的決定優先於機器的任何判斷 |
| 感測器沒有資料 | 預設停下來 | 不知道前面有什麼,就不該繼續走 |
最後兩列是不能妥協的安全規則。設計這種系統時,先想「壞掉的時候會怎樣」。
門檻要設多少:先寫出判斷錯的代價
「信心大於 0.8 才動作」,為什麼是 0.8?這個數字不該憑感覺設。門檻是在兩種錯誤之間取捨:
| 機器人判斷「有事」 | 機器人判斷「沒事」 | |
|---|---|---|
| 真的有事 | 正確 | 漏掉:背包裡可能是別人的重要物品,沒人知道 |
| 其實沒事 | 誤判:跑去打擾人、干擾讀書的人 | 正確 |
門檻調低,漏掉變少,誤判變多;門檻調高則相反。沒有兩邊都最好的門檻,只有「在這個場合,哪一種錯比較貴」。
把代價寫成數字,就能比較三種行動的期望代價。設 p 是「真的有事」的機率:
動作(靠過去):判斷錯時會打擾人 期望代價 = (1 - p) × 誤判的代價
不理: 判斷錯時會漏掉 期望代價 = p × 漏掉的代價
問人: 不管對錯都打擾一下 期望代價 = 問人的代價
選期望代價最低的。這個計算有兩個容易被忽略的地方:
- 代價要先寫下來,而且要問會被影響的人。巡邏圖書館和巡邏工廠的數字不同;對機器人只是一個數字,對被它打擾的人不是。
- 信心分數不等於真實的機率。模型輸出 0.9 不代表 90% 是對的,它常常過度自信。真實系統要先用資料校正(calibration),才能把它當機率用。下面的小程式為了簡單,直接當成機率。
問人也有成本。如果機器人每分鐘都來問一次,值班的人很快就不再認真看,等於沒有問。這也是為什麼低信心要直接不理。
動手寫:選期望代價最低的行動
補上 decide:算三種行動的期望代價,回傳最低的那個名稱('動作'、'問人'、'不理')。下面用兩種場合測試:圖書館(打擾人的代價高),和放著危險物品的實驗室(漏掉的代價高)。
這個系統怎麼接
下面的練習有兩支程式:
patrol.py:你要改的巡邏節點,沿著路點巡邏(路徑跟隨),路上的柱子用第 19 課的光達閃避,也負責判斷。env.py:扮演它周圍的世界。它把模擬的偵測結果加上信心分數再發出去,轉發光達,也扮演會回覆的巡邏員與按停止的人。你只需要改第 2 行選情境。
| 主題/服務 | 方向 | 內容 |
|---|---|---|
/perception/targets |
env → patrol | 偵測到的東西,含 confidence、bearing、distance |
/scan_safe |
env → patrol | 光達(lidar_fail 情境會斷掉) |
/ask_human、/human_reply |
雙向 | 問人與人的回覆 |
/emergency_stop |
人 → patrol | std_srvs/SetBool,緊急停止 |
偵測結果和第 15 課一樣是模擬的,世界直接算出物體的方位角與距離,不是影像處理的結果;信心是這裡寫死的數字,用來製造不同情境。真實系統要把第 14 課的模型接到這個位置。
緊急停止用 service 示範,因為它有回應,呼叫端知道對方收到了。要記得:軟體的停止不能取代硬體的急停按鈕。軟體可能當掉,訊息可能到不了,所以真實機器人要有直接切斷馬達電源的實體按鈕,也要有「收不到指令就自己停」的設計。
這個系統還缺什麼
你剛完成的是骨架,離真實部署還很遠。每一項都值得多想一下:
- 「人」:這裡的巡邏員只會回一句話。真實的問人要設計介面:讓對方看到什麼(影像會有隱私問題)、多久要回、不回怎麼辦。
- 同意與告知:機器人上的相機拍到的是真實的人。要告知、要有理由、要限制保留多久,這門課的偵測不做臉部辨識也是這個原因。
- 信心的校正:這裡的信心是寫死的。真實模型的分數要用實際資料驗證,而且在黑暗、雨天的表現可能完全不同。
- 測試:這個練習靠五個情境測試。真實系統的情境多很多,也要在模擬、封閉場地、有人陪同的環境依序驗證,不能一開始就放到有人的地方。
- 速度與力量:這裡的碰撞只是一個數字。真實的機器人有重量,安全設計要限制速度和力量,手臂尤其如此。
一個有用的自我檢查:這個系統讓使用者更有能力、更能掌控,還是只是替他做決定? 能不能拒絕、能不能叫它停、它錯了你知不知道。如果答案不清楚,先別加新功能。
接上真實環境:用 Docker 跑 ROS 2 Lyrical
以下是示意,這門課沒有實際執行這些指令,所以不放任何輸出。 映像檔名稱與指令依官方文件整理,查證日期 2026-11-04;照著做之前請先確認官方最新說明:Docker Hub 的 ros 頁面、osrf/ros 映像檔、ROS 2 官方文件。
瀏覽器裡的模擬和真實環境最大的差別:真實的 rclpy 有 DDS 通訊與真實時間,訊息會延遲、會掉,程式也真的是多個行程同時執行。
-
1
準備 Docker
到 Docker 官方網站 安裝 Docker。用容器的好處是不用把整個 ROS 2 裝進自己的電腦。ROS 2 Lyrical 的官方映像檔以 Ubuntu 26.04 為基礎,用容器也就不必先換作業系統。
映像檔有兩個來源:
ros:lyrical是基本版(ros-base),osrf/ros:lyrical-desktop多了圖形工具與示範節點,檔案比較大。下面用 desktop 版,因為 talker、listener 示範節點已經在裡面。 -
2
在兩個容器裡跑 talker 與 listener
開兩個終端機,各跑一個。這就是第 3 課的 talker、listener,只是現在是真的兩個行程,用 DDS 互相找到對方。依官方的範例,listener 會印出它收到的
Hello World訊息。 -
3
用第三個容器看 topic
再開一個終端機進到容器,使用這條軌道用過的指令。比對一下真實的輸出,和面板裡的模擬輸出有什麼不同。
有一個實用的除錯方向:如果 listener 收不到訊息,先看兩邊的
ROS_DOMAIN_ID是否相同,以及容器之間的網路是否允許 DDS 探索。 -
4
再往前:Gazebo 與 Nav2
Gazebo 是 ROS 常用的 3D 物理模擬器,會模擬慣性、摩擦與感測器雜訊,比這條軌道的 2D 世界真實很多。Gazebo 官方文件目前建議 ROS 2 Lyrical 搭配 Gazebo Jetty。
osrf/ros:lyrical-simulation映像檔預先裝好模擬相關套件;在容器裡顯示圖形介面要另外設定,依作業系統不同。Nav2 就是第 19 課談的導航系統。它有官方的入門教學,用模擬機器人跑完整的導航,包括在 RViz 上給目標點。文件在 docs.nav2.org,這裡沒有實際執行,版本與套件名稱請以官方文件為準。
把你在瀏覽器寫的節點帶過去,要做的事情不多:程式碼不用改,放進一個 ROS 2 套件,用
colcon build建置,再用ros2 run執行。多半要改的是參數:真實的光達角度、速度上限、安全距離。
確認一下
機器人在有人的走廊巡邏,把門檻從 0.8 降到 0.3。會發生什麼事?
緊急停止放在 control() 裡 state 是 patrol 的分支。按下停止的時候機器人正在 approach,會發生什麼事?
光達斷線時預設停下來,代價是什麼?為什麼還是這樣選?
模型對海報上的背包給了 0.9 的信心。系統要怎麼降低這類錯誤的影響?
一段程式在瀏覽器的模擬環境裡全部任務都通過。可以直接放到真實機器人上嗎?
重點整理,以及接下來可以去哪裡
這一課:
- 感知會錯,所以決策要獨立一層:信心高才動作,不確定就問人,太低就不理。
- 門檻來自判斷錯的代價,代價要明確寫下來,也要問會受影響的人。
- 緊急停止是狀態,放在輸出前的最後一關,而且軟體不能取代硬體急停。
- 感測器要檢查新鮮度,不是有沒有值。失效時預設停下來。
這條軌道走過的路:
| 階段 | 學到什麼 |
|---|---|
| ROS 2 基礎 | 節點、topic、QoS、service、action、TF |
| 移動與控制 | 差速驅動、里程計、PID、手臂運動學 |
| 感知 | 光達、IMU、卡爾曼濾波、相機、物件偵測 |
| 導航 | 建圖、定位、路徑規劃、局部避障 |
| 系統 | 把它們接起來,判斷何時介入 |
接下來可以往這些方向:
- ROS 2 官方教學:把這條軌道的節點搬到真實環境,自己建一個 ROS 2 套件。
- Gazebo 與 Nav2:在 3D 模擬裡跑完整導航,看看參數怎麼影響行為。
- 真實的硬體:Uedu CodeLab 的樹莓派軌可以先練感測器與馬達。第一台機器人請從小型、慢速、碰到也不會傷人的開始。
- 機器手臂:MoveIt 2 處理手臂的規劃與避碰。
- 機器學習軌:第 14 課的模型是怎麼訓練出來的。
- 更進階的主題:SLAM、強化學習控制、人機互動。
機器人和一般程式最大的不同,是它的錯誤會發生在真實世界,而且旁邊可能有人。希望你記得的不只是怎麼讓它動,也包括什麼時候該讓它停下來。