
リアクションホイール(フライホイール)による1軸の倒立振子が完成しました。
安定倒立する角度をフィードバック制御することで倒立点を自動で調整してます。なので少しくらい角度センサー自身が傾いてたり、筐体の歪みや継続的な外乱があったりしても自動でバランスポイントを調整して倒立します。今回はここまでの作成過程を一気に紹介します。
ハード構成
筐体

骨組みはアルミフレームを使用。フライホイールやモータ固定のブラケット類などは3Dプリンタで作成してます。
マイコン/電流センサ

制御にはESP32モジュールを使用。電圧/電流センサ(INA219)も配線したのですが、最終的に制御には使用しませんでした。
慣性センサ(MPU6050)

本体の角度検出に6軸慣性センサー(MPU6050)を使用。
モータ

使用するモータはブラシレスDCモータ。このモータは駆動ドライバとエンコーダが内蔵されてるので便利です。
まずは振り子運動でテスト
倒立はいろいろと難しそうなのでまずは振り子状態で検証していきます。
筐体を少し改造

振り子状態にしてまずは自由振動を減衰させる制御を行っていろいろと検証を行いました。倒立も振り子もある程度の動きは同じだろうとの見込み。
無負荷での振り子運動
無負荷での単純な振り子の運動。

手で15°程傾けて離した後の振り子の動きを時間と角度でグラフ化してます。無負荷の単純な振り子の自由運動。当然ですが徐々に減衰していきます。
まず手始めにこの振り子の自由運動を打ち消すように制御してみました。
リアクションホイールと反トルク

リアクションホイールの働き自体は割と単純。ホイール(モータ)の回転速度/方向を変化させることによって発生する反トルク(反作用)で姿勢を制御します。
自由振り子運動を制御する
ホイール回転速度/方向を制御して振り子運動を抑えてみました。

検証後の最終結果です。15°くらいに傾けて、手を離した後の時間と角度の実測値。振り子運動を打ち消すようにホイールを回転させてます。しっかりと振り子の動きを抑えていると思います。
最初いろいろと定数測定してシミュレーションしたり、モータ回転数や電圧をフィードバックに取り入れたりと試してみたのですが、結局最後は角度のPID制御に落ち着きました(というか私の知識不足でPID制御でしかうまくできなかったです。)。振り子でいろいろと動作が理解できてきたので、次に倒立に挑戦します。
倒立振子でテスト⇒完成
本題の倒立状態の制御を行っていきます。

さっそくプログラムして倒立テストを実施したのですが、残念ながら振り子での検証内容があまり意味無く、同様に制御しても全く倒立しない状況。
結局現物合わせでゲイン調整を繰り返してなんとか倒立するようになりました。
角度のPID制御のみです。ようやく倒立できるようになったのですが、ホイールが高速回転を続けてしまいます。外乱にもあまり強くない感じ。当然、筐体(重心)のズレや歪み、センサ誤差などがあり、それが制御に影響してるんじゃないかと思います。
そのため、角度のPID制御の外側に目標角度を安定化(調整)するフィードバック制御を加えてみました。
ゲイン調整後です。各段に安定感が増しました。ホイールの回転も必要以上に高速にならないです。
倒立できるバランスポイントも自ら合わせにいきます。ただあれだけ検討したのに、モータ電圧、電流、回転数といった情報は今のところフィードバック制御に使わずじまい。角度情報のみで制御している状況なのでまだ改善できる余地はあるんだと思います。
これでひとまずリアクションホイールによる1軸倒立振子は完了。だいぶ理解が深まってきたので、3軸姿勢制御の方へ着手していこうと思います。
コメント