Atmosphere Engineering Lab.

運動シミュレーションと強化学習を組み合わせる — 自己対戦ドッグファイトAIの事例

はじめに — なぜ運動シミュレーション×強化学習か

物理法則に従って状態が時間発展する運動シミュレーション(機体・車両・ロボットなどの運動方程式ベースのシミュレータ)は、それ単体では「操縦入力に対して状態がどう変化するか」を計算するだけの道具です。目的が明確で相手のいない問題(高度を一定に保つ、姿勢を収束させる)であれば、そこに与える操縦入力(制御則)をPID制御や最適制御のような確立した手法で人手で設計すれば十分です。

一方、相手の出方で最適な振る舞いが変わる対戦的なタスクや、達成条件が複雑で制御則を書き下しにくいタスクでは、強化学習(RL)で方策を学習させる選択肢が出てきます。運動シミュレーションはRLにとって「正確な状態遷移を計算してくれる環境」そのものであり、物理モデルさえあれば観測・行動・報酬を設計するだけでRL環境を構築できます。

この記事では、6自由度(6DOF)運動方程式ベースの飛行シミュレータ上で、2機を自己対戦させながらPPOでAIを学習させた事例を紹介します。前半で運動シミュレーション自体(運動方程式・制御入力)、後半で強化学習の部分(観測・報酬設計)を分けて整理します。

航空機の運動シミュレーション

土台になっているのは、航空機を対象にした6自由度(6DOF)運動方程式ベースの飛行シミュレータです。機体を1つの質点とみなし、状態を次の12個の変数で表します。

x=[x, y, z, u, v, w, ϕ, θ, ψ, p, q, r]\mathbf{x} = [\,x,\ y,\ z,\ u,\ v,\ w,\ \phi,\ \theta,\ \psi,\ p,\ q,\ r\,]
  • x,y,zx, y, z — 地球座標系での位置 [m](zzは下向きが正で、高度は z-z
  • u,v,wu, v, w — 機体座標系での並進速度(前後・左右・上下)[m/s]
  • ϕ,θ,ψ\phi, \theta, \psi — オイラー角(ロール・ピッチ・ヨー)[rad]
  • p,q,rp, q, r — 機体座標系での角速度(ロール・ピッチ・ヨー方向)[rad/s]

運動方程式

並進運動は、機体に固定した座標系でニュートンの運動方程式を立てます。座標系自体が回転しているため、通常の u˙=Fx/m\dot{u}=F_x/m に加えて角速度どうしの積が現れます。

u˙=Fxmqw+rvv˙=Fymru+pww˙=Fzmpv+qu\begin{aligned} \dot{u} &= \frac{F_x}{m} - qw + rv \\ \dot{v} &= \frac{F_y}{m} - ru + pw \\ \dot{w} &= \frac{F_z}{m} - pv + qu \end{aligned}

Fx,Fy,FzF_x, F_y, F_z は機体座標系で見た合力(空力+推力+機体軸に変換した重力)、mm は質量です。

回転運動はオイラーの運動方程式で表されます。

Iω˙=Mω×(Iω)I\dot{\boldsymbol{\omega}} = \mathbf{M} - \boldsymbol{\omega} \times (I\boldsymbol{\omega})

II は慣性テンソル、ω=(p,q,r)\boldsymbol{\omega}=(p,q,r)M=(L,M,N)\mathbf{M}=(L,M,N) はロール・ピッチ・ヨー方向の合モーメントです。右辺第2項はジャイロ効果(角運動量の向きが回転によって振られることで生じる項)で、並進運動には現れない回転運動特有の非線形項です。

姿勢と位置は、これらから求めた角速度・並進速度を運動学的に積分して得ます。

ϕ˙=p+(qsinϕ+rcosϕ)tanθθ˙=qcosϕrsinϕψ˙=qsinϕ+rcosϕcosθp˙earth=Rbevbody\begin{aligned} \dot{\phi} &= p + (q\sin\phi + r\cos\phi)\tan\theta \\ \dot{\theta} &= q\cos\phi - r\sin\phi \\ \dot{\psi} &= \frac{q\sin\phi + r\cos\phi}{\cos\theta} \end{aligned} \qquad \dot{\mathbf{p}}_{earth} = R_{be}\,\mathbf{v}_{body}

RbeR_{be} は機体座標系から地球座標系への回転行列です。以上あわせて12本の常微分方程式を、4次のルンゲ・クッタ法(RK4)で数値積分することで、任意の操縦入力に対して機体がどう飛ぶかを再現します。

力とモーメントの中身 — 空力モデル

上式の Fx,Fy,FzF_x,F_y,F_zM\mathbf{M} は、迎角 α\alpha・横滑り角 β\beta・舵角・角速度から空力係数を介して計算します。揚力・横力・ロール/ピッチ/ヨーモーメントの係数は、たとえば揚力係数なら

CL=CL0+CLαα+CLqq^+CLδeδe+CL,flapflapC_L = C_{L0} + C_{L\alpha}\,\alpha + C_{Lq}\,\hat{q} + C_{L\delta_e}\,\delta_e + C_{L,\mathrm{flap}}\cdot\mathrm{flap}

のように、基準値に各要因の寄与を線形に足し合わせる安定微係数モデルです(q^\hat qは角速度を無次元化したもの)。ただし抗力係数だけは例外で、

CD=CD0+kiCL2+CD,flapflapC_D = C_{D0} + k_i\,C_L^2 + C_{D,\mathrm{flap}}\cdot\mathrm{flap}

のように揚力係数の2乗に比例する誘導抗力の項が入ります(kik_iは翼のアスペクト比とオズワルド効率から決まる係数)。これらの係数に動圧 qˉ=12ρV2\bar q = \frac12 \rho V^2 と翼面積・翼幅・平均翼弦を掛けることで、実際の力とモーメントの単位に変換します。

制御入力と、それが何を動かすか

操縦できる入力は次の6つです。

制御入力範囲主に効く係数主に変化する状態量
エルロン−1〜1ロールモーメント ClC_l(副次的にヨーモーメント CnC_n角速度 pp → バンク角 ϕ\phi
エレベーター−1〜1揚力 CLC_L・ピッチモーメント CmC_m角速度 qq → ピッチ角 θ\theta、迎角 α\alpha
ラダー−1〜1横力 CYC_Y・ヨーモーメント CnC_n(副次的にロールモーメント ClC_l角速度 rr → 機首方位角 ψ\psi、横滑り角 β\beta
フラップ0〜1揚力・抗力・ピッチモーメントのオフセット低速時の揚力(と引き換えの抗力増加・トリム変化)
左スロットル/右スロットル(独立)0〜1左右それぞれのエンジン推力対気速度 uu、左右差によるロール・ヨーモーメント

括弧内に書いた通り、舵は狙った軸だけに効くわけではなく、副次的な結合(エルロンによるアドバースヨーなど)も持っています。いずれも効果は動圧 qˉ\bar q に比例するため、対気速度が落ちるほど舵の効きは弱くなります。

対照的なのが左右独立スロットルです。エンジンは重心から左右にオフセットした位置に取り付けられているため、左右の推力に差をつけるだけで、エルロンやラダーを使わずにロール・ヨーモーメントが発生します(差動推力)。舵面の効きが対気速度の2乗に比例するのに対し、このモデルでは推力そのものは対気速度に依存しないため、低速域でも姿勢を制御する手段を1つ確保できます。

強化学習によるドッグファイト

ここまでの運動方程式は、あくまで「操縦入力を与えたら機体がどう動くか」を計算する土台です。この上に、2機を自己対戦させながらPPO(Proximal Policy Optimization)で方策を学習させるレイヤーを追加しました。物理的な当たり判定はなく、両機を結びつけるのは相手までの距離や相対的な位置関係だけです。A機・B機には同一の方策ネットワークを使います(self-play)。行動空間は前節の制御入力のうちフラップを除いた4次元(エルロン・エレベーター・ラダー・左右共通スロットル)に簡略化しています。

機体の性格に差をつけるため、速度重視(推力大・翼面積小・旋回性に劣る)と旋回重視(翼面積大・舵効き大・最高速に劣る)という2種類の機体諸元も用意しました。実在の機体を参考にした値ではなく、個体差を持たせるためのダミーの諸元です。

学習済み方策による2機のドッグファイト。左下のレーダーは自機の機首基準で相手の方位・距離を表示し、死角に入っている間は何も表示されない。ロックオン中は2機を結ぶ線が赤く表示される。

これは学習済み方策どうしを対戦させた実行例で、速度重視の機体と旋回重視の機体が、高度差のあるマージ(正面から接近する状況)から始まっています。左下のレーダーは自機の機首基準で相手の方位・距離を示すパネルで、自機の真後ろ30度は死角として扱われ、相手がそこに隠れている間は何も表示されません。実際の空戦におけるレーダー警戒装置の死角を、観測設計だけで再現した部分です。相手を後方から一定時間捉え続けるとロックオンが成立し、その間は2機を結ぶ線が赤く表示されます。

観測の設計で気をつけたこと

A機・B機に同じ方策ネットワークを使い回す自己対戦では、観測を「北向きが正」のようなワールド座標系ではなく、必ず「自分から見てどうか」という自機視点の相対的な情報として設計する必要があります。そうしないと、A機用に学習した方策をB機の座席にそのまま使い回せません。自機の速度や姿勢に加えて、相手までの距離や自機から見た相対的な位置・速度、機体諸元の違いなどを、常に自分視点に正規化した形で観測に含めています。

勝敗は「相手の後方の一定範囲に位置し、かつ自機の機首も相手を捉えている状態」を一定時間維持することで決まります。単に背後を取るだけでなく、位置と照準の両方を要求することで、狙って仕留めにいっているかどうかを判定する設計にしています。

報酬設計の難しさ

環境と学習ループ自体は素直に組めても、実際に学習を回してみて初めて気づくことがいくつもありました。

成功体験の頻度が少なすぎると、そもそも学習が進まない。 最初は、後方の位置条件だけをかなり長い時間維持し続けることを勝利条件にしていました。基礎的な飛行(クラッシュ回避など)は学習できたものの、その条件では自己対戦の中で勝敗がなかなかつかず、方策改善につながる成功体験が得られませんでした。維持時間を短くし、死角を設けて「気づかれずに背後を取る」戦術が生まれやすくしたことで、学習の初期段階から勝敗がつきやすくなりました。

「逃げ得」という縮退解への収束。 学習を進めると、両者が距離を取って引き分けに終わる「離脱」が学習とともに増えていく現象が起きました。離脱に何のペナルティも設定していなかったため、自己対戦の中で「戦わずに距離を取れば損をしない」という保守的な戦略に収束していたのが原因です。離脱そのものに軽いペナルティを加えることで、決着がつく割合が大きく上昇しました。報酬に「何もしないことのコスト」が入っていないと、自己対戦・敵対的な設定ではこうしたリスク回避的な戦略に収束しやすい傾向があります。

条件を一段厳しくすると、それまで積み上げた学習が効かなくなる。 「背後にいるだけでなく機首も向けるべき」という発想で照準条件を追加し、同時に維持時間も延ばしたところ、既存の学習成果を引き継いでも決着がほとんどつかなくなってしまいました。複数の条件を同時に、かつ一気に厳しくしたことで、それまでの学習が前提にしていた「勝ちやすさ」が崩れてしまった形です。照準の許容角度を広げ、維持時間も元の長さに戻すことで学習は再び進むようになりました。タスクの難易度は一度に大きく引き上げず、学習が追従できる粒度で段階的に上げていく必要がある、というのはカリキュラム学習にも通じます。

拮抗した勝負をどう見るか

自己対戦では、対戦する2つの方策が常に同じネットワーク(同じ実力)です。相手も自分と同じペースで強くなっていくため、条件を厳しくするほど、時間切れやクラッシュで決着がつかないシナリオも増えていきます。今回も、照準条件を厳しくした後は大半のシナリオが非決着に終わり、安定して決着がついたのは一部の組み合わせにとどまりました。これは実力が拮抗した末の引き分けと、学習がその難易度にまだ追いついていない不安定さの、両方が混ざった結果だと捉えています。

おわりに

運動シミュレーションと強化学習を組み合わせる場合、前半で見た運動方程式のように、物理モデルさえあれば環境自体はすぐに作れます。難しいのは、その上でどう観測・行動・報酬を設計するかという部分で、特に報酬設計は素朴な条件のままでは意図しない振る舞い(逃げ得など)に収束しがちです。維持時間や難易度を小さく調整しながら学習結果を確認し、段階的に条件を引き上げていくことが重要です。