ようこそゲストさん

ライントレース開発日誌

2016/02/02(火) ロボトレースの制御法(1)

B3 Takayanagiです。

今回は、ある圧力がかかったので、ロボトレースの制御法()について紹介しようと思います。

①機体制御
まず、ロボットの動きの制御法を紹介します。ここでいうロボットとは、次のようなものを想定します。
・機体の移動用にDCモータを使用している
・二輪もしくは変速四輪(モータ2つで左右のタイヤの回転を制御)
・モータの回転数を検知できるようなセンサ(エンコーダなど)が搭載されている
・ジャイロセンサが搭載されている(必ずしも必要でない)

次に、どのように制御するのかを紹介します。まず、へたくそで雑な図をご覧ください。
機体制御.png
ロボットは、モータの回転数を検知できるので、左右のタイヤの回転により移動する速さを知ることができます。
ここで、左右の速さの平均を中心速度とします。中心速度は、
中心速度 =(左速度 + 右速度) / 2
で計算できます。
次に、角速度についてですが、ジャイロセンサがついている場合はジャイロセンサの出力値を使用して角速度を知ることができます。
ジャイロセンサがない場合は、近似ですが、次のようにして機体の角速度を計算することができます。
角速度 = (右速度 - 左速度)/トレッド幅
このようにエンコーダを使用して角速度を検知しようとすると、タイヤがスリップした場合に角速度は不正確になります。
ジャイロセンサの使用をおすすめします。
さて、私はこの2つの物理量を制御してロボットの動きを制御しています。
この2つの物理量を制御できると、ロボットに自分の思った通りの動きをさせることができます。
では、これらの制御法を紹介します。私は、フィードバック制御、フィードフォワード制御を組み合わせて制御をしています。
・フィードバック制御(PID制御)
フィードバック制御とは、簡単に説明すると、
「制御すべき物理量の理想の量」に「検知して得た物理量」を、「理想の量と検知して得た量の差」を利用して、近づけるように出力を決めるような制御
です。分かりにくくて申し訳ないです。そして、自分で考えた説明なので、学問的には不正確だと思います。
この、フィードバック制御の内、PID制御を行ってロボットの制御をします。
PID制御を用いてモータに与える電圧値を決めます。電圧値として、次の[1],[2],[3]のP項I項D項の合計値を与えます。
[1]P項
P =(目標値 - 測定値)*K_P (K_Pは係数)
[2]I項
I =(制御を開始してからの偏差の総和)*K_I (K_Iは係数)
偏差とは、目標値と測定値の差のことを指します。
[3]D項
D =(今回の偏差 - 前回の偏差)*K_D (K_Dは係数)
この3つを合算して、モータに与える電圧値V_Mは、
V_M = P + I + D
と表せます。それぞれの項の係数は、実際にロボットを走らせて目標値に追従するような値に決定するとよいです。
中心速度については、V_Mを左右のモータに同じだけ与えます。
角速度については、左右逆方向のV_Mを与えます。
・フィードフォワード制御
フィードバック制御は、測定値と目標値との差を見て出力を変化させていました。
対して、フィードフォワード制御は、目標通りの動きをするような出力をあらかじめ計算したり、予想したりしたりして与える制御です。
実際に私が行っているフィードフォワード制御について紹介します。
[1]加速度項
ロボットには加減速走行を行わせたいので、目標とする加速度に対して出力を与えます。
DCモータの特性上、入力する電流と出力されるトルク(加速するのに必要)には比例関係にあるそうです。
電流は制御しにくいので、モータの端子間の抵抗は一定だとして電圧を変化させることによってモータに与える電流を想定して、電圧によって制御します。
まとめると、出したい加速度に比例した電圧値を出力させるという事です。つまり、出力する電圧V_Mは、
V_M = 加速度 * K_A (K_Aは係数)
となります。K_Aを計算したり、実測したりして決定しなければなりませんが、私は実測によって決定しています。
実測方法は今後紹介するかもしれません。
簡単に説明しておくと、ある電圧を与えておいて、その電圧値にある電圧値を加えて、加えた時点に出る加速度を記録し、出た加速度と加えた電圧値との関係性を調べるわけです。
[2]速度項
DCモータの特性上、入力する電圧と出力される回転数は比例関係にあるそうです。
理想的な回転数を与えるような電圧値が分かれば、機体の速度を制御できます。
出力する電圧V_Mは、
V_M = 速度 * K_V (K_Vは係数)
となります。K_VもK_Aと同様に何とかして決定しなければなりません。
私の行っている方法は、ある電圧値を与えて、検知された速度を記録し、その電圧値と速度との関係性を調べるというやり方です。
上記[1][2]を合算し、モータに与える電圧は、
V_M = 加速度 * K_A + 速度 * K_V
と計算できます。

以上が私が行っているフィードバック制御とフィードフォワード制御です。
実は、今回書いたことは、ロボトレースとマイクロマウスで同じことを行っております。上記で想定したロボットには有効なのではないかと思われます。

もちろん、自分で考えたわけではなく、先輩方(OB含む)に教えていただいた制御法です。
左右のモータの速度を別々で制御していた時に先輩に相談した際に、この方法を教えていただきました。
正直、その時は、「速度に関しては左右の区別なしで制御」、「回転方向に関しては左右逆の出力を与えるような制御」なんて果たしてうまくいくのかと思っていました。
半信半疑でやってみた結果、とてもうまくいったので、先輩方はやっぱりすごいなと思いました。先人の話はしっかり飲み込みましょう。

かなりの長文で疲れました。今回はこれで終わります。お疲れ様です。

名前:  非公開コメント   

  • TB-URL  http://www.usamimi.info/~isys/cgi-bin/adiary/adiary.cgi/linetrace/072/tb/