井土です。
玉乗りロボットがとりあえず動きました。
今回はその動画と制御についてです。

まずはこちらの動画をご覧ください。
4月の新入生歓迎展示でのデモの様子です。
一緒に映っているのは、
去年作ったNAND(74HC00)ロジックのみで作ったNAND計と後輩の作った電源装置です。




ふらふらしていたり、座布団を敷いていますがバスケットボールにちゃんと乗っています。
とりあえずはこれで完成です。

今回は今までに紹介してきた回路・機械を統合して、
どう制御しているかに焦点を当てたいと思います。
このロボットは下の図のような感じでセンサの値を使って制御をしています。

 ctrl

加速度センサとジャイロセンサからいい感じにx方向の傾きとy
方向の傾きを計算し、
PIDコントローラでその傾きが0になるようにxy方向それぞれへの出力(トルク)を計算します。
最後に、このロボットはオムニホイールを3つ使っているので
x,y方向の出力をオムニホイール×3の出力に変換してモーターに出力します。

ここに出てきたPID制御相補フィルタとは何でしょうか。
今回の玉乗りロボットの制御に関してはその2つが特徴であるので、どんなものかを簡単に説明します。


◯PID制御
まずPID制御とはフィードバック制御の一つの手法です。
そもそもフィードバック制御とは何なのでしょうか。

例えば今、モーターを10の速さで回す制御するとします。
自分がモーターを"10の速さ"で回そうとしていても、
外乱によって"7の速さ"でしか回っていないかもしれません。
そこでモータの速さをセンサで検出して目標値とのズレを考慮して制御するのが
フィードバック制御です。
今回の例では、目標値("10の速さ")とセンサから得られた実際の状態("7の速さ")
ズレは"3の速さ"なので、
そのズレ3が0になるように制御をします。

ズレた値を使ってそのズレが0になるようにするにはどうしたら良いのでしょうか?
そこでPID制御です。
色々な手法がありますが、PID制御はとても良く使われます。
(とある先生によると工業製品に使われる制御の9割がPID制御だとか)
PIDとは比例(P),積分(I),微分(D)のことで、ズレを比例,積分,微分した値を制御出力としてモーターなどに出力します。

pid

・比例(P)は今のズレを制御に反映
・積分(I)は今までのズレを制御に反映
・微分(D)はこれから起こりそうなズレを制御に反映 
  します。

この3つの成分には重み付けができ、それが
KP,KI,KDという3つのパラメータです。
これをうまく決めてやることで制御できるようにします。
制御対象をモデル化できればKP,KI,KDの値をある程度計算やシミュレーションで
決められるのですが、
今回はいきなり玉乗りロボットに実装して
パラメータを色々変えて試行錯誤することでいい感じの値を決めました。

一応限界感度法ステップ応答法といったPIDパラメータを決める手法がありますが、
うまくいかない場合はロボットの動きなどをよく観察してパラメータを調整していきます。 

イメージとしては
・P成分:不安定にならない程度になるべく上げる
・I成分:ズレが定常的に残るときに上げる
・D成分:ちょっとズレた時、すぐに戻したいときに上げる 

みたいな感じです。


◯相補フィルタ
3軸ジャイロから得られる角速度を積分すればそれ一つでロールピッチヨー全ての角度を得られそうですが、
センサの出力にオフセットが乗っていたり、温度変化でズレたり(温度ドリフト)、積分誤差で
正確な値を計算するのは難しいです。
そこで加速度センサも用いて最もらしい値を推定します。
加速度センサを使えば、重力の方向を計算することでヨー以外の姿勢角を知ることはできます。
ただ、並進運動をした時に並進加速度の分だけズレてしまします。

これらを見方を変えて、以下の様な仮定をします。
・ジャイロセンサの定常値はオフセットが乗っていたりするが、変化成分は正確
・加速度センサの定常値は正確だが、変化成分は並進運動が加わっている可能性がある


定常値は低周波成分であり、変化分は高周波成分です。
これらのセンサの特徴を活かして
加速度センサにはLPF(ローパスフィルタ)を掛けて低周波成分を取り出し
ジャイロセンサにはHPF(ハイパスフィルタ)を掛けて高周波成分を取り出して
この2つを足す。
ということをすると割といい感じの値が得られます。
comp_filter

相補フィルタとは、このように複数の信号にフィルタを掛けて
足しあわせ、より精度の高い計測を行う信号処理です。
(ただし任意の周波数においてフィルタの利得の和は1になるようにする) 

複数のセンサを組み合わせて精度よく計測する方法は
センサフュージョンとか言われていて、
他にもカルマンフィルタパーティクルフィルタなど色々あります。
今回は実験してみた結果、相補フィルタが一番いい感じだったので採用しました。 


現状の玉乗りロボットの制御はPIDパラメータを試行錯誤で適当に決めた適当制御です。
ロボットの物理モデルを解析したわけでもなく、よくわからないけど立っている状態です。
動画でもロボットはまだふらふらしていて、もっと安定化させたいと思っています。 
今度は現代制御理論を用いてちゃんと制御し、定量的に制御する予定です(秋か冬くらい)。