ようこそゲストさん

ライントレース開発日誌

2016/03/22(火) 熱田の森と新作構想

B3 Takayanagiです。

熱田の森大会に参加してきました!
結果は……

トレース……2走目(加減速走行)が走らず、惨敗
スプリント……3位

スプリントは一回戦目でフェールセーフが働かないというバグに気付けて、
二回戦目以降閾値を下げる修正を行うことができて運がよかった。

機体の状態が最近よくないので、新作に取り掛からないとまずい。
新作はT.Tシリーズの第二世代となります。今までとは考え方の異なる走行をさせたいと思います。
今までの走行方法は、センサ値からの機体目標値の設定を少しオーバーに与えて、
追従遅れを含めた曲がり方で強引に曲がっていたのですが、今度の新作は、センサ
位置を曲がり方に都合のよい入力が入ってくるように設定したいと思っています。
追従遅れを発生させてしまうと、カーヴ → 直線の加速時にどうしてもぶれてしまうことがわかりました。
次回作の目標は、直線加速時に発振しないような制御をすることです。

それでは。

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値)


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

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

寝ます。お疲れ様です。

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

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

2015/12/10(木) この一年間

こんばんは。B3のTakayanagiです。

実は、熱田の森大会に参加した1作目から、2015年全日本マイクロマウス大会までに、2台作ってました。
その二台を紹介して、今年のまとめとすることにします。

2作目 T.T ~日輪~
DSC_0395.jpg
このトレーサーは、1作目の失敗を生かし、センサ位置、重心などを改良し、走行スピードを大幅に向上させることに成功しました。

3作目 T.T ~月光~
DSC_1298.jpg
全日本大会は、この3作目で出場しました。
2作目はハードウェアがピーキーな作りで、修理に手がかかり、ハードウェア面のヴァージョンアップを目指して作りました。
……結果は……
全日本 決勝6位入賞
でした!!!

全日本の走行スピードを載せます。
探索 1.2m/s

2走目
R15以下 1.0m/s
R20以下 1.4m/s
R30以下 1.9m/s
R40以下 2.1m/s
R50以下 2.15m/s
R100以下 2.3m/s
R200以下 2.7m/s
直線  3.0m/s
25cm以下の区間 1.0m/s

3走目
R15以下 1.2m/s
R20以下 1.6m/s
R30以下 1.9m/s
R40以下 2.1m/s
R50以下 2.15m/s
R100以下 2.3m/s
R200以下 2.7m/s
直線  4.5m/s
25cm以下の区間 1.2m/s

25cm以下の区間の速度をR10速度にまで落としているのは、その区間では、コーナの半径を判別できないからです。
そのせいで直線中のダミーマーカで減速してしまい、少しタイムが落ちてしまいました。
それでも、いい結果を残すことができたので良かったです。

それでは、失礼。

2015/04/24(金) 現状

BIT
B3 Kishimotoです。

かなり間が空きましたが、BITについて報告を。

今のところ新入生は7人が入部。
それぞれのペースでBITのプログラミングを行っています。

やはり入部してすぐにタスクがある、というのはやる気に繋がるのか
すでにトレースしていて、ゴールで止まる人もいればPD制御を行っている人も。

こういった点はうれしいのですが、いろいろ間に合いませんでした。
BITの制作とマニュアル、サンプルプログラムの制作を急ピッチで進めていましたが、
結局マニュアルの制作途中で一人目の新入部員が入ってきてしまい、対応していたら完成できませんでした。

マニュアルを見ながらプログラムをしていってもらうのは来年以降になりそうです。