2025.08 - 2026.06 / 獨立完成
無人機交通管理系統
從多智能體強化學習訓練到 ONNX 推理服務與 3D 可視化,探索以安全空域約束指令管理無人機交通的工程化交付。
這個項目面向城市低空場景中的無人機交通管理:使用多智能體強化學習計算安全空域約束,將模型導出為可獨立運行的推理服務,並分別提供訓練資料回放和地圖上的運行時可視化。四個部分共用無人機位置、速度、目標點與安全空間等概念,但面向的資料來源和使用場景不同,因此分為離線與在線兩條鏈路實現。
離線:訓練與軌跡可視化
離線鏈路關注策略如何被訓練與檢查。訓練過程會定期以當前模型執行一個評估 episode,記錄逐步狀態並輸出軌跡 JSON;checkpoint 則用於導出 ONNX。這讓回放資料能對應到明確的模型版本與場景條件。
多機仿真與安全約束
訓練環境包含多架無人機、建築物與目標點。每架無人機根據自身速度、目標方向與尺寸,以及鄰近無人機和建築物的空間關係作出三個軸向的離散位移決策;MAPPO 使用共享 actor 產生動作,並在訓練階段以全局資訊估計價值。
策略提出候選位移後,系統會計算對應的候選安全空間。若該空間與其他無人機或建築物相交,safety shield 會沿重疊較小的軸向收縮空間,再將原始位移裁切到可行範圍。每一步都記錄實際位移與候選位移的比例,讓獎勵同時考慮朝目標前進、到達目標,以及動作被安全約束修正的程度。
將安全性完全交給獎勵函數,實現較簡單,但訓練早期容易出現大量碰撞,也無法保證每次輸出都可執行;保留獨立的 shield 則增加了策略輸出與實際動作之間的差異,但能確保最終安全空間至少包含機體 bbox,且當前位置與建議航點都落在其中。
訓練結果的 3D 可視化
訓練指標只能反映整體趨勢,難以說明某次避讓為何成功或失敗。因此我使用 Three.js 製作 Web 可視化工具,將訓練過程與結果放入可交互的 3D 場景中:可同時查看無人機、目標點、人員、建築物和 safety shield 產生的安全空間。
可視化讓策略行為不再只是一組獎勵數值。例如,當安全空間反覆被壓縮、無人機在建築物旁停滯,或多機接近時出現不合理的繞行,都能回到具體場景中判斷是觀測設計、獎勵權重、動作範圍還是 shield 約束造成,再針對性調整訓練參數與算法設計。工具與訓練程序分離後,也可直接載入保存的資料反覆檢查同一段行為,而不需要重新訓練。
在線:推理與地圖可視化
在線鏈路將導出的 actor 接入持續更新的無人機資料。無人機先經 gRPC ↔ MQTT 橋接服務接入消息通道;資料處理服務接收遙測、保存各架無人機的最新狀態並觸發安全空間計算;推理服務返回安全空域約束指令後,資料處理服務再向無人機下發。另一個只讀的 HTTP 接口把狀態提供給地圖可視化使用,避免查詢操作干擾推理工作。
下圖概括在線服務的部署拓撲。
模型推理與指令下發
訓練使用 PyTorch Lightning,部署時只將 deterministic actor 導出為 ONNX。服務端以 ONNX Runtime 載入模型,並將 intra-op 和 inter-op thread 都限制為一個,避免推理 worker 與其他服務爭搶 CPU 資源。這讓部署端不需要攜帶完整的 PyTorch 訓練棧,也將模型接口固定為「觀測輸入、離散動作輸出」。
代價是訓練與部署之間多了一條需要持續驗證的邊界:觀測欄位的順序、離散動作到位移的映射、機體尺寸、速度上限與座標縮放都必須保持一致。推理服務會將經緯度、高度和 NED 速度轉為模型使用的局部 XYZ 座標並按比例縮放,完成推理後再轉回地理座標,輸出包含安全空間 bbox 與建議航點的安全空域約束指令。
在線資料以 MQTT 傳遞,Redis 保存最新狀態而非長期軌跡。計算 worker 接到觸發後讀取所有無人機狀態,計算指定無人機的安全空間;安全空域約束指令經資料處理服務保存並下發。指令帶有產生時間與五秒有效期,讓下游可以辨識過期結果。這種事件驅動方式避免讓地圖查詢同步阻塞模型推理,但也需要處理遙測資料過期、請求重複和不同無人機狀態不同步等時序問題。
下圖呈現一次計算請求從遙測上報到安全空域約束指令下發的順序。
訓練和在線服務的 safety shield 有意採用不同的衝突處理方式。訓練環境可對相交的兩個候選空間做雙邊收縮;在線服務每次只處理一架無人機的請求,因此將其他已鎖定的安全空間視為固定約束,只收縮當前請求者的候選空間。空間鎖能避免後到的請求覆蓋已分配區域,但也需要設計過期與重算策略,這是批量仿真和事件驅動服務之間的編排差異。
在地圖上觀察當前狀態
地圖可視化使用 MapLibre 顯示底圖與視角,將 OSM 建築資料轉為 GeoJSON 後以 fill-extrusion 生成白模:優先使用建築高度,沒有高度時根據樓層數估算,再回退至預設高度。Three.js 場景疊加在地圖上,每秒從只讀 HTTP 接口讀取無人機資料,展示無人機模型、目標點、目標連線與半透明安全空間。
這一部分的關鍵在於座標轉換。推理服務使用局部 XYZ,外部資料使用 WGS-84 緯度、經度與海拔;地圖以固定原點將經緯度換算為相對米制 x/z 偏移,以海拔作 y 軸,才讓無人機模型、安全空間與地圖建築出現在一致的視覺座標中。
OSM 建築物目前用於運行時空間理解與結果檢查,尚未作為推理服務的碰撞 bbox 輸入。將真實地圖建築轉換為與訓練環境一致的幾何約束,並處理資料精度與更新,會是後續需要完成的資料接入工作;因此本文不將白模展示描述為已完成的真實建築避障。
回顧
這個項目將訓練策略、模型部署和空間可視化分開實現,再以明確的數據結構將它們連接起來。離線鏈路用回放檢查策略行為,在線鏈路則將模型輸出轉為帶有有效期和空間約束的安全空域約束指令,並在地圖上呈現當前狀態。
後續的優先方向是將真實建築幾何接入推理約束、建立遙測過期與請求去重機制,以及以固定場景和可復現數據持續比較不同策略的安全性與計算成本。