第一階段車道辨識實作報告

👤 411106242 張晴茵 👤 611306007 吳運陽

🎬 實作成果展演

影片展示了 AI Car 在八樓走廊實地測試。

🛠️ 技術核心亮點

為了解決走廊場域的環境變數並提升偵測穩定度,我們開發了以下核心技術:

HSV 顏色過濾 六點多邊形 ROI PID 閉環控制 單線補償機制
📂 查看 GitHub 代碼庫 →

⚡ 系統資料流路 (System Flow)

本系統採多執行緒架構,數據流從「感測」到「執行」形成一個完整的閉環控制鏈:

📷 影像擷取 Picamera2 (640x480)
🌈 影像演算法 HSV 過濾 + 六邊形 ROI
🧮 PID 控制器 計算誤差偏差 (Error)
⚙️ PCA9685 驅動 PWM 控制四輪轉速

* 註:系統透過 frame_lock 鎖定機制,確保影像處理執行緒與 Web 串流執行緒在存取同一幀影像時不發生衝突。

📂 專案架構與核心功能

ROOT ai_car_project /
📄 app.py
CORE
Flask 主程式。負責多執行緒管理、API 通訊與設定存儲。
📄 lane_detection.py
VISION
影像處理核心。執行 HSV 過濾與 ROI 運算,計算車道偏差。
📄 pid_controller.py
LOGIC
PID 控制演算法。負責誤差修正與抗飽和處理,輸出動力比例。
📄 motor_control.py
DRIVER
底層驅動。透過 I²C 操控 PCA9685,封裝四輪運動邏輯。
📄 yolo_model.pt
MODEL
YOLO 權重檔。預留供後續障礙物偵測與交通標誌辨識。
📁 templates /
📄 index.html
UI
Web 控制面板。整合即時串流、PID 調參與 ROI 編輯器。

🔄 研發演進與問題解決 (Troubleshooting)

根據專案開發過程中的實際程式碼更迭,我們總結了以下關鍵挑戰與技術對策:

面臨挑戰 技術對策與優化細節
視野邊緣與路面雜訊
原採用梯形 ROI 遮罩
解決方案:升級為「六點多邊形」ROI
我們將 ROI 從固定梯形升級為具備 6 個可調頂點的多邊形,並結合 HSV 色彩空間過濾,更精確地圈選出路面區域並排除非目標雜訊,如牆角或雜物干擾。
大轉彎時車道線遺失
原偵測邏輯需雙邊線條才能計算
解決方案:實作 Single Lane Fallback (單線補償)
當畫面中只剩左線或右線時(常見於大轉彎),系統會進入「單線模式」。利用系統自動學到的車道半寬(LANE_HALF_WIDTH)來推估虛擬中心點,避免因線條消失而導致轉向失控。
控制響應震盪問題
原馬達控制缺乏精確比例分配
解決方案:PID 閉環控制與即時調參
引入 PID 控制演算法處理偏差值。透過 Web UI 介面,我們能即時調整 Kp 與 Kd 參數,有效抑制小車前進時的左右震盪(蛇行現象),讓動態巡航過程更加平滑穩定。

🔍 關鍵影像處理截圖

OpenCV 偵測畫面 — 六邊形 ROI 遮罩
MODE: AUTO Kp: 0.10 SPD: 25% FPS: 20 no lane → Fallback 啟動

畫面中藍色六邊形為動態 ROI 遮罩範圍。

💡 學習心得與 AI 程式設計的應用

這次專案讓我們真正感受到 AI 工具在程式開發中的實際價值。透過 AI 的輔助,整體開發流程明顯加快。像是當 Canny 邊緣偵測在八樓的反光地板上失效時,我們直接向 AI 詢問原因,Claude 便從 HSV 色彩空間的原理切入,幫助我們理解問題的根源,並建議改用亮度通道來過濾白色車道線。這不僅讓我們找到解法,也更深入理解背後的邏輯。

此外,像六邊形 ROI 的設計思路,以及 PID 各參數(Kp、Ki、Kd)對車輛行為的影響,也都是透過與 AI 的反覆討論逐步釐清的,大幅減少了自行摸索的時間。

在實際使用過程中,我們也逐漸掌握了與 AI 有效互動的方法。當提供的背景資訊越完整、問題描述越具體時,AI 的回應就越精準;反之,如果只是貼上一段程式碼並簡單問「為什麼不能跑」,往往難以得到實質幫助。因此,先整理好問題現象、已嘗試的方法以及預期結果,再交由 AI 分析,會更有效率。