
3軸姿勢制御モジュールの自作です。前回1軸倒立まで完了したのですが、気になる所があったので少し制御プログラムを見直しました。
概要

前回の倒立時の様子です。モーター高速回転が続く感じです。1号機の時も割と高速回転だったのが気になっていたので今回はここをもう少し低速になるように改良してみました。
PID制御
制御部分を見直します。
P[0] = targetOmega[0] - gyroX;
I[0] += P[0] * period * 1e-6;
I[0] = constrain(I[0], -3, 3);
D[0] = gyroX - preP[0];
preP[0] = gyroX;
PID[0] = Kp * P[0] + Ki * I[0] - Kd * D[0];
見直す前の制御部分の抜粋。角速度のPID制御です。積分項がどうも飽和して回転数が落ち着かない感じ?、、またよくよく考えると角度PD制御と角速度PI制御って実質やってること同じ気もする。
偏差の積分で変なノイズを蓄積していくくらいなら、直接角度を入力した方が良さそう。ということで、
P[0] = targetOmega[0] - gyroX;
I[0] = angle[0];
D[0] = gyroX - preP[0];
preP[0] = gyroX;
PID[0] = Kp * P[0] + Ki * I[0] - Kd * D[0];
積分項にモジュール角度を直接入力するように改修。結論からいうとこの改修がモーター回転数の抑制に一番効いてました。
モニター画面の追加
あと作業効率化のため、慣性センサーの情報や各種パラメの調整をリアルタイムで出来るように改良。

各種情報モニターしつつ、パラメーターもパソコンから調整できるよう改修。調整するたびマイコンに書き込みを行わなくていいので各段に作業効率が向上します。また制御しながらパラメーターを弄れるので調整もだいぶ楽になります。通信はPicoWのBluetoothSPPを使用。
このあとは、パラメーターの調整、センサー校正をひたすら地道に実施。その結果です。
オーバーシュートがあって回転が落ち着くまでに少し時間が掛かりますがこれくらいで妥協しました。というかこれ以上調整できませんでした。安定倒立時の回転はだいぶ抑えられてると思います。
結局今回も回転数をフィードバックに使えずじまい。角度(角速度)情報のみで制御してます。回転数を制御に入れ込むとどうしてもなぜか逆に不安定になってしまう。
コメント