單元主題:實作智慧定速巡航 (ACC)

1. 單元學習目標

本單元旨在引導你完成一個進階的機器人專案。完成後,你將能:

  1. 分析「智慧定速巡航」的運作原理。
  2. 應用 狀態管理的概念,將複雜問題拆解為多個可執行的子任務。
  3. 建構 使用「巢狀 Switch」積木的複雜判斷邏輯。
  4. 學習 使用「變數」來提升程式碼的可維護性與可讀性。
  5. 實作 透過「資料線」傳遞感應器數值,達成動態的閉環控制 (Closed-Loop Control)。

2. 問題情境:從手動駕駛到自動控制

在交通情境中,駕駛者會根據路況持續調整車速:前方無車時維持定速,接近前車時減速跟隨,遇到緊急狀況則立刻煞車。這些判斷對人類是本能,但機器人需要明確的指令才能執行。

本單元的挑戰,便是為樂高 Mindstorm 機器人設計一套程式,模擬真實車輛的「智慧定速巡航 (ACC)」功能。

3. 核心概念一:運作狀態管理

要實現 ACC 功能,機器人至少需要三種明確的運作狀態:

狀態 情境描述 機器人行為
1. 安全巡航 前方 60cm 以上無障礙物。 以預設的「巡航速度」穩定前進。
2. 減速跟隨 偵測到前方 15cm 至 60cm 內有障礙物。 根據與障礙物的距離調整速度。
3. 緊急停止 障礙物進入 15cm 以內的危險區域。 立刻停止馬達,避免碰撞。

在設計自動化系統時,應優先處理最高風險的狀態,因此「緊急停止」的判斷應具有最高優先級。

4. 核心概念二:決策層級與巢狀 Switch

為了實現具有優先級的判斷,需要使用「巢狀 Switch (Nested Switch)」,也就是在一個 Switch 結構中,再嵌入另一個 Switch。

其決策流程如下:

  1. 第一層決策 (高優先級):判斷是否進入危險區域。

    • 條件距離 < 15cm
    • 結果為「是」(✔):執行「緊急停止」
    • 結果為「否」(X):進入第二層決策
  2. 第二層決策 (次優先級):判斷應巡航或跟隨。

    • 條件距離 < 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

6. 程式實作步驟

  1. 定義巡航速度變數

    • 於程式開頭,使用 變數 (Variable) 積木,以「寫入」模式定義 CruiseSpeed,數值為 50
  2. 建立主迴圈

    • 使用 迴圈 (Loop) 積木包裹後續所有邏輯,使機器人能持續偵測與反應。
  3. 建立巢狀決策結構

    • A. 第一層決策 (緊急停止)
      • 於迴圈內,放入第一個 切換 (Switch) 積木,設定條件為「超音波感應器」-「比較」-「距離 < 15cm」。
      • 「是」(✔) 分支 中,放置「移動轉向」積木,模式設為「關閉」
      • 「否」(X) 分支 中,我們將建構次級決策,請將下一個積木放入此處。
    • B. 第二層決策 (巡航/跟隨)
      • 拖曳第二個 切換 (Switch) 積木,放入第一個 Switch 的「否」(X) 分支內部
      • 設定此新 Switch 的條件為「超音波感應器」-「比較」-「距離 < 60cm」。
  4. 設定巡航與跟隨狀態的馬達行為

    • A. 減速跟隨 (第二層的「是」分支)
      • 使用「超音波感應器」(測量模式)積木,並透過 資料線 將其「測得距離」輸出,連接至「移動轉向」(開啟模式)積木的「動力」輸入。
    • B. 安全巡航 (第二層的「否」分支)
      • 使用 變數 (Variable) 積木,以「讀取」模式取得 CruiseSpeed 的值。
      • 透過 資料線 將其「值」輸出,連接至「移動轉向」(開啟模式)積木的「動力」輸入。

7. 挑戰與延伸:進階功能實作

完成基礎的 ACC 功能後,一個優秀的工程師會思考如何讓系統更完善、更智慧。以下四個挑戰將引導你從不同面向,對你的智慧巡航車進行優化與升級。


挑戰一:系統參數調校 (Parameter Tuning)

目標

學習調整程式中的關鍵參數,並分析參數變化對系統行為的影響,理解機器人「個性」的由來。

核心概念

在我們的 ACC 系統中,15 (緊急停止距離) 和 60 (警戒距離) 這兩個數字,是定義機器人行為模式的關鍵參數 (Parameters)。它們劃分了三個行為區域:

  1. 安全區 (> 60cm)
  2. 減速區 (15cm - 60cm)
  3. 危險區 (< 15cm)

調整這兩個參數,就是在改變這三個區域的大小,這會直接影響機器人的反應靈敏度與決策模式。

操作步驟

  1. 找到參數位置
    • 15:位於第一層 Switch 積木的條件中。
    • 60:位於第二層 Switch 積木的條件中。
  2. 進行系統性測試
    • 測試組合 A (膽小型):將 緊急停止距離 提高到 25警戒距離 提高到 80
    • 測試組合 B (激進型):將 緊急停止距離 降低到 10警戒距離 降低到 40
    • 測試組合 C (自訂組合):自行設計一組你認為最理想的參數。

思考與觀察


挑戰二:增加自動緩衝行為

目標

在緊急停止後,增加一個自動倒車的動作,為機器人創造更安全的反應空間。

核心概念

這個挑戰的核心是擴充狀態行為。原本「緊急停止」狀態的行為只有「停止馬達」,現在我們要將其擴充為一個動作序列 (Action Sequence):「停止 -> 短暫倒車 -> 再次停止」。

操作步驟

  1. 找到緊急停止分支:也就是第一層 Switch 的「是」(✔) 分支。
  2. 修改動作序列
    • 目前此分支中只有一個「移動轉向」積木,模式為「關閉」。
    • 在它後面,再增加一個「移動轉向」積木。
    • 設定這個新的積木:
      • 動力 (Power):設為一個負值,例如 -30 (代表倒車)。
      • 模式:設為「開啟達秒數 (On for Seconds)」,並設定一個短暫的時間,例如 0.5 秒。
    • (可選) 在倒車積木後,可以再加一個「移動轉向」設為「關閉」的積木,確保機器人倒車後會完全停穩。

思考與觀察


挑戰三:系統狀態視覺化

目標

利用主機螢幕,即時顯示機器人目前的運作狀態,使其更易於除錯與理解。

核心概念

視覺化回饋 (Visual Feedback) 是人機互動的關鍵一環。透過在程式的不同分支中加入「顯示 (Display)」積木,我們可以將內部的程式狀態,以文字或圖形的方式呈現在外部,這對於監控與除錯非常有幫助。

操作步驟

  1. 找到三個最終狀態的分支
    • 緊急停止:第一層 Switch 的「是」(✔) 分支。
    • 減速跟隨:第二層 Switch 的「是」(✔) 分支。
    • 安全巡航:第二層 Switch 的「否」(X) 分支。
  2. 加入顯示積木
    • 在上述每一個分支的最前面,放入一個「顯示 (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) 等。

這為我們實現複雜的控制演算法,提供了堅實的基礎。

操作步驟

  1. 找到減速跟隨分支:也就是第二層 Switch 的「是」(✔) 分支。
  2. 插入數學運算積木
    • 在「超音波感應器」和「移動轉向」積木之間,放入一個 數學運算 (Math) 積木。
    • 將感應器的「測得距離」資料線,連接到數學積木的 a 輸入。
    • 將數學積木的「結果」資料線,連接到移動轉向的「動力」輸入。
  3. 設定非線性公式:將數學積木的模式設為「進階 (Advanced)」,並在公式框中輸入以下公式進行實驗。
    • A. 漸進趨緩型 (平方根曲線)
      • 公式sqrt(a) * 8
      • 效果:起步和煞車都非常柔和,像一個沉穩、謹慎的駕駛
    • B. 積極趨近型 (平方曲線)
      • 公式(a * a) / 60
      • 效果:遠距離時加速快,近距離時減速也快,像一個充滿活力的年輕駕駛

思考與觀察