← 回所有專案

競賽作品 ‧ 機構設計與控制程式 · 2018

LEGO 循跡避障機器人

2018 年參加全能機器人國際邀請賽,以 LEGO 機器人拿下循跡競賽第一名。機器人左右各一顆顏色感測器夾著軌道循線,前方以超音波感測器偵測寶特瓶障礙物,搭配四顆全向輪(萬向輪)直接橫向平移閃避,繞過障礙後再自動找回軌道。

LEGO MINDSTORMS EV3顏色感測器超音波感測器全向輪(萬向輪)PD 控制狀態機機器人競賽
LEGO 循跡避障機器人

專案概述

2018 年我參加了全能機器人國際邀請賽的循跡競賽,最後拿下第一名。

循跡競賽的規則很直觀:機器人要沿著場地上的黑色軌道從起點跑到終點,比的是完 成度與速度。難的地方在於軌道上會擺放寶特瓶障礙物——機器人不能撞倒它,必 須自己偵測、繞開,再回到軌道上繼續前進。也就是說,這不只是「跟著線走」,而 是要讓機器人在「循線」與「避障」兩種模式之間可靠地切換。

我的機器人以 LEGO 打造,設計上有三個關鍵:

  • 左右兩顆顏色感測器夾著軌道,用兩邊的反射光差值判斷偏移方向與幅度
  • 前方一顆超音波感測器,負責提早發現寶特瓶障礙物
  • 四顆全向輪(萬向輪),讓機器人可以不轉彎、直接橫向平移閃避障礙,這 是整台車在避障時又快又穩的關鍵

比賽至今已經好幾年,當時的機器人實體與程式都已經沒有保留下來,只剩下獎狀。 這篇是依照我記得的設計重新整理,圖與程式碼皆為重新繪製、改寫的示意。

機構設計:感測器配置與 X 型全向輪

機器人俯視圖:車身四個角各一顆 45 度斜放的全向輪,車頭前方是超音波感測器,下方左右兩顆顏色感測器夾著黑線;右側說明全向輪可以前進、橫向平移與原地旋轉

  • 顏色感測器(左、右):裝在車頭下方、貼近地面,間距略大於軌道寬度。正常 行駛時黑線剛好落在兩顆感測器中間,兩邊都讀到白色;一旦車子偏移,其中一邊就 會先讀到黑線
  • 超音波感測器(前方):朝向行進方向,持續量測前方距離,距離小於門檻就代表 寶特瓶出現在軌道上
  • 四顆全向輪,X 型配置:四顆輪子各自由一顆馬達驅動,以 45 度斜放在車身四 角。全向輪的輪框上有一圈可以自由滾動的小滾輪,所以每顆輪子只在自己的方向上 「出力」,側向不會產生阻力;四顆輪子的出力向量疊加起來,就能組合出前後、 左右、旋轉三種動作

選擇全向輪是整台車最重要的設計決策。一般兩輪差速車遇到障礙物時,必須「轉 彎 → 前進 → 轉回來 → 再轉彎找線」,每一次轉彎都會累積角度誤差,回到軌道時車頭 方向常常是歪的,很容易一找到線就又衝出去。全向輪可以保持車頭方向不變、直接 側移,繞完障礙物後車身仍然和軌道平行,回到線上馬上就能繼續循跡。

循跡控制:兩顆顏色感測器的差值控制

循跡判斷示意圖:線在正中間時左右感測器都讀到白色,直走;線偏到左邊時左感測器讀到黑色,往左修正;線偏到右邊時右感測器讀到黑色,往右修正

最直覺的寫法是「左邊看到黑就左轉、右邊看到黑就右轉」,但這種**開關式(Bang- Bang)**控制只有兩種動作,車子會在線上不停左右擺盪,速度一快就甩出軌道。

改善的方式是使用顏色感測器的反射光強度(0–100 的連續數值),而不是只判斷黑 白:

  1. 計算誤差:error = 左反射值 − 右反射值。線在正中間時兩邊差不多,誤差接近 0;線越偏向某一邊,那一邊越暗,誤差的絕對值就越大
  2. 比例修正(P):轉向量與誤差成正比——偏一點就修一點、偏很多就修很多,車子 的行進軌跡會平滑很多
  3. 微分修正(D):再加上「誤差的變化量」,在車子快速擺回中線時提前減少修 正,抑制過衝造成的來回擺盪

當時程式是用 EV3 的圖形化積木撰寫,以下用虛擬碼表達核心邏輯:

text
Kp = 0.8           // 比例增益,依實測調整
Kd = 4.0           // 微分增益
BASE_SPEED = 45    // 直線時的基礎速度
lastError = 0

loop:
    error = leftSensor.reflected - rightSensor.reflected
    turn  = Kp * error + Kd * (error - lastError)
    lastError = error

    // X 型全向輪:前進分量 + 旋轉分量
    drive(forward = BASE_SPEED, strafe = 0, rotate = turn)

Kp、Kd 和基礎速度沒有標準答案,只能在場地上反覆實測:先只調 Kp 到車子剛 好開始擺盪,再慢慢加上 Kd 把擺盪壓下來,最後才把速度往上拉。另外每次換場地 都會先校正感測器——讀一次白底、一次黑線的反射值,因為比賽場地的燈光和練習 時不同,數值會跟著偏移。

避障:狀態機 + 橫向平移

避障路徑示意圖:超音波偵測到寶特瓶後停車,往右平移離開軌道,直走越過瓶身,再往左平移直到顏色感測器重新看到黑線,回到循跡模式

避障的流程用一個簡單的狀態機實作,每個狀態只做一件事,結束條件明確,不容 易在比賽中「卡在中間」:

狀態動作切換條件
FOLLOW循跡(上一段的差值控制)超音波距離 < 門檻 → STEP_OUT
STEP_OUT停車,往右橫向平移平移固定距離(馬達角度) → PASS
PASS直線前進前進超過瓶身長度 → STEP_IN
STEP_IN往左橫向平移任一顏色感測器讀到黑線 → FOLLOW

幾個在練習時踩過、後來特別處理的細節:

  • 距離門檻要留緩衝:超音波量測有延遲,車速越快煞停距離越長。門檻設得太近會 直接撞上瓶子,太遠又可能誤判場邊的物體,最後依實際車速調出一個剛好的距離
  • 用馬達角度量距離,而不是用時間:平移與前進的距離都以馬達編碼器的旋轉角度 判斷,不會因為電池電量下降、馬達變慢而走不夠遠
  • 回線時用「找到線」當結束條件:STEP_IN 不是平移固定距離,而是一直平移到顏 色感測器重新看到黑線為止,即使前面幾步有誤差也能自我修正
  • 回線後先降速:剛回到軌道時車身位置還不穩定,先以較低速度循跡一小段,再恢 復正常速度

競賽成果

  • 在 2018 全能機器人國際邀請賽 循跡競賽 中拿下 第一名
  • 機器人能穩定完成循線,遇到寶特瓶障礙物時自動繞開、回到軌道,全程不需人工介 入

收穫

  • 先把問題拆成狀態,再處理每個狀態:循跡和避障如果寫在同一個大迴圈裡,條件 會互相干擾;拆成狀態機後,每個狀態只要關心自己的動作與結束條件,除錯時也能很 快知道車子卡在哪一步。這和我後來設計後端流程、事件驅動系統時的思考方式是一樣 的
  • 回饋控制的直覺:從開關式控制改成比例 + 微分控制,是我第一次實際感受到 「依誤差大小調整反應」的威力。後來在 Kubernetes 上設定 HPA、調整告警門檻 時,背後其實是同一套回饋迴路的觀念
  • 硬體選型決定了軟體的難度:選擇全向輪讓避障邏輯簡化成「平移出去、平移回 來」,省掉大量轉彎角度的修正程式。好的架構選擇,往往能讓後面的程式寫得更簡 單

使用技術

  • 平台:LEGO MINDSTORMS EV3(主控制器、四顆大型伺服馬達)
  • 感測器:顏色感測器 × 2(反射光強度模式)、超音波感測器 × 1
  • 機構:X 型配置四顆全向輪(萬向輪),支援全向移動
  • 控制:PD 循跡控制、避障狀態機、馬達編碼器距離控制、感測器校正
  • 開發工具:EV3 圖形化程式(積木式)