この記事は Stormworks 第1 Advent Calendar 2024 15 日目の記事です。
はじめに
Stormworks は vehicle の制御、船舶でいえばエンジンの制御、速度の制御、進行方向の制御など、ほぼすべての操作をプレイヤーの手で行う必要があります。また、この制御にかかわる機構の作成をプレイヤーが行う必要があります。 すべてをスロットルレバーやボタン等で行うこともできますがかなり負担が高いです。 この負担を減らすために、マイコン等のロジックを用い自動化します。
この記事では、制限付I制御を用いた制御においてのパラメーター調整をある程度自動化した時の記録になります。
PID 制御に用いるパラメーター調整
制御対象を目標値に向けて制御するとき、とりあえず PID をつけることで、あまり複雑なことを考えずともそれっぽく制御できます。 PID はその名の通り 比例ゲイン(P ゲイン)、積分ゲイン(I ゲイン)、微分ゲイン(D ゲイン)の3つのパラメーター調整を適切に調整する必要があります。 調整の方法には 限界感度法や職人の経験や勘に頼った調整があります。 (筆者はこの時は大体この値にしとけばとりあえず安定するやろ的な雑な経験や勘に頼った調整をよくします。)
これらのパラメーターの調整は、一度システムを定常状態に置いたのち、ある目標値に対して制御した時の応答を評価することを繰り返すことで調整されます。 基本となる P ゲインを設定したのち、D ゲインの調整で振動を抑制し、最後に I ゲインを調整して定常偏差を減らすというのを繰り返して最終的なパラメーターを決定するのが基本的な調整法で用いられます。
ここでは、制限付I制御 を用い、実質的に調整するパラメーターを1つにすることで調整項目を減らし、調整の手間を減らします。 さらにこのパラメーター調整をある程度自動化することで、調整の手間を軽減させることを目指します。 制限付I制御について動画を参照してください。 【Stormworks】積分飽和のないI制御器とその使用法【ゆっくりけんきうしつ 第3部】
制限付I制御におけるパラメーター調整
制限付I制御では、Iゲイン、先読みゲインの2つのパラメーターが調整対象になります。 大まかな調整手順は以下のようになります。
- 先読みゲインを0にし、Iゲインを調整し、出力上限、下限にぶつからない程度の値を探す。
- で見つけた I ゲインを設定し、あるステップ目標値に対する応答を見つつ、先読みゲインを調整する
I ゲインに関してはステップ目標値に対しての応答を見ずとも、目標値付近での振動しているときの振幅を見ることで調整できます。 I ゲインはある程度あっていれば良いので、おおざっぱに手動調整で決定します。(先読みゲインの調整に比べれば簡単)
先読みゲインに関してはステップ目標値に対しての応答を見る必要があります。 エンジン制御でいえば、一度アイドル状態で安定させた状態で先読みゲインを設定し、その後目標値を設定してその応答を見ることが必要になります。 オーバーシュートすれば先読みゲインを増やし、逆に目標値までに到達する時間が長ければ減らすなどの調整を繰り返します。
この先読みゲインの調整をある程度自動化することで省力化します。
調整の自動化
最適な先読みゲインを、目標値に素早く追従し、できるだけ振動をしていないときの値とします。 今回はどの程度最適な値なのかを、標準偏差が小さいことと、目標値と制御値の平均値の2乗が小さいこと、と仮定しこれを評価関数とします。 (今回は雑に評価関数を設定していますが、この評価関数が適切でない場合最適値を求めることはできません。) この評価関数が最も小さい値を求めることで、最適な先読みゲインを得ることができます。
これらが最小になる値を雑に求めるために、今回は最急降下法を使って求めます。 最急降下法はある関数の最小値を求めるアルゴリズムの1つです。 詳細は省きますが、雑にいうとある地点からでの接線の傾きが小さい方向に少しづつ移動することを繰り返し、接線の傾きが0になる地点を求めるものです。 今回は接線の傾きに相当する値を、ある基準値からごく小さい値ずらした2点の差分をとることで疑似的に求めます。
ある先読みゲインを設定した際の、ごく小さい値ずらした2点の挙動を計測し、それぞれの評価関数の差が小さくなるように繰り返して計測することで、おおよそ最適値と呼べる値を得ようという作戦です。
実験する
今回はジェットエンジンのパラメーターを調整してみます。 RPS を 制限付I制御によって制御しており、この時の先読みゲインを調整します。 Iゲインは 0.005 目標 RPSは 20 とし、変化量が 0.0001 以下になったら完了としています。
システム全体像
以下の手順で調整するようにマイコンを作成しました。
- 起動
- 定常状態になるまで待機
- 調整値 + d を先読みゲインとし、計測
- 定常状態になるまで待機
- 設定値 - d を先読みゲインとし、計測
- および 5. の結果の差分をとり、次の設定値を計算する
- 変化量が小さくなるまで 2. から 6. を繰り返す。
調整中の様子
下画面に調整時のパラメータを表示している。
赤いラインが設定したRPS、黄色いラインが記録したRPSを示している
開始直後
終了時
若干オーバーシュートしているが、開始直後よりも素早く定常状態に落ち着いている
まとめ
今回は制限付I制御のパラメーターをある程度自動化するシステムを構築しました。 すべてのシステムにそのまま適用できるわけではないですが、作製したモジュラーエンジンや負荷状況によって最適なパラメーターの調整をある程度省力化できるようになります。 また、初期設定だけすれば放置するだけで調整できるため、調整中にほかの作業も行えます。(ストワ内での作業はできませんが。。)
今後の展望として、複数のRPSに対しても調整することで、RPSごとに最適な先読みゲインを自動で調整することができるのではないかと考えます。