はじめに

前回の続き。

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

実装

前回と同じ、Afrel 楕円コースでのPID制御を用いた軌道走行を考える。