科学・技術
ジェット燃料の節約
Saving Jet Fuel (tech.marksblogg.com)
要約
この記事は、オープンソースのフレームワークであるScikit-decideと航空機性能モデルであるOpenAPを活用し、風の条件や航空機の性能データに基づいて最適な飛行経路を計算することで、ジェット燃料の消費を削減する方法を解説しています。必要なソフトウェアのインストール手順や、OpenAPが提供する様々な航空機モデルのデータ構造についても詳細に説明しています。
全文翻訳
ジェット燃料の節約
ボーイング787-9ドリームライナーがニューアーク・リバティー国際空港(EWR)からレオナルド・ダ・ヴィンチ=フィウミチーノ空港(FCO)までノンストップで飛行する場合、8.5時間のフライトで68,000ドルのジェット燃料が必要になる可能性があります。風の条件に合わせて飛行経路を調整することで、燃料消費を削減し、数千ドルを節約できる可能性があります。Jeppesenのような企業がこの分野で製品を提供していますが、Scikit-decideは、デルフト工科大学の教授が開発したナローボディおよびワイドボディの燃料消費モデルと、NOAAからの風データと組み合わせることで、オープンソースのソリューションを提供します。Scikit-decideは6年間開発が続けられています。これは、強化学習、自動計画、スケジューリングのためのフレームワークです。このプロジェクトは、飛行経路の最適化、航空会社の労働力スケジュールの再編成、ドローンの群れ経路の計算を行うことができます。
OpenAPは、Junzi Sun博士によって開発された航空機性能モデルおよびツールキットです。Sun博士は航空交通管理の博士号を持ち、その他多くの業績の中で、オランダのTU Delftでテニュアを持つ准教授としてこの分野のコースを教えています。Scikit-decideの最適な飛行経路ソルバーは、異なる燃料消費モデルを使用するように設定できます。この記事では、Airbus A320とOpenAPの燃料消費モデルを使用して飛行された2つの飛行経路を比較します。
私のワークステーション
私は5.7 GHzのAMD Ryzen 9 9950X CPUを使用しています。これは16コア32スレッド、1.2 MBのL1、16 MBのL2、64 MBのL3キャッシュを備えています。液体クーラーが取り付けられており、広々としたフルサイズのCooler Master HAF 700コンピューターケースに収められています。システムには4,800 MT/sでクロックされた96 GBのDDR5 RAMと、最大12,400 MB/sの読み取り速度を持つ第5世代のCrucial T700 4 TB NVMe M.2 SSDが搭載されています。SSDには温度を下げるためのヒートシンクが付いています。これが私のシステムのCドライブです。システムは1,200ワットのフルモジュラーCorsair電源によって電力が供給されており、ASRock X870E Nova 90マザーボード上に配置されています。Windows 11 Pro上のUbuntu for WindowsでUbuntu 24 LTSを実行しています。なぜプライマリワーク環境としてLinuxベースのデスクトップを実行しないのか疑問に思っているかもしれませんが、私はまだNvidia GTX 1080 GPUを使用しており、Windowsの方がドライバーのサポートが優れており、ArcGIS ProはWindowsネイティブでしかサポートされていないためです。
前提条件のインストール
この記事では、Python 3.12とjqを使用します。
```bash
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt update
$ sudo apt install \
jq \
python3-pip \
python3.12-venv
```
Python仮想環境を設定し、scikit-decide、OpenAPオープン航空機性能モデル、およびSun博士によって開発された飛行軌道ツールキットであるOpenTopをインストールします。
```bash
$ python3 -m venv ~/.flight_planning
$ source ~/.flight_planning/bin/activate
$ pip install \
'scikit-decide[all]' \
'openap[all]' \
opentop
```
上記は少なくとも8 GBのストレージ容量を必要とします。インストールされたパッケージは以下の通りです。
```bash
$ pip install pipdeptree
$ pipdeptree -d0
```
lz4==4.4.5
openevolve==0.3.2
opentop==2.6.0
pip==24.0
pipdeptree==4.2.5
plado==0.1.6
pygeodesy==26.9.9
pygrib==2.1.8
pyRDDLGym-gurobi==0.2
pyRDDLGym-jax==3.1
pyRDDLGym-rl==0.2
pytz==2026.3.post1
ray==2.37.0
rddlrepository==2.2
sb3_contrib==2.3.0
scikit-decide==1.1.1
scikit-image==0.26.0
tensorboardX==2.6.5
torch-geometric==2.8.0.post1
typer==0.27.2
unified-planning==1.2.0
up-enhsp==0.0.27
up_fast_downward==0.5.2
up-pyperplan==1.1.0
z3-solver==5.1.0.0
この記事では、H3、JSON、Lindel、Parquet、Spatial拡張機能とともにDuckDBを使用します。
```bash
$ cd ~
$ wget -c https://github.com/duckdb/duckdb/releases/download/v1.5.4/duckdb_cli-linux-amd64.zip
$ unzip -j duckdb_cli-linux-amd64.zip
$ chmod +x duckdb
$ ~/duckdb
```
```sql
INSTALL h3 FROM community;
INSTALL lindel FROM community;
INSTALL json;
INSTALL parquet;
INSTALL spatial;
```
DuckDBを起動するたびにすべてのインストール済み拡張機能をロードするように設定します。
```bash
$ vi ~/.duckdbrc
```
```
.timer on
.width 180
LOAD h3;
LOAD lindel;
LOAD json;
LOAD parquet;
LOAD spatial;
```
この記事のマップは、QGISバージョン4.2.1でレンダリングされました。QGISは、Windows、macOS、Linuxで実行されるデスクトップアプリケーションです。このアプリケーションは近年人気が高まっており、毎月世界中のユーザーから約2200万回のアプリケーション起動があります。境界線と地名はNatural Earthから、海洋境界線はMarine Regionsから取得しました。
OpenAPの航空機タイプ
まずOpenAPリポジトリをクローンします。
```bash
$ git clone https://github.com/junzis/openap
```
単体テストとユーティリティスクリプトを除くと、このパッケージには3,369行のPythonコードが含まれています。OpenAPのモデルは、コードベースとともにパッケージ化された多数のデータセットに依存しています。これらは幅広い航空機をカバーしています。以下は航空機メーカーの数です。
```bash
$ grep -ho 'aircraft: .*[a-z] ' \
openap/data/aircraft/*.yml \
| cut -d' ' -f2 \
| sort \
| uniq -c \
| sort -rn
```
17 Boeing
13 Airbus
5 Embraer
1 Gulfstream
1 Cessna
これはAirbus A380-800のプロパティです。
```bash
$ cat openap/data/aircraft/a388.yml
```
```yaml
aircraft: Airbus A380-800
mtow: 560000
mlw: 386000
oew: 277000
mfc: 320000
vmo: 340
mmo: 0.89
ceiling: 13100
pax:
max: 853
low: 410
high: 620
fuselage:
length: 72.72
height: 8.41
width: 7.14
wing:
area: 845
span: 79.75
mac: null
sweep: 33.5
t/c: 0.08
flaps:
type: single-slotted
area: null
bf/b: null
lambda_f: 0.900
cf/c: 0.150
Sf/S: 0.150
cruise:
height: 12800
mach: 0.85
range: 14800
engine:
type: turbofan
mount: wing
number: 4
default: GP7270
options:
A380-841: Trent 970-84
A380-842: Trent 972-84
A380-861: GP7270
drag:
cd0: 0.016
k: 0.050
e: 0.855
gears: 0.012
```
これはその抗力係数です。
```bash
$ cat openap/data/dragpolar/a388.yml
```
```yaml
aircraft: Airbus A380-800
clean:
cd0: 0.016
k: 0.050
e: 0.855
gears: 0.012
flaps:
lambda_f: 0.900
cf/c: 0.150
Sf/S: 0.150
```
これはいくつかの追加のプロパティです。
```bash
$ echo "import pandas as pd; print( pd.read_fwf('openap/data/wrap/a388.txt') \
.to_csv(index=False))" \
| python3 \
| ~/duckdb \
-c '.maxwidth 150' \
-c "SELECT * EXCLUDE(parameters), parameters: SPLIT(parameters, '|') FROM READ_CSV('/dev/stdin')"
```
```
┌──────────────────────┬────────────────┬───────────────────────────────────────┬────────┬────────┬─────────┬─────────┬──────────────────────────────┐
│ variable │ flight phase │ name │ opt │ min │ max │ model │ parameters │
├──────────────────────┼────────────────┼───────────────────────────────────────┼────────┼────────┼─────────┼─────────┼──────────────────────────────┤
│ to_v_lof │ takeoff │ Liftoff speed │ 89.9 │ 75.4 │ 104.4 │ norm │ [89.93, 10.07] │
│ to_d_tof │ takeoff │ Takeoff distance │ 2.56 │ 1.35 │ 3.78 │ norm │ [2.56, 0.74] │
│ to_acc_tof │ takeoff │ Mean takeoff accelaration │ 1.35 │ 1.04 │ 1.66 │ norm │ [1.35, 0.19] │
│ ic_va_avg │ initial_climb │ Mean airspeed │ 88.0 │ 80.0 │ 96.0 │ norm │ [88.15, 5.64] │
│ ic_vs_avg │ initial_climb │ Mean vertical rate │ 5.65 │ 4.4 │ 8.94 │ gamma │ [4.76, 3.22, 0.65] │
│ cl_d_range │ climb │ Climb range │ 296.0 │ 200.0 │ 446.0 │ beta │ [3.23, 5.18, 179.46, 335.24] │
│ cl_v_cas_const │ climb │ Constant CAS │ 163.0 │ 155.0 │ 170.0 │ norm │ [163.39, 4.51] │
│ cl_v_mach_const │ climb │ Constant Mach │ 0.84 │ 0.8 │ 0.86 │ beta │ [12.23, 5.32, 0.72, 0.17] │
│ cl_h_cas_const │ climb │ Constant CAS crossover altitude │ 3.3 │ 1.3 │ 5.3 │ norm │ [3.29, 1.24] │
│ cl_h_mach_const │ climb │ Constant Mach crossover altitude │ 8.9 │ 8.2 │ 9.7 │ norm │ [8.94, 0.47] │
│ cl_vs_avg_pre_cas │ climb │ Mean climb rate, pre-constant-CAS │ 7.85 │ 5.95 │ 9.75 │ norm │ [7.85, 1.16] │
│ cl_vs_avg_cas_const │ climb │ Mean climb rate, constant-CAS │ 7.51 │ 5.2 │ 9.82 │ norm │ [7.51, 1.40] │
│ cl_vs_avg_mach_const │ climb │ Mean climb rate, constant-Mach │ 5.56 │ 3.23 │ 7.91 │ norm │ [5.57, 1.42] │
│ cr_d_range │ cruise │ Cruise range │ 4348.0 │ 892.0 │ 20565.0 │ gamma │ [2.81, 246.73, 2274.81] │
│ cr_v_cas_mean │ cruise │ Mean cruise CAS │ 136.0 │ 130.0 │ 145.0 │ beta │ [3.32, 5.27, 126.00, 29.75] │
│ cr_v_cas_max │ cruise │ Maximum cruise CAS │ 145.0 │ 134.0 │ 164.0 │ beta │ [2.02, 3.21, 130.38, 46.65] │
│ cr_v_mach_mean │ cruise │ Mea
```