ようこそゲストさん

ライントレース開発日誌

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

B3 Takayanagiです。

ロボトレースの制御法2回目です。

②ライン追従
ロボトレースの機体性能を生かせるかどうかの肝となる(?)ライン追従の方法について紹介します。
今回想定するロボットは、前回書いたロボットに以下のようなセンサをもつものです。
・赤外線などを照射して、その跳ね返りの光量を検知することによって白と黒を判別できる
・光量は数値化されていて、ある程度の光量の強さも認識できる(どのくらい白にのっかているかを認識できる)
・数個のセンサを用いている
・直線状または円弧状にセンサが等間隔で並んでいる
・機体中心から見て左右対象にセンサが配置されている
・センサの出力値を逐次知ることができる
イメージを載せます。
ラインセンサイメージ.png
雑!

・ラインからはみ出したくない!
まずは、単純なライン追従の方法を考察します。
          • 前提------
センサの番号を、右から①、②、③、④、⑤、⑥とします。
白線を検知したときに得られるセンサの出力値をMAX_Iとします。(実際はセンサによって固体差があるので注意!)
機体の中心速度は一定だとします。
ラインが機体中央にある場合は③と④のセンサが反応するわけですね。
逆に、①または⑥がラインを検知したら、検出したセンサの方向に大きく舵を切りたいわけですね。
ライン検知の方法は、センサの出力値が
MAX_I * K_L (K_Lは係数)
を超えたら白線検知としましょう。
ラインからはみ出さないためには、左右のモータの出力に差をつけ、機体を旋回させる必要があります。
反応したセンサの方向のモータ出力を弱め、逆方向のモータ出力を強めたら、機体中央からずれたラインの方向を向くことになり、ラインからはみ出さなくなります。
センサごとに左右モータに与える電圧の差を決めましょう。例えば、
③又は④が反応した場合は400mV
②又は⑤が反応した場合は600mV
①又は⑥が反応した場合は1000mV
というようにします。
この値は、機体ごと、コースの状態ごとに異なります。実際に走らせて決めましょう!!はっきり言って気合です。

・ラインに追従したい!
次に、ラインに滑らかに追従する方法を考察します。
          • 前提------
センサの番号を、右から①、②、③、④、⑤、⑥とします。
センサ値から、どの程度白線が乗っているかをある程度知ることができるとします
機体の中心速度は一定だとします。
先ほどの制御だと、センサとセンサの間に線が来た場合、反応しないもしくはどちらかが反応してちょうどいい曲がり方をしないと思います。
そんな時、ラインがどの程度センサにのっかているかを知ることによって、そのセンサ値に応じた曲がり方をすれば、滑らかにラインを機体中央に持っていくことができます。
左右モータに与える電圧の差V_Sを次のように計算します。
V_S = (①*K_1 + ②*K_2 + ③*K_3) - (④*K_4+ ⑤*K_5 + ⑥*K_6) (K_1~6は係数)
お察しの通り、係数は走らせて決めてください。
この方法がメジャーなライントレースロボットの制御方法なのではないでしょうか。

・電圧じゃ分かりにくい!
ここからは私が考えた部分が多くなってくるので、参考程度にしてください。
先ほどの制御では、モータに与える電圧を直接決定していましたが、係数が状況に応じて大きく変動することがある上に、電圧だと考えにくい場合があります。
そこで、電圧決定の部分を目標角速度決定に変換します。
目標角速度をT_Wとすると、
T_W = (①*K_1 + ②*K_2 + ③*K_3) - (④*K_4+ ⑤*K_5 + ⑥*K_6) (K_1~6は係数)
と表せます。係数は走らせてみないと分かりませんが、電圧より考えやすくなっているはずです。
そして何より、T_Wに追従するようにフィードバック制御・フィードフォワード制御を行えばよいので、ある程度の状況変化に対応できます。

・ガタガタ発振する
先ほどの制御では、目標角速度をセンサ値の定数倍の合算で決定していました。
しかし、これだとどうしてもセンサ間で目標角速度の不連続が生じ、発振してしまう事があります。
私もとても悩まされました。
そこで考えたのが、段階に分けたセンサの使い方です。
少々複雑だと思いますが、読んでいただけたらありがたいです。
まず、センサの組を考えます。ラインがどの程度ずれているのか、おおよその検討を立てるわけです。
③と④
②と⑤
①と⑥
で分けます。それぞれのセンサ値の差を次のように決めます。
C_L = ③ - ④
M_L = ② - ⑤
O_L = ① - ⑥
まず、C_LとM_LとO_Lのどの差を利用したらいいのかを評価します。
その閾値を次のようにします。
C_LB = (C_LのMAX値)*0.1
M_LB = (M_LのMAX値)*0.3
O_LB = (O_LのMAX値)*0.3
これは自分で決定してください。
次に、どのセンサ値を採用するかの基準を決めたら、目標角速度の範囲をセンサごとに決めてください。
例えば、
③と④ -400 ~ 400 deg/s
②と⑤ -800 ~ 800 deg/s
①と⑥ -1200 ~ 1200 deg/s
という風に決めます。
最終的な角速度決定は次のようにします。

C_Lの絶対値がC_LBを超えていた場合
T_W = (C_L * 400)/C_LのMAX値

M_Lの絶対値がM_LBを超えていた場合
T_W = 400*(反応したセンサの方向の符号) + (800 - 400)*(M_L)/(M_LのMAX値)

O_Lの絶対値がO_LBを超えていた場合
T_W = 800*(反応したセンサの方向の符号) + (1200 - 800)*(O_LB)/(O_LBのMAX値)


実際に走る場合には、次の順序で角速度を決定します。
[Ⅰ]どのセンサ値の差が閾値を超えているか
[Ⅱ]閾値を超えた部分のセンサ値の差から上記の方法で角速度を計算する

ここまで書いてきて意味不明ですね。ごめんなさい。

寝ます。お疲れ様です。

名前:  非公開コメント   

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