第12章

シャワーに戻ろう

なぜ振動したのか、そしてどれだけ限界に近いのか?

第12章:シャワーに戻ろう ↗

新しい目で見るシャワー

ジューン: ドローンのPIDをシャワーにつけてみた(同じきびきびした感じで、ノブの単位に合わせて)。そしたら熱い、冷たい、熱い…って振れた。第0章のミカとそっくり。ドローンはそんなこと一度もしなかったのに!

テオ: ドローンには大きな遅れがない。シャワーには配管の2.5秒がある。遅れが何をするのか、そろそろちゃんと解き明かそう。

シャワーには遅い部分が2つある。配管、これは純粋な2.5秒の遅れ。そしてなまし(一次遅れ)、これはシャワーヘッドと配管の壁が温まっていくことで、第3章の時定数τ=1\tau = 1 sを持つ(1秒後には、新しい温度までの差の63%を埋める)。

まず、第0章の「普通の手」について白状すると、お湯の具合がどれだけずれているかに比例した速さでノブを回していた。ノブの速さは=k⋅e= k\cdot\err{e}で、1秒あたり1°Cにつきk=0.8 %k = 0.8\,\%だけ回る。偏差に比例した速さということは、ノブの位置は過去の偏差の積み重ね。つまりこれはIコントローラーで、Ki=kK_i = kだ。

ミカ: 待って、じゃあ第0章の私はPIDコントローラーだったの? まあ、Iコントローラーだけど。張り切りすぎのやつ。

遅れとは揺れの遅れ

テオ: 遅れって、ただ全部を遅くするだけだと思うんだけど。何かを不安定にできるはずがないよ。

まず配管の純粋なむだ時間だけを取り出そう。配管の入口にサイン波を入れ、波形がなめらかにならずにシャワーヘッドまで届くと考える。出口の波は同じ形のまま、2.5秒遅れる。その遅れは1周期と比べてどれくらい?

第12章:シャワーに戻ろう ↗

テオ: 待って。5秒周期の揺れだと、ノブが冷たくしてと言ったまさにそのときに熱いお湯が届く。それって遅いんじゃない。逆だよ。

配管の遅れは2.5秒のまま変わらないが、その位相遅れは波がどれだけ速く揺れるかで決まる。遅れの角度をϕ\phi、遅れ時間をLLと呼ぼう。1回の揺れにTT秒かかるなら(ここでのTTは温度ではなく時間)、角速度はω=2π/T\omega=2\pi/Tラジアン毎秒だ。遅れが正なら、出力は入力の後を追う。エンジニアは遅れを負の角度で書くので、下のグラフは下向きに進む。

揺れ1回分は、第5章の回転子のちょうど1回転:360°、つまり2πラジアン。だから大事なのは、遅れが揺れ1回の何割にあたるか、つまりL/TL/Tだ。

ϕ=LT⏟揺れ1回に占める割合⋅360∘=ωL ラジアン,ω=2πT\phi = \underbrace{\frac{L}{T}}_{\text{揺れ1回に占める割合}}\cdot 360^\circ = \omega L \text{ ラジアン},\qquad \omega = \frac{2\pi}{T}

第12章:シャワーに戻ろう ↗

5秒の揺れにとって、2.5秒は揺れの半分:180°だ。この純粋な遅れのモデルでは、出力の山がちょうど入力の谷に重なる。シャワーのなましは速い揺れを小さくもする。それは次に加えよう。

ミカ: つまり同じ2.5秒でも、のんびりした揺れにはちょっとした押し、速い揺れにはまるごとひっくり返し。配管は変わらない。変わるのは揺れのほうなんだ!

シャワーを1揺れずつ測る

次は配管の遅れになましを加えよう。シャワーヘッドと配管の壁は温まるのに時間がかかるので、シャワー全体はノブの変化を遅らせ、しかもならす。計画はこうだ:ノブをある速さで揺らし、リズムが安定するのを待ってから、2つの数を測る:

  • ゲイン(コントローラーのゲインと同じ言葉:出てきた大きさ ÷ 入れた大きさ):温度の揺れが、こちらが求めた混合湯の揺れに比べてどれくらい大きいか。
  • 位相: どれだけ後れているかを角度で表したもの。揺れ1回に占める割合 × 360°。

各測定は2つのプロットに点を落とす。遅いのと速いのを合わせて、少なくとも5つの速さで測ろう。

第12章:シャワーに戻ろう ↗

なましは速い揺れを小さくし、配管は位相遅れを足し続ける。揺れの速さに対するこのゲインと位相の曲線がボード線図だ。2つ合わせたものがシャワーの周波数応答:それぞれの揺れの速さをどう扱うか。ここでの入力は混合湯の温度なので、遅い揺れのゲインは1。ノブの開き具合を入力にすれば、ゲインは45倍になる。式から周波数応答を求めるにはs=iωs = i\omegaとする。第11章の境目を見つけたのと同じ手だ。(これがうまくいくのは、シャワーだけなら安定だから。揺れが一定のリズムに落ち着いて、それを測れるんだ。)

G(iω)=e−iωL1+iωτ,∣G∣=11+ω2τ2,∠G=−arctan⁡(ωτ)−ωLG(i\omega) = \frac{e^{-i\omega L}}{1 + i\omega\tau}, \qquad |G| = \frac{1}{\sqrt{1+\omega^2\tau^2}}, \qquad \angle G = -\arctan(\omega\tau) - \omega L

第12章:シャワーに戻ろう ↗

ジューン: 見つけた! 0.95 rad/sあたりで、シャワーは単独で揺れを上下逆さまにする。この速さを覚えておいて。

崖までどれくらい?

さあループを閉じよう:手 → ノブ → 配管 → 肌 → 手。揺れを1周ずっと追いかける。第0章の手の場合、ループを1周する旅はG∘G_{\circ}だ(ループを表す小さな丸。LLはもう遅れに使っているから):

G∘(s)=ks⏟手⋅45 e−2.5ss+1⏟シャワーG_{\circ}(s) = \underbrace{\frac{k}{s}}_{\text{手}}\cdot\underbrace{\frac{45\,e^{-2.5s}}{s+1}}_{\text{シャワー}}

フィードバックは引き算をする(偏差 = 目標 − 温度)。これは×(−1)、第5章の半回転なので、波は1回ひっくり返る。ループを1周する旅がさらにちょうど180°遅らせると、2回のひっくり返しが打ち消し合って、どの修正も揺れとぴったり同じタイミングで届く。公園のブランコをちょうどいい瞬間に押すようなものだ。ループが波を同じ大きさで返せば(ゲイン1)、揺れは自分で続く。1より大きければ、大きくなっていく。これはまた第10章の1+C P=01 + C\,P = 0で、今度は直線s=iωs = i\omegaの上だ。ひっくり返って同じ大きさで戻ってくる1周は、G∘(iω)=−1G_{\circ}(i\omega) = -1になる。

ジューン: この単純なシャワーのループでは、位相が−180°を通過する揺れの速さが1つある。位相のグラフでその速さを見つけ、同じ速さでのループゲインをゲインのグラフで読み取ろう。それは1より下か、上か?

第12章:シャワーに戻ろう ↗

合計が180°を超えるまで動かしてみよう。0.45と0.46 rad/sの間だ。ちょうど交わる約0.457 rad/sでは、揺れは0.72倍の大きさで戻ってくる。だから手は崖っぷちに届くまでに、約1 ÷ 0.72 ≈ 1.4倍強くできる。

新しい言葉

ゲイン余裕
−180°の速さでループゲインが1に達するまで、コントローラーのゲインを何倍にできるか。1未満なら崖の向こうだ。
位相余裕
ループゲインがちょうど1になる速さで、−180°に届くまでにあとどれだけ余分な遅れがあってよいか。大きいほど安全。よくある目標は45°–60°(下の寄り道でその理由がわかる)。

私たちのシャワーでは、G∘G_{\circ}の位相が−180°になるのはω≈0.457\omega \approx 0.457 rad/s、揺れの周期にして約13.8 s。普通の手(k=0.008k = 0.008)のゲイン余裕はわずか約1.4、位相余裕は約22°(ループゲインが1になる0.34 rad/sで、位相は−158°)。崖っぷちすれすれだ! 強い手はゲインを2倍にする:1.4 ÷ 2 = 0.7、崖の向こう。だから決して落ち着かなかったんだ。

まず予想しよう! 配管が2倍の長さだったら(5秒の遅れ)どうなる? 安定に保てる手のゲインの最大値は?

第12章:シャワーに戻ろう ↗

第12章:シャワーに戻ろう ↗

ミカ: 配管が2倍なら、手はだいたい半分。しかも限界での揺れも遅くなる:24秒近く!

テオ: わかった、前言撤回。遅れは物事を遅くするだけじゃない。位相余裕を食いつぶす。そして位相余裕は、僕らと振動の間にある唯一のものなんだ。

君の第0章のシャワーを解説しよう

これが第0章での君自身の記録だ。もし振動が限界に近かったなら、その周期はループが予測する値に近いはずだ。ここでひとつひねりがある:人間はみんな同じ種類のコントローラーではない。

第12章:シャワーに戻ろう ↗

速さの手(ずれていると感じる間、ノブを回し続ける)はIコントローラーだ。その限界は13.8 sの揺れ。位置の手(「熱すぎる、ノブはここ」)はPコントローラーのように働く:G∘(s)=45K e−2.5s/(s+1)G_{\circ}(s) = 45K\,e^{-2.5s}/(s+1)。位置の手には積み重ねがないので、自前の90°もない。配管となましだけで180°に届かないといけないので、それはもっと速い揺れ、ω≈0.95\omega \approx 0.95 rad/s(ジューンの上下逆さまの速さ)で起きる。つまり6.6 sの揺れで、約0.031(ノブ/°C)を超えるどんなKKでもそうなる。たいていの人はその中間だ。(普通のロボットの手は13.8 sより少し遅い約15.5 sで揺れる。限界のすぐ内側にいるからだ。強い手の揺れ、約11.6 sは、ノブが端にぶつかることでつぶされている。)

第12章:シャワーに戻ろう ↗

ミカ: じゃあ、ノブをある位置までぐいっと回したとき、私は位置の手だったんだ。6秒の揺れは配管となましのせいで、不器用な指のせいじゃなかった。

ロボットシャワーを設計しよう

さあ、自分たちの手を超えよう。ロボットはPIを使う:Pは今の温度の偏差に反応し、Iは積み重なった偏差を覚えている。2つ合わせると、ノブはすぐに反応しつつ、Iがずっと続くちょうどいい位置を見つけてくれる。

ジューン: 簡単。ドローンのときみたいに大きなゲインを使えばいい。速くてきびきび。もう設定してあるよ。見てて!

第12章:シャワーに戻ろう ↗

ジューン: …ハンチングしてる。熱い–冷たい–熱い、6秒ごとに。第0章の位置の手みたいに。大きなゲインで、ゲイン1の速さが−180°の速さを追い越しちゃった。位相余裕がまったくない。

テオ: ドローンが大きなゲインに耐えられたのは、遅れがほとんどなかったから。ここでロバストとはやさしいこと:遅れのために余裕を残しておく。僕のやさしいゲイン、だいたいKp≈1K_p \approx 1とKi≈0.6K_i \approx 0.6を試してみて。

Pは今に、Iは積み重ねに反応する。今を少し足すとノブが少し早く動き、位相が戻ってくる:位相進みだ。テオのゲインでは、元の−180°の速さで約37°。

余裕のあるPIなら、約9.4秒で快適になる。大きな揺れを繰り返すこともない。普通の手(1分の大半を揺れに費やしてから落ち着いた)やほとんどの人間より速い。でも物理には勝てない。まだ届いていないお湯には何も反応できないからね。長い遅れにはエンジニアの技がある。スミス予測器といって、配管の小さなシミュレーションをコントローラーの中で走らせるんだ。それはまた別のノートの話。

本当の教訓はロバスト性だ。シャワーのモデルは決して完璧じゃない。配管はもっと長いかもしれないし、ヒーターはもっと弱いかもしれない。余裕は、モデルがどれだけ間違っていてもいいかを、実感できる数字で教えてくれる。位相余裕(ラジアン)をゲイン1の速さで割ったものが遅れ余裕:ループが耐えられる余分な配管の秒数だ。

第12章:シャワーに戻ろう ↗

テオ: 普通の手が耐えられる余分な配管は約1.1秒だけ。僕のやさしいロボットは3.5秒耐える。ロバストってそういうことなんだ。

ここまででわかったこと

わかったこと

  • 遅れLLは揺れをωL\omega Lだけ遅らせる。遅い揺れにはゼロ、速い揺れにはたくさん。
  • 積み重ね(I)はどの揺れも90°遅らせる。なましは最大90°まで。配管はωL\omega Lで、限りなく。
  • 正弦波を入れてゲインと位相を測ると周波数応答が得られる。プロットするとボード線図で、これはただのG(iω)G(i\omega)だ。
  • この単純なシャワーのループでは、ループがゲイン1で−180°の位相に達すると自励振動が始まる。ゲインが大きいほど揺れは限界が介入するまで成長する。
  • ゲイン余裕と位相余裕はその崖までの距離を測る。遅れが長いほど余裕は減るので、制御はおだやかにする必要がある。
  • 第0章の揺れは、余裕が足りないコントローラー(つまり私たち)だった。

これで道具は全部そろった。フィードバック、PID、極、余裕。いよいよ実戦だ。風、荷物の落下、そしてノイズだらけのセンサー。ドローンを2 mに保てるか?

第12章:シャワーに戻ろう ↗