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

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

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