ガジェット・家電

生成AIのみでPID制御プログラムを作成する

PIDパラメータチューニング・最適化

最後に各定数を最適化してもらいます。最適な数値は系によって異なるため、データを渡して、最適な制御パラメータは?というのを聞いていく作業をデータ毎にやる形になります。先程作成したシミュレータを改良して、最適化機能を追加してもらいます。

学校でも習うジーグラ・ニコルス限界感度法が提案されました。今のところ安心そうです。更にコードを観て行くと、実用用途で使われる多くのPIDコントローラに実装されているオートチューナーに用いられているCohenCoon法を提案してきました。

引用:https://www.ni.com/docs/ja-JP/bundle/labview/page/cohen-coon-autotuning-method.html?srsltid=AfmBOopzn8ZkYYrhwBi-mCo3ojmYCLyLzlXwdSW1j4Jh6O2pwTFj6ZlQ

正直、これを見た瞬間、あ、、、負けたな。。。と思いました。まじめに勉強していますね。Claudeくん。凄い!

(*なお、この古典的な推定方法には実はひとつエラーがあります!鵜呑み注意!)

古典的な最適化方法が提案されたことで、後は細かいバグに注意するのみですが、更にコードを見てくと、追加の指示を何も与えていないにも関わらず、更なる最適化手法として総当たり方式のグリッドサーチも実装されています。

Claudeの可能性を信じて、更なる限界に挑戦します。scikit-optimizeを用いてgrid search(グリッドサーチ), L-BFGS法, Bayesian(ベイズ最適化)の三種類の最適化の実装を依頼しました。なんと700行を超えるコードがプロンプトのみで作れてしまいました。

動作確認のために、まずは確実性の高いグリッドサーチ総当たり方式で実行してみましょう。

それなりに良さそうな最適化をしてくれました!素晴らしいですね。しかしこのままでは目的にあった微調整ができません。

あー,,,概ね良いんだけど、オーバーシュートが少し大きすぎて、精度は犠牲にしてもいいからもう少しオーバーシュートを減らしたいんだけど…

よくこのような課題に直面することもあるかと思います。制御あるあるのトレードオフですね。そこで、オーバーシュートのリミットを設けてみることにします。ここでは少し意地悪をして、許容オーバーシュート10%という制限をかけてみました。

結果は解なしで、なるべくオーバーシュートを小さくしたパラメータが提案されました!計算を諦めてしまった理由は、古典的な制御理論では、周波数毎にパラメータが変わるようなシステムでないとステップ入力に対しては成立解がないためです(KDを巨大にすればありますが、後述の通り、制御力のリミットが設けられています)。そのような状況でも十分頑張ってくれたのではないでしょうか?

凄すぎる!プロンプトだけでここまで作れるなんて…もう人間の時代は終わってしまうのか…!?

相変わらず各定数はコード内で指定するままですが、この部分は専門知識ゼロですぐに作れることが分かっているので、省略します。同様にL-BFGS法でも最適化を試みます。

応答性は良いものの、収束しないパラメータとなってしまいました。筆者もこの手法についての知識はほとんどないため、こういうものかな?と割り切って一旦次に進みます。

最後にベイズ最適化で同じ作業をしてもらいます。各最適化手法による所要時間も計算してもらうため、一文追加をします。

わーーー!!!!??計算が早いだけじゃなくて、精度も上がってる!こんなコードを瞬時に..!?凄い!私が頑張ってチューニングするよりも強い気がする…

グリッドサーチについては、グリッド解像度と実行時間の制約もあるから、無限に時間をかければより高精度なパラメータを得ることもできそうだけど、今回のClaudeの推奨設定で実行すると、ベイズ最適化がすべてにおいて最強の結果になったわね。

非常に短時間で高性能なチューニングが達成されました!凄いですね。。。各手法による性能メトリクスは下記の通りです:

グリッドサーチ
  1. 最適化時間:38.2s
  2. エラー:72%
  3. 応答遅れ:0.7s
  4. 収束時間:4.1s

L-BFGS法 (収束せず)
  1. 最適化時間:19.5s
  2. エラー:129%
  3. 応答遅れ:X (収束していないため)
  4. 収束時間: X

ベイズ最適化
  1. 最適化時間:1.4s
  2. エラー:72%
  3. 応答遅れ:0.3s
  4. 収束時間: 5.8s

最後に、メトリクスのObjective Scoreとして出力されているスコアは、下記のようなパラメーターに重みづけをして、トータルで最適なスコアを目指すロジックの結果になります。この辺りも筆者が指示したわけでなく、経験則から勝手に判断してイニシャル値を決めてきているので、脱帽するばかりです。

  1. システム応答性
  2. 収束時間
  3. オーバーシュート量
  4. エラー
  5. 制御力要求

特に物理的な系の場合、サーボの動作速度などの制限によって、制御力に限界がある場合も多いです。より現実に則したパラメーターを反映可能な点がAIの優秀さを物語っています。

地味にコードの至るところにエラー検出やロバスト性アップの配慮もあり、筆者が書くコードなんかよりまともっぽく見えてしまいます。

入力ファイルのヘッダー定義がバラバラだったりやUI周りなど、まだブラシュアップは必要ですが、本質でない枝葉の部分は、簡単に達成可能なのは分かって頂けたと思います。機能面ではほぼ”生成AIのみでPID制御器が作れた”と言えるのではないでしょうか!?

果たしてこれが本当に最適か?という点については吟味が必要だけれど、少なくとも素人がチューニングするよりかは高速でまともに使えそうな結果が得られたね!

勘のいい人は気づいたと思うけど、ベイズ最適化では恐らく正しくパラメータチューニングできているものの、CohenCoon法で出てきたパラメータは明らかに最適とは程遠く、理論式から乖離していることが分かるよ。
一見万能に見えて、このような落とし穴があるから、理論解や解析解が存在する場合は必ずクロスチェックをしよう!

負荷テスト

これまで、作成したプログラムではステップ入力のような比較的簡単な信号でしか適用していません。しかし実用ユースとなってくるとノイズや複雑信号などより難易度は上がります。そこで、とある機械のロギングデータから得られた実ケースに対して適用ができるか試してみましょう。多岐の周波数に渡って運転停止、周波数変動が存在する回転機にありがちな信号の事例を用いています。

Identify2ndOrder.pyよりおおよそのK、τ、ζを取得します。ロギング周波数よりも高い時定数を検出することは難しいため、エイリアシングが発生しており、誤検知している可能性が高いです。

さすがにここまでノイジーで不規則な信号だと人間の介入なしでは難しいようです。現物の系を知っている人でないと判別は難しいのですが、マス等の諸元から0.28sとしておきました。
全く不明な時は周波数を段階的に固定してPSD線図を作って確認してみましょう。

ベイズ最適化にて制御パラメータのチューニングに挑みます。さすがに一度では収束せず、131sかけてようやく落ち着きました。元々の信号がかなり汚いにも関わらず、このように結果に辿り着くことができ、いかに生成AIが強力であるかが分かりました。

なんとか解にたどり着いたみたいね。ある程度制御の知識は必要にはなってくるけれど、実用ユースでも強力にアシストをしてくれるツールにはなっているみたい!
データが悪くても強いLPFをかけて綺麗にしてあげるとより良い結果が得られそうね。

完成したツール

今回生成したプログラムは下記の通りです!最終成果物をgithubに上げているので、興味のある方は試してみてくださいね。

  1. 信号生成用コード:Random2ndOrderFunc.py
  2. 信号解析用コード:Identify2ndOrder.py
  3. PIDシミュレーター:PID_SIL_Sim.py
  4. PIDパラメータ最適化プログラム:PID_Optimize_bayesian.py

https://github.com/Gertrud-Violett/SharedTools/tree/main/AIgen_PID_Controller

最後に

今回は生成AIのみを使ってPID制御を実現する、という挑戦を行ってみましたが、紆余曲折を経て無事にそれなりに”一応動く”プログラムが完成しました。

制御の専門家やプログラミングの専門家から見ればまだまだ幼稚な内容で、実務に使えるかどうかは疑問ですが、少なくともほぼ素人がプロンプトのみでここまで生成できたのは驚異的だと筆者は考えています。最終製品ではなく、PoCや自宅での個人プロジェクトで使う分にはほとんど問題のないレベルに達していると言えます。近年のAIの発展は凄まじいものがあります。。。

最後に忘れていました。アイキャッチ画像もGrokに作ってもらいましょう。

まとめ

  1. 生成AIのみで初歩的なPID制御のプログラムが作れたよ
  2. 最近の生成AIは凄くて、業務でも強力なツールとなるよ
  3. AIに仕事を奪われることは現段階ではまだ無さそう
  4. むしろやれることが増える=仕事が増える…?かも!

ちなみに、マイコンにこのようなロジックを実装するためにC/C#文法を書いてもらう、というのは既にChatGPT3でも実用レベルなので、今回の内容に比べると格段に楽に生成してもらえます。ネット上に無数に記事もあるので、挑戦してみましょう!
私はもう生成AIがないと何も仕事ができません。。。

万能感のある生成AIだけれど、今回の記事のように現段階ではまだ人間が誘導してあげる必要はあるわ。AIとの付き合い方は優秀な(だけど実務はまだ知らない)新入社員だと思って、適切に指示してあげること、結果をしっかりとレビューしてあげることが何より重要になってきそうだね。

これからどんどん日常生活でも利用シーンが増えてくるAIですが、下記のことを注意しながらうまく活用していけると良いですね!今回も読んで頂きありがとうございました!

注意点

・生成AIの回答は間違っていることもあるので必ず検証しよう
・理論的なバックグラウンドがない状態での利用は時には危険!
 AIに頼り切るだけでなく、理論、基礎もしっかり勉強しよう
・プロンプトの回数やアップロード/生成できるデータ容量には
 制限があるから、気をつけよう!

とんでもな回答が出て来たり、ヒヤッとすることもあったが、新人にはよくあること。優秀な中堅社員が見てくれていたらまず安心そうだな。わしの会社でも全面導入していくぞー!AI万歳!

参考図書・引用一覧

https://www.sciencedirect.com/science/article/pii/S0098135423000807

https://scholar.google.co.jp/scholar_url?url=https://scholar.archive.org/work/zxqidyida5ag5n75vsbwoevg74/access/wayback/https://www.jstage.jst.go.jp/article/sicetr1965/34/7/34_7_653/_pdf&hl=ja&sa=X&ei=KM7OZ6SYL4C96rQPkZbxiA0&scisig=AFWwaeYG1Uj05ua3-VauYDKy_Bn4&oi=scholarr

https://www.jstage.jst.go.jp/article/jacc/59/0/59_901/_article/-char/ja

https://www.ecei.tohoku.ac.jp/hariyama/lecture/control/control-04.pdf

https://www.ni.com/docs/ja-JP/bundle/labview/page/cohen-coon-autotuning-method.html?srsltid=AfmBOopzn8ZkYYrhwBi-mCo3ojmYCLyLzlXwdSW1j4Jh6O2pwTFj6ZlQ

https://www.heat-tech.biz/products-nh/nh-gj/nph-gj-ocn/nph-gj-ocn-cp/398.html

1 2
ABOUT ME
Trude (まきブロ管理人)
多くの人に機械工学の面白さやエンジニアリングの楽しさを知ってもらうべく、解説や紹介記事を発信しています。
RELATED POST

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です