この記事で学べること#
- Dutch Roll Mode(横・方向振動モード)の基礎
- Cnr(ヨー減衰係数)が減衰に与える影響
- 2段階改善プロセス: Cnr調整→ラダー入力最適化
- 横滑り角・ロール角の観測データから挙動を評価する方法
- YAMLコンフィグレーションによるパラメータ設定
対象読者#
- B-7「JSBSim空力微係数の基礎」を読んだ方
- Dutch Roll Modeのシミュレーションを実装したい方
- 空力微係数の実践的調整方法を学びたい中級者
本記事では、JSBSimでDutch Roll Modeを実装する際の空力微係数調整の実践例を解説します。初期設定の問題点を分析し、2段階の改善プロセスで教育的に適切な挙動を実現します。
Dutch Roll Modeとは?#
横・方向の振動モード#
Dutch Roll Mode(ダッチロールモード)は、横・方向の振動モードで、以下の3つの運動が連成します。
- ヨー(ψ): 機首方位の左右振動
- ロール(φ): バンク角の左右振動
- 横滑り(β): 機体の横滑り角の振動
特性#
- 周期: 5~8秒(小型機)
- 減衰: 支配的パラメータはCnr(ヨー減衰係数)
- 励起方法: ラダーダブレット入力(左→中立→右)
空力微係数Cnr(ヨー減衰)の役割#
Cnrの定義#
Cnr(Yaw Damping Derivative)は、ヨー角速度に対するヨーモーメントの変化率です。
Cn = ∂(Yaw Moment) / ∂rr: ヨー角速度(rad/s)- Cnr < 0: ヨー角速度に対して減衰方向のモーメント
Dutch Roll減衰への影響#
Cnrは、Dutch Roll Mode減衰比(ζ)に直接影響します。
ζ_DR ≈ -(Yβ + u₀·Nr) / (2·ωn·u₀)- |Cnr|が大きい: 減衰が強い(振動が早く収束)
- |Cnr|が小さい: 減衰が弱い(振動が持続)
一般的な値:
- Cessna 172: Cnr ≈ -0.099 /rad(十分な減衰)
- Swept-wing jets: Cnr ≈ -0.05 /rad(ヨーダンパー必要)
実装の2段階改善プロセス#
初期設定の問題点#
Aircraft: edu280_dutch_roll_demo(Cnr=-0.03) 初期高度: 100m ラダー入力: ±10°
観測結果(❌ 異常な挙動):
- 横滑り角: ±16°(正常範囲±2-5°を大きく超過)
- ロール角: -12° ~ 67°(過大)
- 高度損失: 96.4m(100m → 3.6m)
- 地面接触: 2回(t=20.7s, t=37.8s)
- フル旋回運動(発散型運動に移行)
問題の原因:
- Cnr=-0.03が小さすぎる(減衰不足)
- ラダー入力±10°が大きすぎる
- 初期高度100mが不足
Stage 1: Cnr調整(-0.03 → -0.055)#
目的: ヨー減衰を増強し、振動を抑える
変更内容:
- Cnr: -0.03 → -0.055
- 初期高度: 100m → 150m
- ラダー入力: ±10°(維持)
結果(⚠️ 部分的改善):
- 横滑り角: ±8°(改善: ±16° → ±8°)
- ロール角: 32° ~ 65°(依然として過大)
- 最終高度: 14.0m(改善: 3.6m → 14.0m)
- 地面接触: なし
評価:
- ✅ Cnr改善で横滑り角が半減
- ❌ ロール角は依然として過大
- ✅ 初期高度引き上げで地面接触回避
Stage 2: ラダー入力最適化(±10° → ±5°)#
目的: 励起振幅を適切化し、観測可能な振動を実現
変更内容:
- Cnr: -0.055(維持)
- 初期高度: 150m(維持)
- ラダー入力: ±10° → ±5°
結果(✅ 教育的に適切):
- 横滑り角: ±4°(正常範囲±2-5°に収まる)
- ロール角: 4.5° ~ 34.7°(大幅改善)
- 最終高度: 114.4m(高度損失わずか35.6m)
- 地面接触: なし
- 減衰比: ζ ≈ 0.08-0.10(MIL-F-8785C Level 1 marginal or Level 2)
評価:
- ✅ 横滑り角が正常範囲内
- ✅ ロール角が大幅改善
- ✅ 高度損失が小さい
- ✅ 5-8サイクルの振動が観測可能
実装結果の比較#
定量的比較#
| 設定 | Cnr | 初期高度 | ラダー | 横滑り角範囲 | ロール角範囲 | 最終高度 | 評価 |
|---|---|---|---|---|---|---|---|
| Original | -0.03 | 100m | ±10° | ±16° | -12° ~ 67° | 3.6m | ❌ 異常 |
| Stage 1 | -0.055 | 150m | ±10° | ±8° | 32° ~ 65° | 14.0m | ⚠️ 部分改善 |
| Stage 2 | -0.055 | 150m | ±5° | ±4° | 5° ~ 35° | 114.4m | ✅ 適切 |
グラフでの比較#
横滑り角(β)の時系列変化:
Original (Cnr=-0.03, ±10°):
| ╱╲ ╱╲
β | ╱ ╲ ╱ ╲
±16°| ╱ ╲ ╱ ╲
|____╱________╲__╱________╲____
0 10s 20s 30s 40s
Stage 2 (Cnr=-0.055, ±5°):
| ╱╲ ╱╲ ╱╲
β | ╱ ╲ ╱ ╲ ╱ ╲
±4° | ╱ ╲ ╱ ╲ ╱ ╲
|╱______╲╱______╲╱______╲
0 10s 20s 30s 40s
→ 振幅が1/4に減少、周期は約6秒で安定YAMLコンフィグレーション解説#
最終推奨設定(Stage 2)#
# dutch_roll_demo.yaml
aircraft:
model: "edu280_dutch_roll_demo" # Cnr=-0.055
initial_conditions:
altitude_m: 150.0 # Stage 1で100m→150mに引き上げ
velocity_mps: 12.0
pitch_deg: 0.0
roll_deg: 0.0
yaw_deg: 0.0
control:
throttle: 0.5 # 一定
rudder_normalization_factor: 0.44 # rad (~25° max deflection)
initialization_phase:
description: "Trim to level flight"
end_time_s: 5.0
rudder_deg: 0.0
excitation_phase:
description: "Rudder doublet to excite Dutch roll"
end_time_s: 9.5
# Doublet timeline (3-step: left → neutral → right)
left_rudder_start_s: 5.0
left_rudder_end_s: 7.0
left_rudder_deg: 5.0 # Stage 2で10.0→5.0に削減
neutral_start_s: 7.0
neutral_end_s: 7.5
right_rudder_start_s: 7.5
right_rudder_end_s: 9.5
right_rudder_deg: -5.0 # Stage 2で-10.0→-5.0に削減
observation_phase:
description: "Hands-off Dutch roll oscillation"
end_time_s: 40.0
rudder_deg: 0.0 # ニュートラルに戻す
simulation:
dt_s: 0.005 # 5ms(短周期振動のため高頻度サンプリング)
duration_s: 40.0 # 5-8サイクル観測可能重要なパラメータ#
1. Cnr(機体XMLで設定):
<!-- edu280_dutch_roll_demo.xml -->
<function name="aero/moment/Yaw_r">
<product>
<value>-0.055</value> <!-- Cnr = -0.055 /rad (Stage 1で調整) -->
<property>velocities/r-rad_sec</property>
<property>aero/qbar-area</property>
<property>metrics/bw-ft</property>
</product>
</function>2. ラダーダブレット励起パターン:
t=0-5s: 初期化(トリム)
t=5-7s: 左ラダー +5°
t=7-7.5s: ニュートラル 0°
t=7.5-9.5s: 右ラダー -5°
t=9.5-40s: 観測(ハンズオフ)実装手順#
Step 1: 機体XMLの作成#
edu280_baselineをコピーして、Cnrを調整します。
cd article-sources/educational-flight-modes/aircraft_models/aircraft
cp edu280_baseline.xml edu280_dutch_roll_demo.xmlCnr修正 (line 535付近):
<!-- Original: -0.08 -->
<value>-0.08</value>
<!-- Modified: -0.055 (Stage 1) -->
<value>-0.055</value>Step 2: YAMLコンフィグレーション作成#
cd article-sources/educational-flight-modes/phase3_unstable_modes/configs
# dutch_roll_demo.yamlを上記の設定で作成Step 3: シミュレーション実行#
cd article-sources/educational-flight-modes/phase3_unstable_modes
python dutch_roll_mode.py \
--config configs/dutch_roll_demo.yaml \
--output output/dutch_roll_demo.csvStep 4: 結果確認#
# CSVファイルの確認
head output/dutch_roll_demo.csv期待されるCSV列:
time,phase,altitude_m,airspeed_m_s,beta_deg,phi_deg,psi_deg,p_deg_sec,r_deg_sec,rudder,throttle
0.000,initialization,150.000,12.000,0.0000,0.00,0.00,0.0000,0.0000,0.000000,0.5000
...教育的意義#
B-7「空力微係数の基礎」との関連#
本記事は、B-7で学んだ理論を実践的に適用する事例です。
B-7で学んだこと:
- Cnr(ヨー減衰係数)の定義
- Dutch Roll減衰比への影響
D-10で実践すること:
- Cnr値の具体的調整(-0.03 → -0.055)
- 調整結果の定量的評価(横滑り角±16° → ±4°)
- 励起入力の最適化(±10° → ±5°)
実装から学べること#
- 理論と実践のギャップ: 理論的に計算したCnr値でも、実際のシミュレーションで微調整が必要
- 多段階改善の重要性: 1回の調整では不十分、観測結果を見て段階的に改善
- 複数パラメータの相互作用: Cnr、ラダー入力、初期高度が相互に影響
- 教育的目的の設定: 「発散しない」だけでなく「観測可能な振動を実現」
よくある問題と対処法#
問題1: 横滑り角が大きすぎる(±10°超)#
原因:
- Cnrが小さすぎる(減衰不足)
- ラダー入力が大きすぎる
対策:
- Cnrを増やす(例: -0.03 → -0.05 ~ -0.06)
- ラダー入力を減らす(例: ±10° → ±5°)
問題2: 振動が見えない(1サイクルで収束)#
原因:
- Cnrが大きすぎる(過減衰)
対策:
- Cnrを減らす(例: -0.08 → -0.05)
- ただし、MIL-F-8785C Level 2以上を維持(ζ ≥ 0.02)
問題3: 地面に接触する#
原因:
- 初期高度が低すぎる
- ロール角が大きく高度損失が大きい
対策:
- 初期高度を引き上げる(例: 100m → 150m)
- Cnr・ラダー入力を調整してロール角を抑える
まとめ#
本記事では、Dutch Roll Mode実装における空力微係数Cnrの実践的調整方法を解説しました。
重要なポイント:
- Cnrは Dutch Roll 減衰を支配する最重要パラメータ
- 2段階改善: Cnr調整(-0.03 → -0.055)+ ラダー入力最適化(±10° → ±5°)
- 横滑り角±4°、ロール角5-35°で教育的に適切な挙動を実現
- 初期高度150m、シミュレーション時間40sで5-8サイクル観測可能
- 実装結果の定量的評価(横滑り角、ロール角、高度損失)が重要
次のステップとして、Spiral Mode実装(バンク角36°飽和現象)やヨーダンパー設計(V3)に挑戦してみましょう。
参照資料#
本記事の執筆にあたり、以下の資料を参照しました [@nelson_flight_stability_1998; @mil_f_8785c_1980; @dutch_roll_design_report_2025; @dutch_roll_test_report_2025]。