無人飛行船自動導航系統

實踐大學學士畢業論文:Microchip 嵌入式自動駕駛系統

無人飛行船自動導航系統

論文簡介

這是我在實踐大學資訊科技與通訊學系學士畢業論文專案(民國100年,2011年),與侯圳嶺、侯劭東、劉文茜、葉曉霈、鄧靜容同學共同完成,指導教授為吳啟偉老師。

研究主題: 開發一套完整的無人飛行船自動導航控制系統

核心突破:

技術棧: Microchip PIC24FJ128GB106 + GPS + GPRS + Compass (I2C) + Java Server + MySQL + Google Maps + Flash


🎯 研究背景與動機

問題現況

傳統飛行船的限制:

  1. 地面遙控範圍過小
    • 遙控器訊號有效範圍有限(約數百公尺)
    • 超出範圍後失去控制
    • 無法進行長距離飛行任務
  2. 完全依賴人工操控
    • 操作員技術要求高
    • 人為失誤容易導致失控
    • 無法自主應對突發狀況
  3. 失控後無法自救
    • 訊號中斷後飛船失聯
    • 無法自動返航或降落
    • 可能造成飛安問題或財產損失

研究動機

開發一套自主飛行控制系統,解決上述問題,並擴展飛行船的應用範圍:

軍事應用:

商業/民間應用:


🎓 研究目的

1. 飛行船自主飛行

目標: 輸入目標 GPS 座標後,飛行船能自動航向目的地

實現方式:


2. 手動/自動模式切換

目標: 飛行船具備自動與手動兩種飛行模式,可即時切換

應用場景:

切換機制:


3. 突破飛行範圍限制

目標: 不再受限於遙控器訊號範圍,可在任意地點航行

技術實現:

實際效益:


4. 即時飛行資料傳達地面站

目標: 將飛行資料即時回傳,如同「飛航黑盒子」

回傳資料:

技術實現:


5. 地面即時模擬飛行動態

目標: 當飛行船超出可視範圍時,地面站仍能清楚看到飛行狀態

技術實現:

實際效益:


🚁 飛行船系統架構

飛船主體

供應商: 天興化工 類型: 氦氣填充式飛船

動力系統:

  1. 前進推力
    • 載台左右兩側的直流馬達
    • 轉動葉片產生推力
  2. 上升/下降
    • 固定葉片的軸承上下轉動
    • 控制俯仰角
    • 由升降伺服馬達控制
  3. 左右轉向
    • 船體歷經三個版本演進(A型、B型、C型)
    • 轉向機構不同
    • 主推力馬達也持續優化

飛船船體版本演進

專案期間共開發三種船體版本,持續優化轉向與推力系統:

A型船體:伺服馬達轉向

轉向機構:

優點:

缺點與改進需求:

測試結果: 多次試飛後決定更換轉向機構


B型船體:碳刷馬達正反轉

轉向機構:

優點:

缺點:


C型船體:主推力升級 + 四組襟翼(最終版本)

主要改良重點:

  1. 主推力系統升級
    • 更換更強力的主推進馬達
    • 加強電力輸出
    • 螺旋槳從三翼式改為四翼式
    • 翼長增大,風力吹送更強
  2. 襟翼系統(4組伺服馬達)
    • 左右水平襟翼:輔助船體上升與下降
    • 上下垂直襟翼:輔助船體左右轉向
    • 與後方轉向伺服切換器共用一組 PWM 訊號

優點:

缺點:

意外發現:


💻 自動控制系統架構

核心控制板

主板: Microchip PIC24FJ128GB106 (APP-026-3X)

選擇理由:


週邊模組整合

系統採用「主板 + 自製子板」架構:

整合的週邊模組:


1. GPS 模組

專案使用兩種 GPS 模組(演進過程):

GPS 模組 1:Leadtek LR9548S

規格項目 規格值
型號 LR9548S
連接介面 RS-232
外觀大小 24 × 20 × 2.9 mm
重量 2.5 g
輸入電壓範圍 3.2 ~ 5 V
資料更新頻率 1 秒
GPS 精確度 < 15 m(95% typical)
DGPS 精確度 < 3~5 m(95% typical)
Reacquisition < 2 seconds
同時追蹤衛星數 12

狀態: 腳位損壞,改用 GPS15XL-W


GPS 模組 2:GARMIN GPS15XL-W(最終使用)

規格項目 規格值
型號 GPS15XL-W
連接介面 RS-232
外觀大小 35.56 × 45.85 × 8.31 mm
重量 14.1 g
輸入電壓範圍 3.3 ~ 5 V
資料更新頻率 1 秒
GPS 精確度 < 15 m(95% typical)
DGPS 精確度 < 3~5 m(95% typical)
Reacquisition < 2 seconds
同時追蹤衛星數 12

通訊協定: NMEA 0183 資料格式: GPGGA、GPRMC、GPGSA、GPGSV 功能: 即時定位(經緯度、高度、速度、方向)

GPS 程式開發過程(6 個版本迭代):

版本 開發研析 資料項目 備註
Ver 1 抓取 GPGGA 格式資料,分析陣列內容,依資料項目放入各別陣列 - 時間
- 緯度(GGA 格式)
- 經度(GGA 格式)
- 高度
原本是抓取 RMC 格式資料,但因定位時間過久,所以改成 GGA 格式嘗試
Ver 2 陣列資料轉為數字型態。時間為 UTC 型式,於是把「時」的部分加 8,變成台灣時間 同上 1. 資料轉為數字型態目的在便於計算
2. 發現定位時間過久是因為實驗室走廊位置遮蔽較多,且天候因素也有影響
Ver 3 把各資料項目放入 GPSgetData 函數 - 時間
- 緯度(GGA 格式)
- 經度(GGA 格式)
- 高度
- 北半球或南半球
- 東半球或西半球
資料統一放到陣列內,便於飛控程式抓取
Ver 4 增加 GPRMC、GPGSA、GPGSV 格式 - 時間
- 緯度(GGA 及 RMC 格式)
- 經度(GGA 及 RMC 格式)
- 高度
- 北半球或南半球
- 東半球或西半球
- 定位狀態 getStatus()
- 對地速度 Speed()
- 對地方向 Direction()
- 磁極變量 Mag()
比較 GGA 及 RMC 格式的經緯度資料,發現兩者數值相差約 2~3 度
Ver 5 增加 GPVTG 格式。GPRMV 格式的速度、方向、日期由 Array() 函數擷取。由 Resolve(char str[]) 函數分析 - 時間
- 緯度(GGA 及 RMC 格式)
- 經度(GGA 及 RMC 格式)
- 高度
- 北半球或南半球
- 東半球或西半球
- 定位狀態 getStatus()
- 速度、方向、日期 Array()
除了 VTG 格式抓取的資料仍為字元外,其餘資料皆為數字型態
Ver 6 刪掉 GPVTG 格式,全部資料轉為數字型態 同上 因為 Leadtek 的 LR9548S 模組損壞,所以改為 GARMIN 的 GPS15XL-W。後者的出廠預設 NMEA 格式沒有 GPVTG,於是不擷取該格式資料

除錯機制:


2. GPRS 模組

型號:Create GPRS4SIM100

規格項目 規格值
重量 11 公克
外觀大小 53 × 33 × 3.0 mm
連接介面 RS-232
輸入電壓範圍 3.2 ~ 4.5 V
工作電流 < 500 mA
待機電流 < 3 mA
工作溫度 -30°C ~ +80°C
儲存溫度 -40°C ~ +85°C

通訊協定: AT 指令 功能: 無線數據傳輸(突破遙控器距離限制) 資料傳送頻率: 約 3 秒/筆


3. Compass 模組(電子羅盤)

型號:HONEYWELL HMC6343

功能:

通訊: I²C 精度: ±1 度(航向角度)


4. PWM 控制

功能:

控制對象:


5. 其他感測器

溫度感測器:

氣壓計:


🧠 自動飛行演算法

核心程式架構

開發流程(四大階段):

  1. 第一階段:公用程式開發
    • 定義主板各 I/O、週邊連接 PIN 腳
    • 開發 LCD、LED、KEY 按鍵等基本功能
    • 建立開發與除錯基礎
  2. 第二階段:模組程式開發
    • 利用公用程式對各週邊模組進行功能測試
    • 將功能模組化,便於副程式運用
    • 模組:PWM、GPS、GPRS、Compass
  3. 第三階段:副程式開發
    • 將系統需解決的問題進行切割
    • 依先後順序歸類統整
    • 分別撰寫副程式提供主程式所需功能
  4. 第四階段:整合測試
    • 整合各階段程式
    • 進行地面測試及飛行測試
    • 依測試結果檢討並修改程式

主程式版本演進表

從 2010 年 7 月到 9 月,主程式經歷 11 個版本迭代:

版本 更新項目 新增需求
MainPT_Ver0712 InitAll、llStop、Show、Show7kAt、ShowAt、ShowERROR、ShowDelay、ShowSP、CleanLCD、LinsFunnyLCDL2R、LinsFunnyLCDR2L LED 燈控制、按鍵控制(增加程式開發的便利性)
MainPT_Ver0713 ShowNum、LEDCtrl、LEDON、LEDOFF、LEDChkFlag、IsKey、IsClick 開啟、關閉 LCD、KEY、LED 的功能(有時不需要使用)
MainPT_Ver0714 ShowEN、ShowDIS、LEDEN、LEDDIS、KeyEN、KeyDIS LCD 印出不需宣告的字串、判別何按鍵被按下、等待任意或指定按鍵
MainPT_Ver0716 ShowLn、ShowDouble、WhichKey、WaitFor 無正負號 CHAR 轉換
MainPT_Ver0731 ShowUnCh -
MainPT_Ver0801 加入 PWM 模組程式 開始整合伺服馬達控制
MainPT_Ver0816 加入 GPS 模組程式 整合 GPS 定位功能
MainPT_Ver0820 加入 CMPS 模組程式 整合電子羅盤(航向感測)
MainPT_Ver0822 加入 GPRS 模組程式 整合無線通訊功能
MainPT_Ver0921 整合所有副程式 完整系統整合

開發時程:2.5 個月(2010/07/12 - 2010/09/21)


FLYDATA 副程式版本演進表

FLYDATA 是核心飛行控制副程式,負責計算飛行路徑與馬達控制:

版本 功能 新增需求/問題
MainPT_Ver0720 基礎距離與角度計算
- GetVD:算目前所在緯度之一度的長度
- GetXD:算目標與飛船間的距離(經緯)
- GetDegree:算目標與飛船間的角度
- GetHD:算目標與飛船間的距離(高度差)
- GetRD:算目標與飛船間的距離(實際距離)
⚠️ 算出距離後,尚不知道要做何動作
⚠️ 不知道要輸出何種訊號控制馬達
⚠️ 其他副程式也無法得知此計算結果
MainPT_Ver0731 飛行資料陣列與動作判斷
- 新增飛行資料陣列儲存飛行中計算、接受、判斷的資料
- DataRec:更新資料-接收
- DataMath:資料計算
- FlyDataLoad:提供其他程式載入本程式之資料
- FlyDataSave:提供其他程式輸入更新資料
- GetNDegree:算目標與飛船間的角度
- GotoLorRD:飛船要左或右多少度
- GotoUorDD:飛船要升或降多少度
- GetPitchDegree:目標與船的仰角
- 原函式 GetVD 更名為 GetLonUnit
- 原函式 GetXD 更名為 Get2DM
- 原函式 GetHD 更名為 GetHeightDoX
- 原函式 GetRD 更名為 Get3DM
⚠️ 將 LOAD 與 SAVE 函式完成後,需要讓其他程式試著存取,以確定函式正確運作
⚠️ 由於此時也完成了 CMPS 的模組程式,故可以進行目標判斷程式的測試
⚠️ 判斷向左或向右的動作,但仍未連接 PWM 飛船馬達,故尚未完成 PWM 數值指令表的設定
MainPT_Ver0822 飛行資料陣列擴充
- 因測試整合其他程式,飛行資料陣列大小進行調整
- 由 10×10 更改為 16×16
⚠️ 整合中發現程式會相互干擾
⚠️ communication 與 pwm 模組的 init 內有相衝突的設定
⚠️ 以致於無法同時初始化成功
MainPT_Ver0921 完整整合(最終版本)
- 加入 PWM 數值輸出參數設定
- 完全整合所有模組與副程式
⚠️ 發生 14 秒問題
⚠️ 此問題記錄:主要是 gprs 的 Rx 沒反應所以 delay 到時間

核心架構(最終版本):

FLYDATA 副程式
├── DataRec(資料接收)
│   ├── GPS 資料:經緯度、高度
│   ├── Compass 資料:heading、pitching、rolling
│   └── 其他感測器:溫度等
│
├── DataMath(資料計算與路徑規劃)
│   ├── 計算目標點所在方位
│   ├── 結合 Compass 資料計算航向差異
│   ├── 決定飛船應該升降幾度
│   └── 決定左右轉動多少度
│
└── FlyDataSysUpt(系統更新與馬達控制)
    ├── 判斷系統是否過熱
    ├── 判斷飛行船模式(自動/手動)
    ├── 依照 DataMath 的判斷決定實際推力輸出
    └── 決定馬達動作角度

程式階層架構(五層式架構):

第一層:自動飛行控制系統(頂層)
    │
    ↓
第二層:系統主程式
    ├── PIC24FJ128GB106 主板提供的函式
    └── 本系統定義的副程式
    │
    ↓
第三層:副程式
    ├── INIT(初始化)
    ├── FLYDATA(飛行資料處理)
    ├── TUNER(參數調整)
    ├── WHEREIS(位置判斷)
    ├── FYBTCTRLOR(馬達輸出控制)
    └── COMMUNICATION(地面通訊)
    │
    ↓
第四層:模組程式(週邊模組)
    ├── PWM 控制
    ├── GPS 資料解析
    ├── GPRS 通訊
    └── Compass 讀取
    │
    ↓
第五層:公用程式
    ├── LCD 顯示
    ├── LED 燈控制
    └── KEY 按鍵偵測

自動飛行流程

1. 資料讀取

2. 位置判斷 (WHEREIS)

3. 動作決策 (FLYDATA)

4. 馬達控制 (FYBTCTRLOR)

5. 補償機制


手動/自動模式切換

模式切換機制:

安全機制:

  1. 自動模式優先權
    • 當遙控器訊號中斷,自動切換至自動模式
    • 執行預設的安全降落程序
  2. 手動介入權限
    • 特殊情況下,手動模式可強制接管
    • 例如:緊急閃避障礙物

🌐 地面監控系統

地面 Server 架構

技術棧: Java + MySQL + TCP Socket


監控站 Server 版本演進

經歷三個主要版本的開發:

Ver 1:VB 版本(初期測試)

開發工具: Visual Basic

功能:

顯示項目:

測試方式:

限制:


Ver 2:Java 初版(GPRS 整合)

開發工具: Java

功能:

新增顯示項目:

改進:


Ver 3:Java 完成版(資料庫 + 控制功能)

開發工具: Java + MySQL

完整功能:

  1. 接收飛行資料
    • 飛行船透過 GPRS 傳送資料
    • Server 透過 TCP Socket 接收
    • 解析資料後存入 MySQL 資料庫
  2. 下達控制指令
    • 地面站可透過 Server 發送指令
    • Server 透過 GPRS 傳送給飛行船
    • 可改變目標點
    • 可改變行列的資料
    • 可操作飛船馬達升降角度
    • 可控制馬達出力百分比
  3. 資料庫管理
    • 記錄完整的飛行歷史
    • 提供查詢與分析功能
    • 記錄測試場次、位置、風力、天氣、飛船尺寸
  4. 介面設計
    • 文字框、按鈕、標籤組成
    • 資料分類顯示(過多時可用按鈕切換)
    • 顯示連結時間和接收資料時間
    • 右上角顯示目前狀態

測試資訊記錄(開啟時必須輸入):


Google Maps 整合

使用技術:

顯示內容:

  1. 飛行船即時位置
    • 根據 GPS 資料標示在地圖上
    • 動態更新位置(例如每秒更新)
  2. 飛行軌跡
    • 顯示歷史飛行路徑
    • 用不同顏色標示不同階段
  3. 目標點標示
    • 顯示預設的導航點
    • 顯示當前目標點

Flash 動態展示系統

開發工具: Flash CS4 + ActionScript 3.0 + PHP


Flash 動畫展示系統版本演進

設計目的:

經歷 6 個版本的迭代改進:


版本 1:簡易資料顯示版

設計重點: 測試連結 PHP 載入資料庫資料的功能

顯示項目:

特色: 以資料為主,供控制模組測試用


版本 2:三視角動畫版

改進重點: 達到更佳的展示效果

新增功能:

設計特色:

發現問題:


版本 3:增加彩虹按鈕說明

改進重點: 增加說明文字,幫助使用者了解圖示

新增功能:

發現問題:


版本 4:場景分離版

改進重點: 解決畫面擁擠問題

新增功能:

發現問題:

問題根源:


版本 5:移除地板物件

改進重點: 解決速度與穩定性問題

修改:

發現問題:


版本 6:最終版本(簡約協調版)

改進重點: 提高整體畫面協調

修改:

最終顯示功能:

  1. 3D 飛行船模型
    • 即時顯示飛行船姿態
    • 航向 (Heading)
    • 俯仰角 (Pitching)
    • 翻滾角 (Rolling)
  2. 三種視角切換
    • 中景(Rear View):飛船後方視角
    • 近景(Side View):飛船側方視角
    • 遠景(Bird View):飛船上方視角
  3. 動畫場景
    • 模擬真實環境(天空、雲朵)
    • 飛行船在場景中移動
    • 視覺化飛行狀態
  4. 儀表板介面
    • 顯示所有飛行參數
    • 速度、高度、航向
    • 溫度、電池電量
    • 當前模式(手動/自動)

技術亮點:


🔬 系統整合測試

地面測試(2010年12月)

測試時程: 2010年12月10日至12月26日

測試場次: 共進行 17 場次地面測試

室內測試(第1場次):

室外測試(精選場次):

第1場次(2010/12/12):

第2場次(2010/12/15):

第3場次(2010/12/15):

第5-7場次(2010/12/17):

第13場次(2010/12/24):

第17場次(2010/12/26):


室外地面測試總結

測試項目 測試結果 達成
GPS 定位精準度 誤差 < 15 公尺
資料傳送速度 約 3 秒/筆
目標距離判斷 實際距離差距 < 10 公尺
抵達目標判斷 約 15-20 公尺範圍內
飛行方向判斷 左右轉及角度判斷正確
目標點範圍精準度 平面 30M、直線 40M
馬達動作控制 轉動角度與推力正常
GPRS 控制反應速度 約 4-5 秒
遙控器切換反應速度 < 4 秒

飛行測試(2011年1月)

測試準備工作:

  1. 氦氣填充(第一天測試)
  2. 飛行船組裝:綁上襟翼與船艙
  3. 行前確認:使用檢查清單
    • 電源電力檢查
    • 監控站開啟確認
    • GPS 定位確認
    • GPRS 連線確認

第一次飛行測試(2011/01/08)

重點場次: 第 29 場次

飛行數據:

飛行軌跡記錄:

詳細記錄了飛行資料點 243-482 的完整飛行軌跡:

Google Maps 路徑驗證:

測試發現:

改進措施:


第二次飛行測試(2011/01/09)

重點場次: 第 42、43 場次

改進成果:


測試驗證總結

地面測試成果(17場次):

飛行測試成果:


🏆 研究成果

技術突破

  1. 自主飛行控制
    • 成功開發完整的自動導航系統
    • 飛行船可根據 GPS 座標自動飛行
    • 不再依賴人工遙控
  2. 手動/自動模式
    • 實現即時切換
    • 提供安全機制
    • 解決人工操控失控問題
  3. 無限制飛行範圍
    • 透過 GPRS 突破遙控距離限制
    • 可執行長距離飛行任務
  4. 完整監控系統
    • Java Server + MySQL 資料管理
    • Google Maps 地圖顯示
    • Flash 3D 動態模擬
    • 提供完整的飛行記錄

系統整合能力

硬體整合:

軟體整合:

系統整合:


專案規模

開發時程: 約 8-10 個月

開發階段:

  1. 需求分析與系統設計
  2. 硬體電路設計與製作
  3. 嵌入式程式開發
  4. 週邊模組整合
  5. 地面站系統開發
  6. 地面整合測試
  7. 飛行測試與驗證
  8. 系統優化與調整

團隊協作:


💡 關鍵技術挑戰

1. GPS 訊號處理

挑戰:

解決方案:


2. GPRS 通訊穩定性

挑戰:

解決方案:


3. 姿態控制精度

挑戰:

解決方案:


4. 系統整合複雜度

挑戰:

解決方案:


📚 學習收穫

技術層面

嵌入式系統開發:

週邊模組整合:

地面站開發:

系統整合:


專案管理

團隊協作:

時程管理:

測試驗證:


經驗體悟

這個專案讓我深刻體會到:

系統整合的挑戰:

實際應用的考量:

除錯的困難:

這些經驗對我後續在工業自動化領域的開發非常有幫助,讓我更注重系統的穩定性、可靠性與容錯機制。


🔗 相關專案

這個畢業論文專案後來延伸出另一個專案:

無人飛行船地面站即時監控系統

在畢業後,我又開發了一個更精簡的飛行船監控 DEMO,用來監控:

使用 Flash/ActionScript 開發地面站監控介面,透過 GPRS 即時接收飛行資料。


論文資訊


Happy Coding! 🚁