PD制御を用いた3次元倒立振子の製作

PD制御を用いた3次元フライホイール倒立振子を製作しました。
1. 回路
HomeMadeGarbageさんのものを使わせていただいています。
マイコン | ESP32 |
IMU | MPU-6050 |
モータ | BLDC × 3 |
電源 | ACアダプタ 24V 5A |
BLDCはAmazonで購入したものです。入力のPWMにおよそ比例して速度が出力されます。 プログラムも販売されていますが,一部のピン設定を除きC++で1から書きました。
2. 機体
ReM-RCさんのものを使わせていただいています。
3. 制御
3.1 PD制御
倒立状態からのx軸周りの傾き角とその角速度をθx,ωxとし,y軸についても同様にθy,ωyとします。
HomeMadeGarbageさんとReM-RCさんの倒立振子とはセンサーの位置を変えて,頂点で倒立時にセンサのxy平面が地面と水平(θx=0,θy=0)になるようにしています。
まずは,このセンサ座標系における入力uを考えます。 PD制御に加え,入力の積分値をフィードバックします。 入力の積分値を考慮することで,ホイールの速度が大きくなりすぎないようにしています。
ux(k)=k1ˆθx(k)+k2ˆωx(k)+k3k−1∑i=0ux(i)
uy(k)=k1ˆθy(k)+k2ˆωy(k)+k3k−1∑i=0uy(i)
uz(k)=0
k1,k2,k3はゲインです。姿勢角ˆθx,ˆθyとその角速度ˆωx,ˆωyは定常カルマンフィルタによって推定しています。とりあえず倒立できればいいので,uz=0としています。
3.2 入力分配
入力ux,uy,uzを3つのホイールに分配します。センサ座標系xyzでの入力ux,uy,uzをホイール座標x′y′z′での各ホイールの入力u′x,u′y,u′zに分配します。
まず,センサ座標系xyzとホイール座標系x′y′z′を一致させる回転行列Rを考えます。
[x′y′−z′]=R[xyz]−z′となっているのは,ホイール座標が左手座標系になっていたためです。考えやすいようにz軸を反転して,右手座標系で統一します。
この回転は,y軸周りにβ=π2−cos−11√3回転した後, 回転後のx′軸周りにα=−π4回転させるものになります。
R=RxRy

この回転行列からu′x,u′y,u′zを求めます。
[u′xu′y−u′z]=R[uxuyuz]より,
u′x=2√6ux−1√3uz
u′y=−1√6ux+1√2uy−1√3uz
u′z=−1√6ux−1√2uy−1√3uz
としてホイールに入力します。
制御周期10 ms程度で制御しています。
4. Kalman Filter
用いたIMUであるMPU-6050は6軸センサなので,加速度と角速度を取得できます。
まず,加速度から直接θx, θyを求めます。
θx=tan−1ay√a2x+a2z,θy=tan−1ax√a2y+a2z差分方程式は,角速度と組み合わせて以下のようになります。
θk+1=θk+(ωk−ωbias,k)Δt,ωbias,k+1=ωbias,k
状態方程式で表現すると,
[θk+1ωbias,k+1]=[1−Δt01][θkωbias,k]+[Δt0]ωkとなり,以下のように表現します。
xk+1=Axk+Buk+vk
yk=Cxk+wk
vk, wkはそれぞれシステム雑音と観測雑音です。 このシステムに対してKalman Filterを適用します。
予測ステップで事前状態推定値ˆx−kと事前誤差共分散行列P−kを更新します。Pk−1は事後誤差共分散行列,Vはシステム雑音の共分散行列です。
ˆx−k=Aˆxk−1+Buk−1フィルタリングステップではカルマンゲインGk,状態推定値ˆxk,事後誤差共分散行列Pkを更新します。 Wは観測雑音の共分散行列です。
Gk=P−kCTCP−kCT+W推定したˆxkからˆθkとˆωk=ωk−ˆωbias,kが求まります。
5. 実験結果
ゲインの調整がなかなか難しく,ふらつきがみられます。 ダイナミクスを考えずに瞬間的な入力を考えたので,その影響があるかもしれません。