National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 20

專題:會判斷何時介入的巡邏機器人

整合導航與感知,判斷何時介入、何時不介入,再接上真實環境
Interaction實作導覽 50 minute(s)

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 示範,因為它有回應,呼叫端知道對方收到了。要記得:軟體的停止不能取代硬體的急停按鈕。軟體可能當掉,訊息可能到不了,所以真實機器人要有直接切斷馬達電源的實體按鈕,也要有「收不到指令就自己停」的設計。

互動練習:會判斷何時介入的巡邏機器人

黃色圓點是走廊旁的東西,綠色圓圈是巡邏的終點,走廊中間有一根柱子。每個任務都要改 env.py 第 2 行的 SCENARIO,再改 patrol.py。「數值曲線」的藍線是前進速度、紅線是旋轉速度。

這個系統還缺什麼

你剛完成的是骨架,離真實部署還很遠。每一項都值得多想一下:

  • 「人」:這裡的巡邏員只會回一句話。真實的問人要設計介面:讓對方看到什麼(影像會有隱私問題)、多久要回、不回怎麼辦。
  • 同意與告知:機器人上的相機拍到的是真實的人。要告知、要有理由、要限制保留多久,這門課的偵測不做臉部辨識也是這個原因。
  • 信心的校正:這裡的信心是寫死的。真實模型的分數要用實際資料驗證,而且在黑暗、雨天的表現可能完全不同。
  • 測試:這個練習靠五個情境測試。真實系統的情境多很多,也要在模擬、封閉場地、有人陪同的環境依序驗證,不能一開始就放到有人的地方。
  • 速度與力量:這裡的碰撞只是一個數字。真實的機器人有重量,安全設計要限制速度和力量,手臂尤其如此。

一個有用的自我檢查:這個系統讓使用者更有能力、更能掌控,還是只是替他做決定? 能不能拒絕、能不能叫它停、它錯了你知不知道。如果答案不清楚,先別加新功能。

接上真實環境:用 Docker 跑 ROS 2 Lyrical

以下是示意,這門課沒有實際執行這些指令,所以不放任何輸出。 映像檔名稱與指令依官方文件整理,查證日期 2026-11-04;照著做之前請先確認官方最新說明:Docker Hub 的 ros 頁面、osrf/ros 映像檔、ROS 2 官方文件。

瀏覽器裡的模擬和真實環境最大的差別:真實的 rclpy 有 DDS 通訊與真實時間,訊息會延遲、會掉,程式也真的是多個行程同時執行。

  1. 1

    準備 Docker

    到 Docker 官方網站 安裝 Docker。用容器的好處是不用把整個 ROS 2 裝進自己的電腦。ROS 2 Lyrical 的官方映像檔以 Ubuntu 26.04 為基礎,用容器也就不必先換作業系統。

    映像檔有兩個來源:ros:lyrical 是基本版(ros-base),osrf/ros:lyrical-desktop 多了圖形工具與示範節點,檔案比較大。下面用 desktop 版,因為 talker、listener 示範節點已經在裡面。

  2. 2

    在兩個容器裡跑 talker 與 listener

    開兩個終端機,各跑一個。這就是第 3 課的 talker、listener,只是現在是真的兩個行程,用 DDS 互相找到對方。依官方的範例,listener 會印出它收到的 Hello World 訊息。

  3. 3

    用第三個容器看 topic

    再開一個終端機進到容器,使用這條軌道用過的指令。比對一下真實的輸出,和面板裡的模擬輸出有什麼不同。

    有一個實用的除錯方向:如果 listener 收不到訊息,先看兩邊的 ROS_DOMAIN_ID 是否相同,以及容器之間的網路是否允許 DDS 探索。

  4. 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 執行。多半要改的是參數:真實的光達角度、速度上限、安全距離。

這段導覽完成了

確認一下

1.

機器人在有人的走廊巡邏,把門檻從 0.8 降到 0.3。會發生什麼事?

2.

緊急停止放在 control() 裡 state 是 patrol 的分支。按下停止的時候機器人正在 approach,會發生什麼事?

3.

光達斷線時預設停下來,代價是什麼?為什麼還是這樣選?

4.

模型對海報上的背包給了 0.9 的信心。系統要怎麼降低這類錯誤的影響?

5.

一段程式在瀏覽器的模擬環境裡全部任務都通過。可以直接放到真實機器人上嗎?

第 1 次作答

重點整理,以及接下來可以去哪裡

這一課:

  • 感知會錯,所以決策要獨立一層:信心高才動作,不確定就問人,太低就不理。
  • 門檻來自判斷錯的代價,代價要明確寫下來,也要問會受影響的人。
  • 緊急停止是狀態,放在輸出前的最後一關,而且軟體不能取代硬體急停。
  • 感測器要檢查新鮮度,不是有沒有值。失效時預設停下來。

這條軌道走過的路:

階段 學到什麼
ROS 2 基礎 節點、topic、QoS、service、action、TF
移動與控制 差速驅動、里程計、PID、手臂運動學
感知 光達、IMU、卡爾曼濾波、相機、物件偵測
導航 建圖、定位、路徑規劃、局部避障
系統 把它們接起來,判斷何時介入

接下來可以往這些方向:

  • ROS 2 官方教學:把這條軌道的節點搬到真實環境,自己建一個 ROS 2 套件。
  • Gazebo 與 Nav2:在 3D 模擬裡跑完整導航,看看參數怎麼影響行為。
  • 真實的硬體:Uedu CodeLab 的樹莓派軌可以先練感測器與馬達。第一台機器人請從小型、慢速、碰到也不會傷人的開始。
  • 機器手臂:MoveIt 2 處理手臂的規劃與避碰。
  • 機器學習軌:第 14 課的模型是怎麼訓練出來的。
  • 更進階的主題:SLAM、強化學習控制、人機互動。

機器人和一般程式最大的不同,是它的錯誤會發生在真實世界,而且旁邊可能有人。希望你記得的不只是怎麼讓它動,也包括什麼時候該讓它停下來。

這一課完成了!
看我的學習進度
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。