單元主題:實作智慧定速巡航 (ACC)
1. 單元學習目標
本單元旨在引導你完成一個進階的機器人專案。完成後,你將能:
- 分析「智慧定速巡航」的運作原理。
- 應用 狀態管理的概念,將複雜問題拆解為多個可執行的子任務。
- 建構 使用「巢狀 Switch」積木的複雜判斷邏輯。
- 學習 使用「變數」來提升程式碼的可維護性與可讀性。
- 實作 透過「資料線」傳遞感應器數值,達成動態的閉環控制 (Closed-Loop Control)。
2. 問題情境:從手動駕駛到自動控制
在交通情境中,駕駛者會根據路況持續調整車速:前方無車時維持定速,接近前車時減速跟隨,遇到緊急狀況則立刻煞車。這些判斷對人類是本能,但機器人需要明確的指令才能執行。
本單元的挑戰,便是為樂高 Mindstorm 機器人設計一套程式,模擬真實車輛的「智慧定速巡航 (ACC)」功能。
3. 核心概念一:運作狀態管理
要實現 ACC 功能,機器人至少需要三種明確的運作狀態:
| 狀態 |
情境描述 |
機器人行為 |
| 1. 安全巡航 |
前方 60cm 以上無障礙物。 |
以預設的「巡航速度」穩定前進。 |
| 2. 減速跟隨 |
偵測到前方 15cm 至 60cm 內有障礙物。 |
根據與障礙物的距離調整速度。 |
| 3. 緊急停止 |
障礙物進入 15cm 以內的危險區域。 |
立刻停止馬達,避免碰撞。 |
在設計自動化系統時,應優先處理最高風險的狀態,因此「緊急停止」的判斷應具有最高優先級。
4. 核心概念二:決策層級與巢狀 Switch
為了實現具有優先級的判斷,需要使用「巢狀 Switch (Nested Switch)」,也就是在一個 Switch 結構中,再嵌入另一個 Switch。
其決策流程如下:
-
第一層決策 (高優先級):判斷是否進入危險區域。
- 條件:
距離 < 15cm
- 結果為「是」(✔):執行「緊急停止」。
- 結果為「否」(X):進入第二層決策。
-
第二層決策 (次優先級):判斷應巡航或跟隨。
- 條件:
距離 < 60cm
- 結果為「是」(✔):執行「減速跟隨」。
- 結果為「否」(X):執行「安全巡航」。
此結構確保了高優先級的決策(安全)總是被優先執行。我們可以用一個 Mermaid 圖表來視覺化這個流程:
graph TD
subgraph ACC 智慧巡航邏輯
A(迴圈 Loop) --> B{Switch: 距離 < 15cm ?};
B -- "是 ✔" --> C[移動轉向: 關閉];
B -- "否 ✘" --> D{Switch: 距離 < 60cm ?};
D -- "是 ✔" --> E[減速跟隨邏輯];
D -- "否 ✘" --> F[安全巡航邏輯];
end
style C fill:#f9f,stroke:#333,stroke-width:2px
style E fill:#ccf,stroke:#333,stroke-width:2px
style F fill:#cfc,stroke:#333,stroke-width:2px
5. 關鍵技巧:使用變數進行參數管理
在「安全巡航」狀態下,機器人需要一個基準速度值,例如 50。
- 方法一:直接寫入數值
- 在馬達積木的動力參數中直接輸入
50。此方法在需要調整速度時,必須找到對應積木才能修改,缺乏效率。
- 方法二:使用變數管理
- 在程式開頭定義一個名為
CruiseSpeed 的變數並賦值 50。當馬達需要此速度時,再讀取此變數。
- 優點:此方法將參數集中管理,提升了程式的可維護性與可讀性。若要調整巡航速度,僅需修改初始的變數值即可。
6. 程式實作步驟
-
定義巡航速度變數
- 於程式開頭,使用 變數 (Variable) 積木,以「寫入」模式定義
CruiseSpeed,數值為 50。
-
建立主迴圈
- 使用 迴圈 (Loop) 積木包裹後續所有邏輯,使機器人能持續偵測與反應。
-
建立巢狀決策結構
- A. 第一層決策 (緊急停止)
- 於迴圈內,放入第一個 切換 (Switch) 積木,設定條件為「超音波感應器」-「比較」-「距離 < 15cm」。
- 在 「是」(✔) 分支 中,放置「移動轉向」積木,模式設為「關閉」。
- 在 「否」(X) 分支 中,我們將建構次級決策,請將下一個積木放入此處。
- B. 第二層決策 (巡航/跟隨)
- 拖曳第二個 切換 (Switch) 積木,放入第一個 Switch 的「否」(X) 分支內部。
- 設定此新 Switch 的條件為「超音波感應器」-「比較」-「距離 < 60cm」。
-
設定巡航與跟隨狀態的馬達行為
- A. 減速跟隨 (第二層的「是」分支)
- 使用「超音波感應器」(測量模式)積木,並透過 資料線 將其「測得距離」輸出,連接至「移動轉向」(開啟模式)積木的「動力」輸入。
- B. 安全巡航 (第二層的「否」分支)
- 使用 變數 (Variable) 積木,以「讀取」模式取得
CruiseSpeed 的值。
- 透過 資料線 將其「值」輸出,連接至「移動轉向」(開啟模式)積木的「動力」輸入。
7. 挑戰與延伸:進階功能實作
完成基礎的 ACC 功能後,一個優秀的工程師會思考如何讓系統更完善、更智慧。以下四個挑戰將引導你從不同面向,對你的智慧巡航車進行優化與升級。
挑戰一:系統參數調校 (Parameter Tuning)
目標
學習調整程式中的關鍵參數,並分析參數變化對系統行為的影響,理解機器人「個性」的由來。
核心概念
在我們的 ACC 系統中,15 (緊急停止距離) 和 60 (警戒距離) 這兩個數字,是定義機器人行為模式的關鍵參數 (Parameters)。它們劃分了三個行為區域:
- 安全區 (
> 60cm)
- 減速區 (
15cm - 60cm)
- 危險區 (
< 15cm)
調整這兩個參數,就是在改變這三個區域的大小,這會直接影響機器人的反應靈敏度與決策模式。
操作步驟
- 找到參數位置:
15:位於第一層 Switch 積木的條件中。
60:位於第二層 Switch 積木的條件中。
- 進行系統性測試:
- 測試組合 A (膽小型):將
緊急停止距離 提高到 25,警戒距離 提高到 80。
- 測試組合 B (激進型):將
緊急停止距離 降低到 10,警戒距離 降低到 40。
- 測試組合 C (自訂組合):自行設計一組你認為最理想的參數。
思考與觀察
- 「膽小型」機器人開起來有什麼感覺?它的優點和缺點是什麼?
- 「激進型」機器人開起來又有什麼感覺?在什麼情境下它可能會有危險?
- 「減速區」的範圍大小(
警戒距離 - 緊急停止距離)對機器人的駕駛體驗有什麼影響?範圍大比較好,還是小比較好?
挑戰二:增加自動緩衝行為
目標
在緊急停止後,增加一個自動倒車的動作,為機器人創造更安全的反應空間。
核心概念
這個挑戰的核心是擴充狀態行為。原本「緊急停止」狀態的行為只有「停止馬達」,現在我們要將其擴充為一個動作序列 (Action Sequence):「停止 -> 短暫倒車 -> 再次停止」。
操作步驟
- 找到緊急停止分支:也就是第一層 Switch 的「是」(✔) 分支。
- 修改動作序列:
- 目前此分支中只有一個「移動轉向」積木,模式為「關閉」。
- 在它後面,再增加一個「移動轉向」積木。
- 設定這個新的積木:
- 動力 (Power):設為一個負值,例如
-30 (代表倒車)。
- 模式:設為「開啟達秒數 (On for Seconds)」,並設定一個短暫的時間,例如
0.5 秒。
- (可選) 在倒車積木後,可以再加一個「移動轉向」設為「關閉」的積木,確保機器人倒車後會完全停穩。
思考與觀察
- 增加倒車行為後,機器人的安全性是否提升了?
- 如果倒車的動力或秒數設定不當(例如太大或太久),可能會發生什麼非預期的情況?
- 這個自動緩衝行為,在什麼樣的真實情境中特別有用?
挑戰三:系統狀態視覺化
目標
利用主機螢幕,即時顯示機器人目前的運作狀態,使其更易於除錯與理解。
核心概念
視覺化回饋 (Visual Feedback) 是人機互動的關鍵一環。透過在程式的不同分支中加入「顯示 (Display)」積木,我們可以將內部的程式狀態,以文字或圖形的方式呈現在外部,這對於監控與除錯非常有幫助。
操作步驟
- 找到三個最終狀態的分支:
- 緊急停止:第一層 Switch 的「是」(✔) 分支。
- 減速跟隨:第二層 Switch 的「是」(✔) 分支。
- 安全巡航:第二層 Switch 的「否」(X) 分支。
- 加入顯示積木:
- 在上述每一個分支的最前面,放入一個「顯示 (Display)」積木。
- 設定顯示內容:將模式設為「文字」-「網格」。
- 在「緊急停止」分支,顯示文字
STOP!。
- 在「減速跟隨」分支,顯示文字
Follow。
- 在「安全巡航」分支,顯示文字
Cruise。
- 重要:記得勾選「清除螢幕 (Clear Screen)」選項,確保每次只顯示最新的狀態。
思考與觀察
- 執行程式時,螢幕上的文字是否能準確地對應機器人的行為?
- 如果機器人行為不符合預期,螢幕上的狀態文字能否幫助你更快地找到問題在哪個程式分支?
- 除了文字,你還能用什麼圖形來代表這三種狀態,讓介面更直觀?
挑戰四:非線性智慧調速
目標
透過數學運算,將線性的速度控制,升級為非線性的速度曲線,以實作更細膩、更多樣的駕駛「個性」。
核心概念
目前的「減速跟隨」模式是線性的 (速度 = 距離),反應直接但略顯單一。非線性控制則是讓速度與距離的關係,變成一條曲線。這意味著在不同距離區間,速度的變化率是不同的,從而創造出更豐富的動態效果。
技術提示:EV3 的隱藏數學超能力
你可能不知道,EV3 的「數學運算」積木在切換到「進階 (Advanced)」模式後,其實是一個非常強大的工具。它不僅支援四則運算,還內建了許多高階函數,包含:
- sqrt(a):計算 a 的平方根。
- log(a):計算 a 的常用對數 (base 10)。
- ln(a):計算 a 的自然對數。
- abs(a):計算 a 的絕對值。
- 三角函數:sin(a), cos(a), tan(a) 等。
這為我們實現複雜的控制演算法,提供了堅實的基礎。
操作步驟
- 找到減速跟隨分支:也就是第二層 Switch 的「是」(✔) 分支。
- 插入數學運算積木:
- 在「超音波感應器」和「移動轉向」積木之間,放入一個 數學運算 (Math) 積木。
- 將感應器的「測得距離」資料線,連接到數學積木的
a 輸入。
- 將數學積木的「結果」資料線,連接到移動轉向的「動力」輸入。
- 設定非線性公式:將數學積木的模式設為「進階 (Advanced)」,並在公式框中輸入以下公式進行實驗。
- A. 漸進趨緩型 (平方根曲線)
- 公式:
sqrt(a) * 8
- 效果:起步和煞車都非常柔和,像一個沉穩、謹慎的駕駛。
- B. 積極趨近型 (平方曲線)
- 公式:
(a * a) / 60
- 效果:遠距離時加速快,近距離時減速也快,像一個充滿活力的年輕駕駛。
思考與觀察
sqrt(a) * 8 公式中的 8 這個常數,如果把它變大或變小,對機器人的行為有什麼影響?(提示:這個常數被稱為「增益 (Gain)」)
(a * a) / 60 公式中的 60 這個常數,為什麼要用除法?如果把它變大或變小,又有什麼影響?
- 動手實作:請實作
log(a) 曲線,並描述它的駕駛個性。它與 sqrt(a) 有何不同?(提示:你可能需要一個放大係數,例如 log(a) * 20,因為 log 函數的增長非常緩慢。)