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

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

PD制御を用いた3次元フライホイール倒立振子を製作しました。

1. 回路

HomeMadeGarbageさんのものを使わせていただいています。

マイコンESP32
IMUMPU-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)+k3k1i=0ux(i)

uy(k)=k1ˆθy(k)+k2ˆωy(k)+k3k1i=0uy(i)

uz(k)=0

k1,k2,k3はゲインです。姿勢角ˆθx,ˆθyとその角速度ˆωx,ˆωyは定常カルマンフィルタによって推定しています。とりあえず倒立できればいいので,uz=0としています。

3.2 入力分配

入力ux,uy,uzを3つのホイールに分配します。センサ座標系xyzでの入力ux,uy,uzをホイール座標xyzでの各ホイールの入力ux,uy,uzに分配します。

まず,センサ座標系xyzとホイール座標系xyzを一致させる回転行列Rを考えます。

[xyz]=R[xyz]

zとなっているのは,ホイール座標が左手座標系になっていたためです。考えやすいようにz軸を反転して,右手座標系で統一します。

この回転は,y軸周りにβ=π2cos113回転した後, 回転後のx軸周りにα=π4回転させるものになります。

R=RxRy

Rx=[1000cosαsinα0sinαcosα],Ry=[cosβ0sinβ010sinβ0cosβ]

この回転行列からux,uy,uzを求めます。

[uxuyuz]=R[uxuyuz]

より,

ux=26ux13uz

uy=16ux+12uy13uz

uz=16ux12uy13uz

としてホイールに入力します。

制御周期10 ms程度で制御しています。

4. Kalman Filter

用いたIMUであるMPU-6050は6軸センサなので,加速度と角速度を取得できます。

まず,加速度から直接θx, θyを求めます。

θx=tan1aya2x+a2z,θy=tan1axa2y+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
θk=[10][θkωbias,k]

となり,以下のように表現します。

xk+1=Axk+Buk+vk

yk=Cxk+wk

vk, wkはそれぞれシステム雑音と観測雑音です。 このシステムに対してKalman Filterを適用します。

予測ステップで事前状態推定値ˆxkと事前誤差共分散行列Pkを更新します。Pk1は事後誤差共分散行列,Vはシステム雑音の共分散行列です。

ˆxk=Aˆxk1+Buk1
Pk=APk1AT+V

フィルタリングステップではカルマンゲインGk,状態推定値ˆxk,事後誤差共分散行列Pkを更新します。 Wは観測雑音の共分散行列です。

Gk=PkCTCPkCT+W
ˆxk=ˆxk+Gk{ykCˆxk}
Pk=(IGkC)Pk

推定したˆxkからˆθkˆωk=ωkˆωbias,kが求まります。

5. 実験結果

ゲインの調整がなかなか難しく,ふらつきがみられます。 ダイナミクスを考えずに瞬間的な入力を考えたので,その影響があるかもしれません。