2014年7月20日日曜日

PID制御について


saint11


今年も中国教育省に中国国際ICT大会(SICTIC2014)に招待されました。
そのためロボットの調整を行っているのですが、方位制御が安定しました。ここでPID制御(高速、正確な方位制御ができる)について説明します。

 P制御 : 比例制御。目標の方位と現在の方位の差の大きさに応じて回転の速度も速くなる。傾き(定数)が大きすぎるとロボットが尻振り状態(ハンチング)になる。首振りになるかならないかぎりぎりに調整するとよい。
モーターのパワー = 方位の差 *  定数(好きな値、調整は自分で行う) 
 I 制御 :   積分制御(時間積分)。目標方位に一定時間内で到達するため、時間が増加するごとに回転の速度も速くなる。すこしずつ値が大きくなるので正確な制御に向い    ている。単調増加(増加しかしない)な制御であるため値が大きくなりすぎて暴    走する危険性(不安定)がある。何も制限を加えないと無限に値が大きくなるた    め定期的に0に初期化する必要がある。
モーターのパワー = 時間(ループごとにインデクリメント、タイマーでもOK)*定数 (好きな値、調整は自分で行う)
D制御  :   微分制御(時間微分)。微分とは変化の割合(傾き)を求めること。(連続値のグラフなら何でも求められる)。変化の割合を求めて、目標値にたどりつくよう    な変化の割合に変える。尻振りの抑制(目標値を越し続けることによって生じ     る)が可能。I制御の無限に値が大きくなる現象をある程度抑制できる。
モーターのパワー = (1つ前の方位ー現在の方位)* 定数



PID制御: モーターのパワー = Pの式 + Iの式 + Dの式

・簡単なP、I、Dの式の定数の決定法
まずPI制御で調整する。Pによって尻振りするかしないかギリギリの定数に調整する。(Iの定数は何でもよい、Iによって制御が暴走する場合は定数を十分小さくするだけでよい)
そうすると定数はこのように決定する。
P定数 =  調整値 * 0.6
I定数    =  暴走頻度が十分すくない値 * 0.5
D定数 = I定数 *  0.125
I定数 : D定数 =  0.5 : 0.125 = 4 : 1(この関係を満たせばIやDの定数を少し変えてもよい) 




5 件のコメント:

匿名 さんのコメント...

I 制御のところで、「時間が増加するごとに回転の速度も速くなる。」
とありますが、この時間とはなんの時間ですか。
よろしくお願いします。

匿名 さんのコメント...

I制御の項が単に目標値までのエラーを足しあわせていくだけだとすると、エラーが大きい時間が長いと爆速でIの値が上昇してしまう。
時間は制御がかかっている実時間のこと。

匿名 さんのコメント...

回答ありがとうございました。

もう一つよろしいでしょうか?
姿勢の制御のタイミングですが、ボールを追跡と姿勢の修正を交互に行うと、
ロボットの動きがガタついてしまうんですが、スムーズにやるにはどうしたらいいでしょうか?

Unknown さんのコメント...

管理者のsaintです。
遅れてすみません。
カクカクするのは、回転運動と直進運動を別個に行っているためと考えられます。
直進 -> モータードライバーに出力
回転 -> モータードライバーに出力
このときに直進運動から回転運動の変化時にもモータに急な加減速を要求するため、
カクカクした動きになると思われます。

回転運動と直進運動は力学的には別の運動として考えられます。
そのため、モーター出力 = 直進運動 + 回転運動 という式が立てられます。
オムニロボットでは、回転しながら直進するなどの運動が簡単にできます。
回転運動と姿勢運動を数学的に同時に行えば、スムーズに動くと思います。
この場合は回転運動と直進運動を同時に行うので、急な加減速になりません。(回転運動はPID制御、直進運動も定数・台形かPID制御のため、速度の微分(加速度)が以前より小さくなるので、カクカクした動きがなくなります)
具体的には、角度を入力したら、その方向に直進運動で向かうオムニロボット用関数を実装し、モーター位置の直径 * 回転の項を足してください。
こちらのアルゴリズムは小型サッカーリーグのロボットの論文に書かれてあったと記憶しています。
その論文は行列表記なのでロボカップジュニア勢には難しいと思いますので、コードで理解するのが良いと思います。
私の書いた以下のリンクのURLのコードのmovevec105()を活用して実装するのがおすすめです。
角度の定数はモーター配置の角度にしてください。
https://github.com/kendemu/KendemuRCJArduinoProject/blob/master/saint9/idktlib.cpp


Unknown さんのコメント...

回転運動 + 直進運動の和が100%を超える場合は、-100% ~ 100%の値になるように正規化してください。正規化の式はググれば出ます。