使用 Raspberry Pi 上的 PAA3905 打造光學流感測器系統,實現無人機位置保持
對於室內自主懸停,GPS 毫無用處,氣壓計也無法區分實際海拔變化與氣壓波動。光學流 — 測量無人機下方地面的視在運動 — 提供了缺失的拼圖:相對於下方表面的穩定位置保持。
PAA3905 是 Skyworks(最初是 Broadcom)生產的高效能光學流感測器。它可捕捉 35x35 灰階影像幀,高達 120 fps,提供光學流計算所需的原始像素位移資料。與它 predecessors 的 PMW3901 相比,PAA3905 提供了更好的低光性能和更靈活的介面選項。
尋找 PAA3905 的開發板設計很有挑戰性 — 資料手冊和建議電路圖並未公開。我們不得不從現有的實作中學習:
開發板在 KiCAD 中設計並送交製造。到 2025 年 12 月,板子就緒,可以開始驅動程式開發。
Raspberry Pi 為 PAA3905 開發提供了理想的主機。使用 SPI1 搭配 CS1,我們達到了約 9 Hz 的幀捕捉速率,解析度為 35x35 灰階(0-255)。即使在最暗的頂燈照明下,感測器也能清晰捕捉表面紋理細節 — 足夠基本的位移偵測演算法使用。
資料流程如下:
PAA3905 (SPI) -> 35x35 影格 -> Node.js 處理 -> MAVLink 遙測
一段影片展示瞭 PAA3905 的影格輸出與指向同一表面的網路攝影機畫面的對比。當照明從全 brightness 降低到完全黑暗時,PAA3905 繼續產生可用的影像 — 這在受控的室內環境中相比 RGB 攝影機是顯著優勢。
原本為 PMW3901 設計的 PX4-Flow 演算法被修改以配合 PAA3905 影格資料運作。實作比較連續的 35x35 影格以計算像素位移,然後轉換為速度估算。
測試設置將 PAA3905 模組和 Logitech C920 攝影機都對準同一個紙箱。移動紙箱同時保持攝影機靜止,模擬攝影機在飛行中的運動 — 這是一種在不需要實際飛行平台的情況下驗證演算法的實用方法。
雖然 PAA3905 對於基本光學流運作良好,但 Raspberry Pi Camera 可以提供更高分辨率的表面資料,用於更複雜的電腦視覺方法。計劃涉及修改 rpicam-hello 以連續捕捉 640x480x8 位元影格串流,並直接在 C++ 中運行 PX4-Flow 演算法。
資料流程將擴展為:
PiCamera -> 影格 -> 光學流 (C++) -> MSP 協議 -> Betaflight
我們也對探索 ROS2 SensorImage 發佈器以實現更模組化的架構感興趣,這將允許在不重新編譯攝影機捕捉應用程式的情況下交換不同的視覺模型。
對於 TFC1 飛行控制器,光學流整合需要仔細規劃 UART。RP2350B 有限的 UART 資源意味著需要選擇:
PMW3901 的資料手冊顯示,SPI 是嚴肅光學流應用所首選的 — UART 對於較高飛行速度所需的幀速率來說實在太慢了。35x35 影格緩衝區透過 UART 會造成瓶頸,限制有用的海拔範圍。
對於我們近期的室內懸停應用,基於 UART 的光學流被證明是足夠的。系統在充足照明條件下於平滑紋理表面上展示了穩定的位置保持。