2008年7月31日木曜日

LQGによる倒立振り子の制御実験

久しぶりにロボット的なものを作りたくなったので
どうせなら制御理論の検証ができるものを…
というわけで、Segway的な倒立振り子を作ってみた。

全体図



機械部分は入手性がよくて組み立て簡単な田宮模型の部品で固めました。
本体はユニバーサルプレートで、たまたま手に入った透明プラスチックバージョンを使ってます。
車輪はナロータイヤセット、ギアはハイパワーギアボックスHEだったと思います。
もうちょっとギア比が低いハイスピードギアボックスの方がベターかもしれません。

電池ボックスは熱に強い金属のやつを買ってきました。
一度熱で端子付近のプラスチックが溶けたことがあるので…

回路を実装する基板はSunhayatoのICB-88

電池ボックスも基板もいい感じにユニバーサルプレートにくっつきます。

回路


回路も今後の補修のために部品の入手性がいいやつで…

右の緑色の基板はトランジスタ技術の付録についてたR8C/Tinyの基板です。
これはSunhayatoからも互換性のあるものが出てますね。

真ん中の青色はSunhayatoの加速度センサーモジュールMM-2860

左の青い基板は同じくSunhayatoのモータードライバモジュールMM-531です。
電流容量0.7Aは心もとないので、2回路をパラレルにして使っています。
同じチップなら特性もわりとそろっているので問題ないと思いますが
あんまり誉められたもんじゃないですね。

左下のディスクリート部品的な部分で2.4Vの電源から3.3Vの電源を作ってます。
モーターの電源は電池直結です。

右端のコネクターはE8aエミュレータを接続するためのもので
上の3線は角速度ジャイロ(KRG-3)
下の2線はデバッグ用のブザー
左の4線は電池とモーターです。

側面




機械部分にあんまりこりたくないのでユニバーサルプレートと
ねじとスペーサーでしのいでいます。
基板を固定するビスがかなり長いのは転倒時に基板が地面に当たるのを防ぐためです。

モーター



モーターについてるセラミックコンデンサはブラシで発生するノイズを
吸収するためのものです。
マイコンと一緒にDCモーターを使う場合には必須らしいです。
たしかに昔PICマイコンを使ってたときにはこれで誤作動しなくなりましたが
最近のマイコンでも必要なのだろうか…

ちなみにエンコーダはついてないので
車輪の回転角は制御していません。角速度のみの制御です。

制御

video

最初は適当にPID的な制御でも立つかなーと思っていたのですが
意外とチューニングに苦戦したので
おとなしくモデルを構築してLQGを使ってみました。
制御器が不安定システムになるようなので
まぁなるべく極が左の方に来るように調節しています。
制御器は3次のシステムで制御周期は10msです。
R8Cでこの制御周期だと5次くらいまでなら何とかなるかな〜という感じでしょうか。

やっぱりモーター周りのモデルが怪しいのですが、
ロバスト制御の代名詞であるH∞制御とかだとこの手の怪しさは扱いにくいですね。
そのあたりを扱える理論が必要なのだろうか…

11 件のコメント:

kankarara さんのコメント...

出来れば詳しい回路図,プログラム例などお教え頂ければ幸いです.

丸田 一郎 (Ichiro Maruta) さんのコメント...

すみません.かなり前の製作物なのでプログラムが見つかりませんでした.また新しいバージョンを作ったら,その時は詳細な回路図・プログラムを載せられるようにします.

kankarara さんのコメント...

お返事ありがとうございます.丸田さんと同じ分野の大学教員です.かなり安価に,しかもしっかりした倒立振子ができそうで興味をもちました.新バージョン,楽しみにしております.どうぞよろしくお願い申し上げます.

kankarara さんのコメント...

MM-531を使って,マブチモーターの駆動をArduino UNOで行いました.TA7291Pなどを利用した場合のV_refに相当するPWM信号をMM-531のどこにつなげばよいか悩んでいます.それとも別の方法を使いますかね?お暇な際にご教示頂ければ幸いです.

kankarara さんのコメント...

MM-531を使ってタミヤのモータをArduino UNOで駆動してみました.回るのは回るのですが,TA7291PのVrefに相当するPWM信号をどこに入れれば良いのか不明です.お時間があるときでよいので,ご教示頂ければ幸いです.どうぞよろしくお願い申し上げます.

kankarara さんのコメント...

MM-531を使ってVrefなしでのPWM制御はできました.逆転ではPWM信号がMaxになるものの,正転ではMaxの70%くらいしか出ないのはなぜだか悩んでいます...

丸田 一郎 (Ichiro Maruta) さんのコメント...

ArduinoだとおそらくPWM出力可能な端子は豊富にあるので,2つのPWM出力可能な端子をINAとINBにつないで回転方向に合わせて片方をLowもしくはHighに固定するのが良いと思います.回転方向によって挙動が異なる現象はよくわかりませんが,「一方をPWM・片方をH/Lで方向を逆転」のように使っていると,回転方向によって,ブレーキとフリー回転の差が生じるので,そういう現象が発生するかもしれん.

yossy さんのコメント...

はじめまして。私、投稿されているロボットと同様の構成でチャレンジしている学生です。制御理論は初学者なのですが、お教えいただければ幸いです。質問なのですが、モデルを構築して制御されたとのことですが、どのようにパラメータを取得し設定されたのでしょうか?よろしくお願いします。

丸田 一郎 (Ichiro Maruta) さんのコメント...

パラメータというのはモデルのパラメータのことで良いでしょうか?モデルのパラメータは,モータのデータシート・計測された重量・ぶら下げた際の振動周期等に基づいて算出しています.

yossy さんのコメント...

御返事ありがとうございました。パラメータとはモデルのパラメータのことです。説明不足で申し訳ありませんでした。

peke さんのコメント...

はじめまして.
車輪の角速度を制御されているとのことですが,
どのようにして角速度を計測されているのでしょうか.
ご回答いただけますと幸いです.