[PX4/QGC 筆記] 深入解析 VTOL 航點規劃:為何 QGC 會自動產生一堆「隱藏」指令?
作為一名無人機軟韌體開發者,我們經常需要處理 MAVLink 協議與地面站 (GCS) 的互動。最近在開發自有的 Android GCS (GeekNexus) 並進行 PX4 VTOL 機型的航點規劃測試時,我注意到一個有趣的現象:「我在地圖上明明只點了一個起飛點和一個降落點,為什麼 Log 裡卻噴出了一大串我不認識的指令?」
這篇文章將透過實際的 Log 分析,來拆解 QGroundControl (QGC) 對於 VTOL 機型的任務規劃邏輯,特別是自動產生的「降落航線 (Landing Pattern)」。
1. 實際 Log 觀察
這是當我在 QGC 規劃好航點並上傳後,App 透過 MISSION_REQUEST_LIST 下載回來的實際結構:
[00] seq=0, cmd=VTOL_TAKEOFF, lat=24.570…, alt=50.00
[01] seq=1, cmd=WAYPOINT, …
…
[05] seq=5, cmd=WAYPOINT, …
[06] seq=6, cmd=DO_LAND_START, lat=0.00, lon=0.00
[07] seq=7, cmd=DO_SET_CAM_TRIGG_DIST, p1=0.00
[08] seq=8, cmd=IMAGE_STOP_CAPTURE
[09] seq=9, cmd=VIDEO_STOP_CAPTURE
[10] seq=10, cmd=LOITER_TO_ALT, lat=24.564…, alt=30.00
[11] seq=11, cmd=VTOL_LAND, lat=24.567…, alt=0.00
可以看到,seq=6 到 seq=11 全部都是自動產生的。這並非 Bug,而是 PX4 針對固定翼與 VTOL 飛行特性的標準程序。
2. 起飛邏輯:Launch vs. Take-off
在 QGC 介面上,起飛通常涉及兩個概念:
- Launch (Home): 這是飛機解鎖 (Arm) 的當下位置。
- Take-off (VTOL_TAKEOFF): 這是飛機要「爬升」到的目標。
當你按下「Takeoff」按鈕,QGC 會自動在飛機前方或指定位置生成一個 VTOL_TAKEOFF 指令。對 VTOL 而言,這代表**「垂直爬升至指定高度 (例如 50m)」**。若該點有水平位移,飛機通常會在多旋翼模式下邊爬升邊移動,到達此高度後,才會轉入下一個航點(通常伴隨著由旋停轉平飛的 Transition)。
3. 降落邏輯:自動生成的 Landing Pattern
最令人困惑的通常是降落段。為什麼點一個 Land 會生出 6 個指令?讓我們逐一拆解:
A. 邏輯標記:DO_LAND_START (Seq 6) 這是一個「邏輯錨點」,其座標通常為 0。它不是讓飛機飛去哪裡,而是告訴飛控:「從這個步驟開始,進入降落程序」。
- 重要性: 如果飛機在任務中途觸發 RTL (返航),且位置已經過了這個點,聰明的飛控邏輯(視
RTL_TYPE設定)可能會選擇繼續執行降落程序,而不是掉頭飛回起飛點,這對於電力吃緊的 VTOL 至關重要。
B. 設備安全檢查 (Seq 7-9)
DO_SET_CAM_TRIGG_DIST (0)IMAGE_STOP_CAPTUREVIDEO_STOP_CAPTURE這一連串指令是為了「收拾善後」。在降落前強制停止相機觸發、結束錄影。這不僅保護鏡頭(若有伸縮機構),更重要的是確保影片檔案正確寫入(Finalize),避免落地斷電導致檔案損毀。
C. 進場過渡:LOITER_TO_ALT (Seq 10) 這是降落前的關鍵點。
- 行為: 飛機(通常以定翼模式)飛到此座標,並開始盤旋下降。
- 目的: 讓飛機穩定地降低高度至(例如 Log 中的 30m)。對於 VTOL,這通常是準備進行 Back Transition (由平飛轉旋停) 的位置。它確保飛機以穩定的姿態和安全的高度進入最後階段,而不是從巡航高度直接「跳」下來。
D. 最終著陸:VTOL_LAND (Seq 11) 這才是我們在 UI 上點擊的那個點。飛機在此處切換為多旋翼模式 (Multicopter),垂直下降直到觸地並 Disarm。
4. 給開發者的建議 (Takeaway)
如果你正在開發自己的地面站 (GCS) 或進行自動化航點規劃,必須注意:
- 不要只傳送一個 LAND 指令: 針對 PX4 固定翼或 VTOL,若省略了
LOITER_TO_ALT這樣的進場程序,可能會導致飛機行為不可預期(例如嘗試在過高的位置切換模式,或進場角度過大)。 - UI 呈現: 在設計 UI 時,可以參考 QGC 的做法,將這些自動產生的指令群組化顯示,避免讓終端使用者感到困惑。
理解這些「隱藏」的邏輯,才能寫出更安全、更穩定的無人機控制軟體。