はじめに
前回の続き。
PID制御での、疑問点は、どうやってP,I,Dのゲイン値を求めるかということだ。
これについて、twiddle(いじり回し)アルゴリズムというのがあり、PIDのゲイン値の最適解が簡単に求まるらしい。
日本語の情報はおろか、英語の情報もなく、あるのは、AI for Roboticsの Forumの投稿記事くらいなので、どっからでてきたアルゴリズムなのかわからないけれども、スラン先生曰く、これは簡単に実装できて、とても強力、だそうだ。
アルゴリズム
- 講義動画
- スラン先生の板書。
ちょっと板書が汚いので、清書。
- p = [0, 0, 0], dp = [1, 1, 1] で初期化する。
- シミュレーションを実行して、best_error を求める。
- while: sum(dp) > (しきい値)
- for i in (パラメータ数)
- p[i] += dp[i]
- シミュレーションを実行して、error を求める。
- if error が best_error よりも小さい
- best_error = error
- dp[i] = dp[i] * 1.1
- else
- p[i] = p[i] - 2*dp[i]
- シミュレーションを実行して error を求める。
- if error が best_errorよりも小さい
- best_error = error
- dp[i] = dp[i] * 1.0
- else
- p[i] = p[i] + dp[i]
- d[i] = d[i] * 0.9
- for i in (パラメータ数)
実装
前回と同じ、Afrel 楕円コースでのPID制御を用いた軌道走行を考える。