Skip to content

m72900024/LOS-Flight-Simulator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

143 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HTML5 JavaScript Three.js License

LOS 飛行訓練模擬器 Pro

開源 Web-based 四軸飛行器目視(Line-of-Sight)飛行訓練模擬器

模擬真實 5 吋 FPV 四軸飛行器的飛行物理,採用 Betaflight 風格的 Rates 系統, 在瀏覽器中練習從起飛懸停到 8 字飛行的完整技能。純前端、零安裝、即開即飛。

在線試玩 Live Demo


快速開始

  1. 開啟 Live Demo
  2. 接搖桿(Xbox / PS / RadioMaster / DJI 都可,瀏覽器自動偵測);或選擇鍵盤、觸控
  3. 第一次進入會自動套用「新手難度 + 置中型搖桿 + ALT_HOLD 定高模式」,最容易上手
  4. 🚀 一鍵自動配置 → 動每根桿讓系統自動偵測軸映射 → 進入關卡
  5. 按手把上的 A / X 鍵(或 Space)解鎖馬達 → 推搖桿起飛

置中型搖桿(Xbox / PS)一般用法:油門桿在中間 = 50% 油門 = 自動懸停(DJI 風格 ALT_HOLD);推上爬升、拉下降。

不置中型 RC 飛手桿(DJI RC3 / RadioMaster Pocket):在設定畫面選「🛩️ 不置中型」,預設改 ANGLE,桿位直接對應油門 0~100%。


功能特色

真實物理模擬

  • 模擬 600g 5 吋 FPV 四軸飛行器,最大推力 28N
  • Betaflight 風格 Rates 系統:基礎 Rate、SuperRate、Expo 曲線可依難度調整
  • 二次方空氣阻力(drag coefficient 0.015)+ 角速度阻尼(angular drag 15)
  • 真實地面碰撞:高速撞地彈跳(70% 能量損耗)、紅閃 + 鏡頭抖動回饋
  • 50m 軟頂限制,防止飛出可視範圍

三檔飛行難度(即時切換)

難度 rates superRate 最大傾角 油門曲線 對應角速度
🌱 新手(預設) 0.30 0.0 20° 0.6(很溫和) ~180°/s
⚡ 一般 0.80 0.3 40° 0.4 ~480°/s
🔥 專家 1.20 0.7 55° 0.3(線性) ~720°/s

設定面板 radio 即時切換,存於 localStorage 跨 session 記憶。

4 種飛行模式

模式 適合
1 Angle 自穩 鬆桿自動回平,初學者入門
2 Horizon 半自穩 中位自穩、滿桿手動,過渡用
3 Acro 手動 純角速度控制,FPV 訓練
4 Alt Hold 定高(置中桿預設 鬆桿懸停,DJI 風格最直覺

8 個循序漸進訓練關卡

從基礎起飛定高,到穿門、8 字飛行、L8 模擬考試。L8 為台灣 CAA 基本級術科考試模擬,含對應 CAA AC107-005A 規格的雙圓考場(圓心 ±6m,內 4m / 中 6m 虛線 / 外 8m)。

4 種解鎖方式(任選)

方式 操作 適合
🎮 手把 A / X 按鈕 按一下切換 最快,遊戲手把首選
🤘 內八手勢 左搖桿右下 + 右搖桿左下 hold 2 秒 FPV 真實作法
🤙 外八手勢 左搖桿左下 + 右搖桿右下 hold 2 秒 上鎖(disarm)
⌨️ 鍵盤 Space 隨時切換 鍵盤模式

設定畫面 / 遊戲畫面 ARMED 區會即時顯示「🤘 ARMING XX%」hold 進度。

智慧 H 停機坪

無人機降落到 H 點 1m 內 + 高度 < 1.5m 時,H 字會動態亮螢光綠,協助飛手判斷降落精準度(致謝 @tamago797)。

場景配色面板(個人化)

頁面左上角 🎨 配色面板(點開合)即時調整 + localStorage 持久化:

  • 草地:外圈 / 內圈各自 picker + 5 個 preset(森林預設 / 中綠 / 鮮 / 深 / 高爾夫)
  • 天空:高 / 中 / 地平線三色 picker + 6 個 preset(預設 / 晴朗白天 / 陰天 / 黃昏 / 夜晚 / 清晨)
  • 霧色:picker + 5 個 preset
  • 曝光對比:滑桿 0.4 ~ 1.5(預設 0.4 = 最深 / 最高對比)

精緻 3D 場景

  • Three.js 即時 3D 渲染,PCFSoft 陰影系統(4096×4096 shadow map)
  • 場景物件:25 棵隨機樹木、3 棟建築、圍欄、H 型降落場、風向袋、雙圓考場標線
  • 無人機模型:4 臂、前綠後紅 LED(前閃後常亮)+ halo 光暈 + 機腹白色下投光(LOS 飛遠時鎖位)
  • 第三人稱 LOS 視角:固定觀察點,攝影機平滑跟隨

雙搖桿類型支援

類型 油門邏輯 適用硬體
🎮 置中型 ALT_HOLD position mode(鬆桿回中=50%=PID 懸停,DJI 風)+ ACRO/ANGLE rate mode(鬆桿油門保持,FPV 風) Xbox / PS / 一般 USB 手把
🛩️ 不置中型 RC 全模式 position mode(桿位直接 = 油門 0~100%) DJI RC3 / RadioMaster Pocket / Boxer / TX16S

三種輸入模式

  • 鍵盤:即開即玩,A/D 偏航、W/S 油門、方向鍵姿態
  • 搖桿:Gamepad API,自動偵測軸 / 反轉 / 中點 / 端點校正
  • 觸控:手機雙虛擬搖桿 + ARM/MODE 按鈕

進度系統

  • 過關自動解鎖下一關
  • 最佳成績記錄到 localStorage(跨 session 持久化)
  • 即時進度條與完成時間顯示

操作方式

鍵盤控制

按鍵 功能 說明
W 油門升 按住增加油門
S 油門降 瞬間油門歸零
/ 俯仰 前進 / 後退傾斜
/ 橫滾 左右傾斜
A / D 偏航 左右轉向(Yaw,A=左 / D=右)
Shift 精準模式 按住時操控量 ×0.4(降低靈敏度)
Space Arm / Disarm 解鎖或鎖定馬達
1 ~ 4 飛行模式切換 Angle / Horizon / Acro / Alt Hold
R 重置 重置無人機位置與姿態
K 切換輸入 鍵盤 ↔ 搖桿模式切換
ESC 離開 遊戲中返回關卡選擇;關卡選擇中返回設定畫面

搖桿控制

支援標準 Gamepad API(Xbox / PS / RadioMaster / DJI 都可),自動偵測。

功能 行為依搖桿類型
油門 置中桿 + ALT_HOLD = position mode(鬆桿回中 = 50% PID 懸停) / 其他模式 = rate mode(鬆桿保持當前油門);不置中 RC 桿 = 全模式 position mode
偏航 左 / 右轉向(已修正 Three.js Y+ CCW 對應,左推 = 左轉)
俯仰 前 / 後傾斜
橫滾 左 / 右傾斜
解鎖 4 種方式(按鈕 0 / 內八手勢 / 外八手勢 / 鍵盤 Space)
模式 鍵盤 1~4 切換;或將任一搖桿 axis 綁到「模式」做 4 段切換

校正功能(設定畫面):

  • 🚀 一鍵自動配置:搖動左搖桿 3 秒,自動偵測油門 / 偏航軸;右搖桿同理
  • 所有軸支援反轉勾選
  • 死區(Deadzone):12%(微小雜訊自動過濾)
  • 中點校正:記錄搖桿中立位置作為零點
  • 端點校正:記錄 Min / Max 值,自動映射至 ±1

搖桿類型 + 難度設定會記憶在 localStorage,下次開頁面自動恢復。


飛行模式說明

Angle 模式(自穩)— 按 1

參數
最大傾角 55°
穩定方式 四元數 SLERP(因子 5.0 × dt)
偏航控制 角速度(最大速率 50%)
特性 鬆桿自動回正,搖桿映射目標角度

適合對象: 初學者入門。搖桿映射傾斜角度而非角速度,放手就回平。

Horizon 模式(半自穩)— 按 2

參數
半自穩公式 搖桿量³(三次方曲線)
中位 接近 Angle 模式(自穩)
滿桿 接近 Acro 模式(角速度控制)
角度修正 比例回饋 (0 - 角度) × 5.0

適合對象: 進階練習。中位有自穩保護,滿桿可做翻滾等動作。

Acro 模式(手動)— 按 3

參數
基礎速率 600° × rates(1.2)= 720°/s
SuperRate 0.7(滿桿額外加速)
速率公式 `baseRate ×
角速度阻尼 rotVel.lerp(target, 5 × dt)

適合對象: 高手挑戰。純角速度控制,無自動回正,必須手動修正所有姿態。

Alt Hold 模式(定高)— 按 4

參數
懸停推力 mass × gravity = 5.886N
油門死區 40% ~ 60%(中位)
中位行為 PD 控制器精確定高(kP=8, kD=5×mass),鎖定目標高度不飄移
高於 60% 爬升:hover + (input - 0.6) / 0.4 × thrustPower × 0.5
低於 40% 下降:hover × (1 - (0.4 - input) / 0.4 × 0.8)
姿態控制 同 Angle 模式

適合對象: 最簡單的模式。油門中位自動維持高度,專注練習方向控制。


訓練關卡

關卡 名稱 任務目標 過關條件
1 起飛定高 起飛並維持 2~3m 高度 在目標高度維持 3 秒(離開目標區計時器僅 ×0.5 速度倒扣,較寬容)
2 定點懸停 在綠色方框內懸停 方框內(±1.25m)穩定 3 秒
3 前後平移 飛到前方 10m 標記點再返回 依序觸及兩個航點(距離 < 1.8m)
4 左右平移 依序飛到左方與右方標記點 依序觸及兩個航點(距離 < 1.8m)
5 矩形航線 依序飛過 4 個航點完成矩形 依序觸及 4 個航點(距離 < 1.8m)
6 穿越拱門 穿越前方的大型環形門 通過拱門中心(距離 < 2m)
7 8 字飛行 繞兩根柱子畫 8 字形航線 依序通過 6 個檢查點(距離 < 2.5m)
8 模擬考試 台灣無人機基本級術科模擬(20 步驟) 依序完成所有步驟

第 8 關:台灣 CAA 無人機基本級術科模擬考試

模擬台灣民航局無人機基本級術科測驗,共 20 個步驟,分為三個階段:

  • Phase 1 — 定點起降與四面停懸:起飛 → 4 次 90° 偏航停懸(機頭分別朝前、右、後、左)→ 降落

  • Phase 2 — 矩形航線順時針:從 H 起飛 → P1 → P2 → P3 → P4 → 返回 H

  • Phase 2b — 矩形航線逆時針:從 H 起飛 → P4 → P3 → P2 → P1 → 返回 H

  • 最終降落:完成所有航線後精準降落於 H 降落場

  • 過關後自動解鎖下一關

  • 成績(用時秒數)自動記錄到瀏覽器 localStorage

  • 即時進度條顯示完成百分比


技術架構

技術棧

技術 說明
Three.js r128 3D 渲染引擎(CDN 載入,無需安裝)
JavaScript ES6 Modules 模組化架構,原生 import/export
Gamepad API 搖桿輸入支援
localStorage 成績與解鎖資料持久化
GitHub Pages 靜態部署,無需後端

無需 npm、bundler 或任何建置工具,直接開啟 index.html 即可運行。

檔案結構

├── index.html              # 主頁面 + UI 樣式 + 設定畫面 + 關卡選擇 + HUD
└── src/
    ├── Config.js           # 物理參數、飛行模式定義、8 關卡資料
    ├── Input.js            # 鍵盤/搖桿輸入(校正、死區、通道映射)
    ├── Physics.js          # 物理引擎(推力、重力、阻力、碰撞、姿態控制)
    ├── Scene.js            # 3D 場景(環境物件、無人機模型、燈光、攝影機)
    ├── LevelManager.js     # 關卡管理(目標生成、勝利判定、解鎖系統)
    └── main.js             # 主遊戲迴圈、UI 更新、事件調度

物理引擎參數

以下為 Config.js 定義的核心物理參數:

參數 說明
gravity 9.81 m/s² 重力加速度
mass 0.6 kg 無人機質量(模擬 5 吋機)
maxThrust 28.0 N 四馬達最大推力
dragCoeff 0.04 二次方空氣阻力係數
angularDrag 8.0 角速度阻尼係數
hardDeck 0.05 m 地面碰撞高度閾值
maxHeight 50 m 軟頂限制高度
thrustPower 18 推力縮放因子
thrustExpo 0.3 油門 Expo 曲線權重
rates 1.2 基礎角速率倍數
superRate 0.7 滿桿加速因子
maxTiltAngle 55° 自穩模式最大傾角
droneScale 3.0 無人機視覺縮放倍率

物理更新迴圈

每幀(dt 上限 0.1s)依序計算:

  1. 推力計算:油門輸入 → Expo 曲線 → 推力向量(沿無人機本地上方向)
  2. 外力合成:推力 + 重力(-mass × gravity)+ 空氣阻力(-dragCoeff × speed²
  3. 速度與位置積分velocity += acceleration × dtposition += velocity × dt
  4. 地面碰撞處理:高速撞地彈跳(vel.y × -0.3)、側向衰減、隨機旋轉擾動
  5. 姿態控制:依飛行模式計算目標角速度,四元數插值更新姿態
  6. 軟頂限制:超過 50m 高度時 vel.y × 0.95 逐漸減速

渲染系統

  • 燈光:半球光(天地雙色)+ 方向光(帶陰影)+ 環境光
  • 陰影:PCFSoft 柔邊陰影,解析度 2048×2048
  • 霧效:指數霧 FogExp2(密度 0.005),自然淡出遠景
  • 效能:像素比上限 2x、霧效減少遠景渲染負擔
  • 螺旋槳動畫:葉片轉速 0.5 + throttle × 2.0 rad/frame,碟面透明度隨油門變化

更新日誌

v2.3(2026-04-06)

  • 修復記憶體洩漏:切換關卡時正確 dispose 舊的 geometry / material / texture,防止 GPU 記憶體累積
  • 修復 AudioContext 自動播放政策:新增 ctx.resume(),Chrome / Safari 馬達音效正常播放
  • 修復物理參數面板無法顯示:toggle 時切換 display: flex / none
  • 修復羅盤方位反轉:Three.js Y 軸旋轉取反,右轉時方位角正確遞增
  • 修復幀率依賴問題:螺旋槳轉速、雲朵移動、攝影機跟隨改為基於 dt,不同幀率行為一致
  • 修復搖桿校準預設值:從特定搖桿偏移值 0.00392 改為通用零點 0
  • 新增水平邊界軟限制:超過 80m 後逐漸減速回拉,防止飛機飛出場地外消失
  • 修復術科考降落判定:加入速度檢查(< 1.5 m/s),高速撞地不算降落過關
  • 重構 ANGLE/ALT_HOLD 姿態控制:抽出共用 _applyAngleAttitude(),消除重複程式碼

v2.2(2026-03-01)

  • L8 術科模擬考試:第 8 關改為台灣 CAA 無人機基本級術科模擬考試(20 步驟),涵蓋定點起降、四面停懸、矩形航線順逆時針
  • 飛行模式中文名稱修正:ANGLE=自穩、HORIZON=半自穩、ACRO=手動、ALT_HOLD=定高
  • 手機觸控模式:新增雙虛擬搖桿觸控操控,支援 ARM/MODE 按鈕
  • Alt Hold 鍵盤操控修正:改為固定油門值(放開=50% 定高、W=80% 爬升、S=20% 下降)

v2.1(2026-03-01)

  • Shift 精準模式修正:Shift 鍵改為降低靈敏度(操控量 ×0.4),精細操控而非加速
  • Alt Hold PD 控制器:定高模式改用 PD 高度控制器(kP=8, kD=5×mass),精確鎖定高度不飄移
  • 第 1 關寬容度提升:離開目標高度時計時器倒扣速度由 ×2 降為 ×0.5,更容易過關
  • ESC 返回設定畫面:在關卡選擇畫面按 ESC 可返回設定畫面
  • Space 防連發:Space 鍵不再自動重複觸發,防止誤操作
  • 幀率獨立油門:油門增減與衰減改為時間制(基於 deltaTime),不同幀率下行為一致
  • 撞地特效衰減修正:crashIntensity 衰減改為幀率獨立(Math.pow(0.92, dt×60)

v2.0(2026-03-01)

  • 場景升級:精緻 3D 環境(25 棵樹木、3 棟建築、圍欄、H 型降落場、風向袋)
  • 陰影系統:PCFSoft 柔邊陰影(2048×2048 shadow map)
  • 無人機模型:四軸放大 3 倍,紅藍馬達、旋轉螺旋槳、LED 指示燈
  • LOS 視角:固定觀察點第三人稱視角,攝影機平滑跟隨
  • 8 關卡系統:從起飛定高到模擬考試的完整訓練路徑
  • 關卡選擇畫面:顯示解鎖狀態與最佳成績
  • Alt Hold 定高模式:油門中位自動維持高度,初學者友善
  • 撞地回饋:紅色閃光 + 攝影機抖動,衝擊力度正比於撞擊速度
  • 俯仰方向修正:修正搖桿俯仰映射方向
  • 攝影機跟隨高度:攝影機隨無人機高度平滑調整視角
  • 關卡解鎖系統:過關自動解鎖下一關,鎖定關卡灰化顯示
  • 移除飛手模型:簡化場景,消除視覺干擾
  • R 鍵重置功能:一鍵重置無人機位置與姿態
  • 運算子優先順序修正:修正物理計算邏輯錯誤
  • 定高標記可見度修正:確保高度指示器在所有條件下正確顯示

v1.1.0

  • 搖桿端點校正:支援 Min/Max 端點自動校正

v1.0

  • 基礎 LOS 飛行模擬
  • Acro / Angle / Horizon 三種飛行模式
  • 搖桿 + 鍵盤雙輸入支援
  • 2 個基礎訓練關卡
  • 真實 FPV 無人機造型
  • 鍵盤油門(按住飛行、放開下降)
  • 效能優化

本地開發

# 克隆專案
git clone https://github.com/m72900024/LOS-Flight-Simulator.git
cd LOS-Flight-Simulator

# 啟動本地伺服器(ES Modules 需要 HTTP 伺服器)
npx serve .
#
python3 -m http.server 8000

開啟瀏覽器前往 http://localhost:8000 即可。

注意:由於使用 ES6 Modules,直接開啟 index.htmlfile:// 協定)可能因 CORS 限制無法正常載入模組。請使用 HTTP 伺服器。


參與貢獻

歡迎任何形式的貢獻!

  1. Fork 此專案
  2. 建立功能分支:git checkout -b feature/your-feature
  3. 提交變更:git commit -m "feat: add your feature"
  4. 推送分支:git push origin feature/your-feature
  5. 開啟 Pull Request

貢獻方向建議

  • 新增訓練關卡
  • 改善飛行物理模型
  • 新增 FPV(第一人稱)視角模式
  • 多語系支援
  • 手機觸控控制
  • 音效系統

致謝與設計參考

  • 台灣交通部民航局AC107-005 遙控無人機術科測驗規範 為 L8 模擬考試的設計依據。
  • Betaflight — 飛行模式(ANGLE / HORIZON / ACRO)、Rates 系統與 Expo 曲線的設計參考。
  • @tamago797 — 開源無人機術科模擬器先行者,本專案的「雙圓考場標線」(內 4m / 中 6m 虛線 / 外 8m)與「智慧 H 停機坪 < 1m 動態亮綠」設計取材自其 Drone-Simulator-,依公開授權聲明取用。

相關工具

想完整準備台灣 CAA 無人機基本級考試?建議搭配:

  • 🎯 本專案 LOS-Flight-Simulator — 術科 8 關卡 + L8 模擬考
  • 📝 tamago797/Drone-Exam — 學科 40 題隨機抽題模擬

兩者並用即可一站式練習術科 + 學科。

授權

本專案採用 MIT License 授權。

免責聲明

  • 本模擬器僅供練習用,不能取代實機飛行訓練。 真實無人機操作涉及天氣、電磁干擾、機械故障、法規限制等模擬器無法重現的變因。
  • 通過 L8 模擬考試不代表能通過台灣民航局實際術科測驗。考試內容、評分標準、考場規格以民航局公告為準。
  • 模擬器內的物理模型為簡化版(單剛體 + Betaflight Rates 假設),與真實 5 吋 FPV 機 / 大疆機種的飛行手感不完全一致
  • 使用本模擬器產生的飛行偏好(如靈敏度、模式選擇)不可直接套用到真實飛行器,請以實際機種設定為準。
  • 本專案由 AI 輔助開發,可能存在 bug 或設計缺陷。如發現問題請至 Issues 回報。
  • 遵守當地法規:操作真實無人機時,請務必遵守台灣《遙控無人機管理規則》及空域限制;本專案不為使用者違法行為負責。

About

Open-source web-based FPV drone Line-of-Sight flight trainer. Betaflight-style physics, 8 progressive levels including Taiwan CAA basic exam simulation. Three.js + zero install.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors