競賽作品 ‧ 機構設計與控制程式 · 2018
LEGO 循跡避障機器人
2018 年參加全能機器人國際邀請賽,以 LEGO 機器人拿下循跡競賽第一名。機器人左右各一顆顏色感測器夾著軌道循線,前方以超音波感測器偵測寶特瓶障礙物,搭配四顆全向輪(萬向輪)直接橫向平移閃避,繞過障礙後再自動找回軌道。
專案概述
2018 年我參加了全能機器人國際邀請賽的循跡競賽,最後拿下第一名。
循跡競賽的規則很直觀:機器人要沿著場地上的黑色軌道從起點跑到終點,比的是完 成度與速度。難的地方在於軌道上會擺放寶特瓶障礙物——機器人不能撞倒它,必 須自己偵測、繞開,再回到軌道上繼續前進。也就是說,這不只是「跟著線走」,而 是要讓機器人在「循線」與「避障」兩種模式之間可靠地切換。
我的機器人以 LEGO 打造,設計上有三個關鍵:
- 左右兩顆顏色感測器夾著軌道,用兩邊的反射光差值判斷偏移方向與幅度
- 前方一顆超音波感測器,負責提早發現寶特瓶障礙物
- 四顆全向輪(萬向輪),讓機器人可以不轉彎、直接橫向平移閃避障礙,這 是整台車在避障時又快又穩的關鍵
比賽至今已經好幾年,當時的機器人實體與程式都已經沒有保留下來,只剩下獎狀。 這篇是依照我記得的設計重新整理,圖與程式碼皆為重新繪製、改寫的示意。
機構設計:感測器配置與 X 型全向輪
- 顏色感測器(左、右):裝在車頭下方、貼近地面,間距略大於軌道寬度。正常 行駛時黑線剛好落在兩顆感測器中間,兩邊都讀到白色;一旦車子偏移,其中一邊就 會先讀到黑線
- 超音波感測器(前方):朝向行進方向,持續量測前方距離,距離小於門檻就代表 寶特瓶出現在軌道上
- 四顆全向輪,X 型配置:四顆輪子各自由一顆馬達驅動,以 45 度斜放在車身四 角。全向輪的輪框上有一圈可以自由滾動的小滾輪,所以每顆輪子只在自己的方向上 「出力」,側向不會產生阻力;四顆輪子的出力向量疊加起來,就能組合出前後、 左右、旋轉三種動作
選擇全向輪是整台車最重要的設計決策。一般兩輪差速車遇到障礙物時,必須「轉 彎 → 前進 → 轉回來 → 再轉彎找線」,每一次轉彎都會累積角度誤差,回到軌道時車頭 方向常常是歪的,很容易一找到線就又衝出去。全向輪可以保持車頭方向不變、直接 側移,繞完障礙物後車身仍然和軌道平行,回到線上馬上就能繼續循跡。
循跡控制:兩顆顏色感測器的差值控制
最直覺的寫法是「左邊看到黑就左轉、右邊看到黑就右轉」,但這種**開關式(Bang- Bang)**控制只有兩種動作,車子會在線上不停左右擺盪,速度一快就甩出軌道。
改善的方式是使用顏色感測器的反射光強度(0–100 的連續數值),而不是只判斷黑 白:
- 計算誤差:
error = 左反射值 − 右反射值。線在正中間時兩邊差不多,誤差接近 0;線越偏向某一邊,那一邊越暗,誤差的絕對值就越大 - 比例修正(P):轉向量與誤差成正比——偏一點就修一點、偏很多就修很多,車子 的行進軌跡會平滑很多
- 微分修正(D):再加上「誤差的變化量」,在車子快速擺回中線時提前減少修 正,抑制過衝造成的來回擺盪
當時程式是用 EV3 的圖形化積木撰寫,以下用虛擬碼表達核心邏輯:
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 圖形化程式(積木式)