以下で作成した倒立振子、
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