第5章の2次系近似設計は「\(\zeta\) を選べば終わり」の明快さが魅力でした。 しかし、むだ時間はずっと近似の外に置かれたまま——攻めると突然現れる「崖」の 正体も、時間領域の言葉ではうまく説明できませんでした。 この章では視点を周波数領域に移します。 安全マージンを直接測って、指定して設計する——それがループ整形です。 実機 StampFly に載っている自動チューナも、この流儀で書かれています。

7.1 開ループという見方 — 安全マージンを測る

フィードバック系の安定性は、ループを一周する伝達関数 \(L(s) = C(s)G(s)\)(開ループ)で決まります。閉ループが発振する条件は、 ループ一周の信号が「大きさそのまま・位相がちょうど反転」で戻ってくること—— すなわち \(L(j\omega) = -1\) です。だから設計の関心事は、 \(L(j\omega)\) が \(-1\) にどれだけ近づくかに尽きます。 距離の測り方が2つあります:

経験則の目安は位相余裕 60° 以上。ドローンでもこの目安は 経験上有効です。そして交差周波数 \(\omega_c\) は応答の速さそのもの—— 高いほど機敏ですが、後で見るようにむだ時間の「家賃」が高くつく。 性能と安定性のトレードオフを、\(\omega_c\) と PM という2つの数字で 直接指定するのがループ整形の設計です。

7.2 位相予算の家計簿

交差周波数での位相を、収支表として書いてみます。持ち点は \(180°\)。 そこから各要素が位相を「支出」していき、残った分が位相余裕です。 第4〜5章で同定したロール・レートループなら:

$$\mathrm{PM} = 180° \underbrace{- 90°}_{\text{機体の積分器}} \underbrace{- \tan^{-1}(\tau_m \omega_c)}_{\text{モータ遅れ}} \underbrace{- 57.3° \cdot \omega_c L}_{\text{むだ時間}} \underbrace{- \tan^{-1}\tfrac{1}{T_i \omega_c}}_{\text{積分項}} \underbrace{+ \phi_D(\omega_c)}_{\text{Dの位相進み}}$$

家計簿の肝はむだ時間の項だけが \(\omega_c\) に比例することです。 モータ遅れの \(\tan^{-1}\) は 90° で頭打ちになりますが、むだ時間の支出は 交差を上げるほど際限なく増える——たとえば \(L=12\) ms なら、 \(\omega_c=25\) rad/s で 17°、76 rad/s なら 52°。 「交差周波数はプラントの帯域(とむだ時間)で決まる」という 設計則の正体はこの一行です。

7.3 触って確かめる — ボード線図の上でゲインを動かす

下の教材は、同定済みロール・レートプラントに PID を掛けた開ループ \(L(j\omega)\) のボード線図(ゲインと位相を周波数で並べた図)です。 初期値は実機の飛行実績ゲイン。\(K_p\) を上げると交差が右へ動いて PM が減る、\(T_d\) がリードの山で位相を返す、むだ時間 \(L\) が 高周波の位相をまっすぐ食い落とす——全部この1枚で見えます。 読み出しには位相予算の内訳も出ます。

条件: プラントは第4〜5章の同定値(\(I_{xx}=9.16\times10^{-6}\)、 \(\tau_m=20\) ms)。制御器は実装の形(PI-D・\(\eta=0.125\))。 上段=|L| [dB]、下段=∠L [°]。縦の点線が交差周波数、−180° 線との差が位相余裕。

7.4 第5章の「崖」の種明かし

第5章 5.4 節で、外側ループを攻めると突然発散する「崖」を見ました。 いまなら一行で説明できます。ゲインを上げる=交差周波数を上げる。 むだ時間の支出は交差に比例して増える。だからどこかで位相余裕が尽きる—— そして PM が 0° を切った瞬間が崖です。理想(\(L=0\))で崖が現れなかったのは、 支出が頭打ちのモータ遅れだけだったから。1/3 則とは、 「むだ時間の家賃が安い低層階に住む」という知恵だったわけです。 上の教材で \(L=12\) ms にして \(K_p\) を上げ、PM が溶けて 0 に触れる瞬間を 確かめてください。

7.5 実機の自動チューナを読む — 設計則はコードにある

StampFly には、この章の内容がそのままコードになったオンボード自動チューナが 載っています(CLI から autotune roll 一発)。中身は:

  1. 同定: 飛行中にステップドサイン(周波数を階段状に変えた 正弦波)で機体を揺すり、レートプラント \(b\,e^{-Ls}/(s(Ts+1))\) の 3パラメータを当てはめる。
  2. 設計: 仕様は交差周波数と位相余裕で指定。 既定は PM = 60°、\(\omega_c\) = 25 rad/s(ロール・ピッチ)/ 18 rad/s(ヨー——操縦権限が小さく同定の SN 比も低いため保守的に)。 \(T_i = 10/\omega_c\)(積分の支出を交差の1桁下に置く——第5章の位相コストの 話と同じ流儀)、\(T_d\) は位相条件を二分法で解き、\(K_p\) は振幅条件 \(|L(j\omega_c)|=1\) から決める。
  3. 検収: 設計後に数値検証し、PM 不足・ゲイン余裕不足・ 物理範囲外なら理由コードつきで棄却する。

仕様が「ゲインの値」ではなく「余裕」で書かれていることに注目してください。 モデルが多少ずれても、余裕という安全在庫で受け止める—— これがループ整形の思想です。

7.6 60° 設計 vs 実飛行ゲイン — 頑健さの値段、速さの値段

では、実際に飛んでいるゲイン(手動の試行錯誤で磨かれた値)は どんな余裕を持っているのでしょうか。同定モデルで勘定すると:

むだ時間 L交差 \(\omega_c\)位相余裕ゲイン余裕
0 ms76 rad/s67.8°
5 ms76 rad/s46.0°11.5 dB
12 ms76 rad/s15.4°2.8 dB
実飛行ゲイン(roll: \(K_p=9.76\times10^{-4}, T_i=0.7, T_d=0.01\))の余裕勘定。 むだ時間ゼロのモデル上ではちょうど 60° 指針を満たし、むだ時間がそれを食っていく。

興味深いことに、実飛行ゲインはむだ時間を除いたモデル上でほぼ 60°を 満たしています。問題は「レートループが実際に見るむだ時間はいくつか」—— 12 ms(acro 飛行同定の値)が全部ループ内にいるなら PM 15° の綱渡り、 一部がループ外なら余裕はもっとある。実はこの観点での検証はまだ 足りていません。下の実験で、両者の性格の違いを見てください。

条件: ロールレート指令 +3 rad/s のステップ。赤=実飛行ゲイン、 青=自動チューナ既定仕様の設計解(\(\omega_c\)=25 rad/s・PM=60°・L=12ms 前提で 本文のアルゴリズムを解いた \(K_p=2.45\times10^{-4}, T_i=0.4, T_d=0.014\))。 むだ時間スライダーは「モデルのむだ時間が想定からずれたら」の実験。

正直な現状 — 理論と実機の溝: 実は StampFly では、自動チューナのゲインで飛ばすと振動的な挙動が見られ、 現状は手動で試行錯誤した値のほうが良い結果になっています。 60° を狙った設計が実機で振動する——同定の質か、振動などモデル外の ダイナミクスか、むだ時間の見積もりか。原因はまだ特定できておらず、 理論で追い込みたい課題として残っています。 それでもループ整形を学ぶ価値は減りません。 モデルに不確かさがある中で、「最低限成立するところ」まで根拠を 持って追い込める——手動調整の結果を「余裕いくつの場所にいるのか」と 地図の上で語れるだけでも、試行錯誤は当てずっぽうでなくなるのです。

まとめ

ここまでで、姿勢と高度の制御・その設計法・実装の作法が揃いました。 次章(第8章 高度の制御)は執筆済みです——まだの方はそちらへ。 その先は、制御が信じている「測定値」の正体——センサと状態推定の世界です。

本章の対話記録: notes/qa_log.md の Q6-1〜Q6-3。実機実装の出典: stampfly_ecosystem firmware/vehicle(sf_autotune/autotune.cpp・api_task.cpp の autotune コマンド既定値)。余裕勘定・設計解・閉ループ比較は同定モデルによる 本章の計算(プラント: \(b\,e^{-Ls}/(s(Ts+1))\)、第4〜5章の実測値)。