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 15

用視覺控制機器人

看到目標就轉過去:把偵測結果接到控制
Interaction 30 minute(s)

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 秒)慢。

互動練習:轉向目標

黃點是椅子。detector.py 把模擬的偵測結果轉發到 /detector/objects,它裡面的 DELAY_S 可以模擬延遲。到「數值曲線」看:藍線是目標的方位角(越接近 0 越好),紅線是轉向指令。

用數字看延遲造成的振盪

不用 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)是同樣的想法:預設是停,有持續的新資料才能動。真實機器人的馬達驅動器常常也有同樣的設計:太久沒收到速度指令就自動停止。

互動練習:找到目標、走過去、相機壞了要停

機器人一開始朝下,椅子在左上方,不在視野內。camera.py 把模擬的偵測結果轉發到 /detector/objects,把裡面的 FAIL_AT 改掉就能模擬相機中途失效。

信心低的時候要不要動作

第 14 課看到模型會把海報當真。下面的練習模擬這個情況:牆邊的海報被標成 chair,分數 0.42;真的椅子在更遠的地方,分數 0.86。這兩個分數是課程寫死的示意值,由 scorer.py 加上去,不是模型算的。

門檻怎麼設取決於判斷錯的代價:

門檻 誤判 漏掉
太低 走向海報,可能撞牆 很少
太高 很少 真的椅子也不動作,任務永遠完成不了

介入的動作越大、越難復原,門檻就要越高。「信心不夠時先停下來問人」常常比「賭一把」或「什麼都不做」都好。

互動練習:用信心門檻過濾

藍點從左邊出發。靠近的黃點是牆邊的海報,遠一點的黃點才是真的椅子。程式現在選最近的目標。

確認一下

1.

偵測結果的方位角是 +0.3(目標在左邊),程式寫成 cmd.angular.z = -1.0 * bearing。會發生什麼?

2.

把偵測從每秒 5 筆降到每秒 1 筆,增益不變。最可能怎樣?

3.

程式裡 self.target 只在收到訊息時更新,tick 一直用 self.target 下指令。相機斷線之後會怎樣?

4.

這一課的 /camera/detections 和第 14 課的偵測結果差在哪裡?

5.

機器人只是要走向一個可能的目標,信心 0.45,旁邊有人。下面哪個作法最合理?

第 1 次作答

重點整理

  • 視覺伺服:偵測 → 方位角 → P 控制 → 機器人轉 → 看到的也變了。
  • 這一課的偵測結果是模擬世界算的,第 14 課才是真模型。真實系統要多一個節點把兩者接起來,還要處理模型的錯誤與影像的延遲。
  • 延遲與低更新率讓控制器修正過去的誤差,增益太大就來回擺。降增益或補償延遲。
  • 「沒看到目標」可以找;「訊息不來了」要停下來。要記錄最後收到資料的時間。
  • 信心門檻取決於判斷錯的代價:動作越大越難收回,門檻越高;不確定時放慢、多看或問人。

下一課換一個問題:機器人怎麼邊走邊把光達的資料畫成地圖。

這一課完成了!
Next lesson:佔用柵格建圖
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。