ここでは、玉乗りロボットを含む、「下端が車輪的なもので移動するタイプの倒立振子」のパラメータの実験的な調整方法を解説します。(車輪型、台車型、直動駆動型等)
倒立振子には反動車を回すタイプ(ムラタセイサク君のお腹のホイル状のもの、プール際で落ちる前に腕を振り回す動作も同)がありますが、これはこの方法では調整できません。
倒立振子の一般的制御式は
操作量(加速度、力)=姿勢角ゲイン×傾斜角度+姿勢角速度ゲイン×傾斜角速度
+位置ゲイン×移動量+速度ゲイン×移動速度
で、この4個のゲインを調整することで「望ましい」ように動作を調整します。そもそも、制御を成立させます。
この決定には、伝達関数からラウス・フルビッツの安定判別で範囲を絞る方法、現代制御理論による決定法などがありますが、以下に、これまで10種以上の倒立振子をさくっと調整してきた、経験的な実験的にゲインを決定する方法を紹介します。
なお、BallIPMiniでは、これが32bitレジスタ4,5,6,7にそれぞれ割り当てられているため、sermonで繋いだ場合は、それぞれ、
set32 4 4 姿勢角ゲイン; set32 4 5 角速度ゲイン; set32 4 6 位置ゲイン; set32 4 7 速度ゲイン
と入力することになります。
パラメータ調整法:
- 全ゲインを0にします。
制御を開始しても、当然、倒立振子は動作せず、倒れます。
- 姿勢角ゲインを徐々に上げていきます。
鉛直に立てた状態で、手で支えながら制御を開始します。鉛直ならなにも起きないはずです。
そこから少し傾けます。ゲインがある程度有効な大きさになっていれば、傾けた方向に車輪(球)を回し、鉛直に戻そうとする動きが生じます(加速度or力)。
もし逆に移動して、より倒れそうになるなら、式のどこかがマイナスになってます(センサやアクチュエータ、回路の結線など)。とりあえず、ゲインをマイナス値に設定すればいいでしょう。
以下のゲインも同様ですが、「数値を入れても反応がない」ときは、「10%増やす」というぬるい上げ方ではなく、「2,3倍にする」という上げ方で、最初は問題無いと思います。(そもそも数値のオーダが足りなすぎるので)
- さらに姿勢角ゲインを大きくすると、傾けたときに動き始めて、鉛直を通り過ぎて反対向きに傾くようになり、それを戻すためにまた逆に動き、という発振が生じます。場合によっては振幅が大きくなりどうしようもなくなります。
- 次に姿勢角速度ゲインを上げていきます。
※上記で、姿勢角ゲインをマイナスにしているときは、多分、角速度ゲインもマイナスです
ある程度大きくしていくと、上記の「通り過ぎ」が低減し、振動が落ち着き、発振も見られなくなってきます。
この状態では、振子の上部を指1本で軽く支え、指を動かすと振子が付いてくるような状態(お散歩モードと言ってますが)になります。
この様子を確認しながら、姿勢角ゲイン、姿勢角速度ゲインを共に上げていきます。変な振動(ゆさゆさではなく、ガタガタ系)が生じる手前まで上げましょう。十分に上げ、問題無ければ、指で上部を左右に揺すったとき、それにさくさく追従し、なるべく鉛直を保つようになっているはずです。
短時間であれば、もう、指を離しても立つはずです(通信ケーブルなどがつながっていると、その拘束で一点で立つと思います)。
安定性のマージンのため、ゲインは限界よりは少し低めに戻しておきます。
- この状態は、位置のフィードバックがかかっていないため、いずれは原点からずれて移動して(走って行って)しまいます。この対策に、以下では位置系のゲインを追加していきます。
- 位置ゲインを上げていきます。
すると、指を離して振子が原点から離れていったときに、ある程度いくと、逆に戻ってくるようになります。
位置ゲインを高くするほど、すぐに戻ってくるようにはなりますが、これも原点を通り過ぎます。通り過ぎたところで、また戻ってこようとするので振動的になりますが、おそらく、通り過ぎたあとのほうが動きが大きくなって、発散します。
なお、この位置ゲインの極性は「原点から遠ざかると、さらに遠ざかるほうに力・加速度を出す」という、ポジティブフィードバック側なので、注意してください。手で支えたまま、原点から遠ざける方向に動かすと、振子が原点側に傾くような平衡状態になる、のが極性があっている状態です(傾いて原点側に戻ろうとする)。
- 速度ゲインを上げていきます。
※位置ゲインとおそらく同極性
先ほどと同様、速度ゲインを上げることで、位置の行き過ぎが低減し、ある程度以上速度ゲインを大きくすると振動が収まるようになります。
ただし、振動は完全にはなくなりません。倒立振子は一般にある程度の振幅の振動がのこります。
ここまでくると、手を離しても継続して立てるようになります。また、上げられるだけ上げて、なるべく綺麗に、しっかり立つところを探しましょう。
- ゲインのバランスを調整します。
倒立振子は、傾斜角度に関するゲインと、位置に関するゲインは両立しません。
前者を高めると、傾斜角度の鉛直さを保つ努力をしますが、その結果、位置の揺れ幅が大きくなります。一方、後者を高めると、姿勢角についてすこし甘くなります(ただし、傾斜すると位置を変えて補正することになるので、前者ほどはっきり位置重視になるわけではない)。さらに、全部高くすると、ガタガタ系の振動が起きて(主にメカ的な応答性;ガタなどや、センサの微分値の影響)、そもそも制御できなくなります。
そのため、好みに応じて、ゲインのバランスを調整してください。そのとき、指先で支えつつ、揺すってみたときの応答は、感覚的な評価指標になります。
参考:
上記の式から、当方で採用している加速度操作型では動かなくなる平衡点、すなわち、加速度=0、速度=0の状況では、
姿勢角ゲイン×傾斜角度=-位置ゲイン×移動量
となります。つまり、ロボットを外力などで傾け、ずらしたときの、角度偏差と位置偏差は、単純にゲインの比で決まります。
一方、力操作型の場合は、これに力も含めたバランスとなるので、少しやっかいですが、結果的には、同じ傾向がでるはずです。
以上の方法は、本学で近所の中学校に提供している実験実習プログラムにおいて、実際に中学生にもやってもらっている調整手順ですが、毎年、それで1時間もしないうちに車輪移動型の倒立振子を立てられるようになります。