倒立振子のループ時間が変わるとパラメータも修正必要

以下で作成した倒立振子、

https://isehara-3lv.sakura.ne.jp/blog/2022/12/30/倒立振子(pi制御でハンチングなくした)/

Wi-Fi環境無いところのために、Wi-Fi関連の処理(Pose情報をudpで送信)を削除すると、PIDパラメータの最適値が変わってきます。

モーターの駆動力を計算しているところをloop処理から切り出すと以下のような処理ですが、

  // calc motor power
  float Duty, P, D, now, dt, Time;
  now = TARGET - roll_data;    // calc delta
  if (-25 < now && now < 25) { if (abs(now) >= 0){
      Time = micros();
      dt = (Time - preTime)/1000000;
      preTime = Time;
      P = now/90; // (-90~90) → (-1.0~1.0)
      I += P*dt;
      D = (P - preP)/dt;
      preP = P;
      power = P_val * P + I_val * I + D_val * D;
      //Serial.println(power);
      if (power < -1) power = -1;    // limit the max value
      if (1 < power)  power = 1; 
      if (power < 0){
        dir = 1;
      }else{
        dir = -1;
        }               // set forward/reverse
    }

時間で正規化されてるわけでも無いから、powerの値そのものが変動してしまうからでしょう。

電池電圧変動でも同じpower指定しても実際のモーター駆動力は変化して、調整点がズレるのと似ていると言えば似ているかもしれません。

 

admin

倒立振子(PI制御でハンチングなくした)

P制御だけだと、どうしてもハンチング(オーバーシュート)が発生してしまいますが、I制御を追加することでそれを抑止できます。

D係数は外乱対応とのことですが、調整方法を理解していないので後日触りますが、とりあえずの目標の静止状態は作ることができました。

スピーカーから盛大にノイズが出てますが、これはスピーカー制御端子(25)をモーター制御に使っているから。逆にこういうノイズが出ているときには静止状態であると言えます。

設計データは以下のリンクへ、

https://github.com/chateight/reversed_pendulum

パラメータ(PID)調整はリコンパイルでは時間の無駄なので、Processingを使って動作中に書き換えできるようにしています。

admin

バランスロボット

二輪で、本体の傾きをセンスしてバランスをとりながら倒れないように制御するロボット(倒立振子というらしい)ですが、イメージとしては秋田の竿燈みたいなものか。竿燈は二次元の制御だけど、二輪ロボットは一軸制御だから制御は相対的には楽そうに見えます。

回転モーメントが大きいほど、つまり高さ方向が長いほどフィードバック時間に余裕がありそうに思えますね。

原理は、

https://matome.eternalcollegest.com/post-2136401209031725401

完成品としては、

https://docs.m5stack.com/en/app/bala2fire

や、

https://www.switch-science.com/products/8297

あたりがありそうですが、M5stack使って自作するというのもありそうです。

例えばこれとか、

https://maker.pro/arduino/projects/build-arduino-self-balancing-robot

PID制御はカットアンドトライでパラメータを決めるのが現実らしい。PIDライブラリというのがArduinoには用意されていて、Arduino IDEのライブラリで検索するとたくさん出てきます。

 

admin