ライントレースでP制御してみた (EV3)

前回の記事でモンゴル高専との交流のことを書きましたが、今回はその時使ったプログラムについてです。

最初に述べておくと、LEGO歴無しでいきなり2日半という短い期間での開発だったので、逃げた点や不完全な点が多々あります。留意して記事を読んでいただけると幸いです。

 

【ルール】

WROについては全く知らないのですが、中学生ミッションのサプライズ無し80点満点で競技を行いました。

ルールについては

http://www.wroj.org/2015/pdf/WROJapan2015RegularBasic_v1.0.pdf

を参照ください。

 

【本題】

そもそもライントレースでP制御ってなぜ?とか、P制御って何?って言う人がいると思います。(というかそういう人に知ってもらうために記事にしてる感ある)

P制御のPとは「Proportionality」のことで「比例」という意味です。

 ちなみに、一般的にやっているライントレースはON/OFF制御という制御方法です。

P制御とON/OFF制御の違いを説明しながらP制御を理解してもらいたいと思います。

 

※ラインセンサは光の反射の強さを用います。

 

まず、ON/OFF制御ですが基本的に

1.黒(反射光が少ない=値が小さい)だったら左回転

2.白(反射光が多い=値が大きい)だったら右回転

みたいな感じで条件で分岐してモーターの出力を変えますよね。

しかし、P制御ではこのような分岐は行いません!!(ここ大事)

P制御では、モーターの出力を変数として計算するので分岐はしません。

なんでそんなことができるかというのは今から説明します。

 

大事なことで、ラインセンサは「白」と「黒」しか読めないわけではありません。

f:id:anbalioh:20160229115053p:plainf:id:anbalioh:20160229115054p:plainf:id:anbalioh:20160229115056p:plain

     図1          図2         図3 

図のような3通りの場合を考えます。赤丸がラインセンサです。

仮にLEGOのセンサの値が0~100で返ってくるとして、理想的な値は

図1:100

図2:50

図3:0

となります。

黒色は光を吸収するのはご存知ですよね?

この性質から、「白ではすべての光が反射して100」「半分ずつであれば返ってくる光も半分なので50」「黒では光は反射しないので0」となります。もちもん理想です。

この場合わけを無限大にしていったらどうなるでしょう。特にラインにフチですね。

「図1と図2の間だったら75」、「図2と図3の間だったら25」というふうになります。これを無限大に考えていくわけで、また光が当たる面積で値が決まるわけなので、結局グラフを書くと直線になるのがわかります。

最初にも言いましたがLEGOのラインセンサの値が0~100というのは説明しやすいからで実際は違うので注意してください。

f:id:anbalioh:20160229121715p:plain

         図4

ここでこの関数から「-50」してみたらどうなるでしょう。

0の時:-50

50の時:0

100の時:50

という感じになりますよね。グラフを書くとこんな感じです。

f:id:anbalioh:20160229122346p:plain

                図5

ここで新しいこのグラフでは「センサの値が0のときはラインのフチ」であることを理解してください。

このグラフをみるとなんだか分岐しないでもできそうでよね?

この値をLEGOのモーター出力にまんま渡せば、正負もしっかりわかれているので勝手に正転逆転もしてくれそうです。

しかも!!ラインから離れれば離れるほど旋回が強くなって、ラインから少し離れているなら弱く旋回するという、理想的なライントレースができそうです!!

実際、このラインからどれだけ離れているかで旋回の強さを変えて、理想的なライントレースをすることがP制御をする目的です。

P制御の概念はこんな感じになります。

 

ここから間違えてます。読まないでください。

 

たぶん、これでP制御できると思うんですが、本来は「偏差」という値を用います。

(値)=(比例定数)*  {(今のループの値-(前のループの値)}

 {(今のループの値-(前のループの値)}が(偏差)です。

偏差は、今のセンサの値と前のループのセンサの差(引き算)を求めています。

 比例定数は「比例ゲイン」と呼ばれ、P制御のパラメータになっています。比例ゲインを調整することできれいにライントレースすることができます。

 

最終的にできたP制御のプログラムがこれです。

f:id:anbalioh:20160229145317p:plain

時間ループにしているのはラインの円の外側をトレースするためです。(ルール参照)

ただ、時間ループは絶対にしてはいけません!

時間ループにすると、タイヤのゴミ具合によって進んだ距離が変わり、うまくライントレースできなくなります!

まあ、これはP制御と関係ないことなので無視してください。

 

このP制御では計算のところが重要です。

あとのところは真似してみてください。

ADV設定にした計算式のところ(赤ブロック右上)の式が先ほどの偏差が出てきた式です。

見ればわかると思いますが、bか今の値、aが前のループの値、2.3が比例ゲイン、25.5がグラフを真ん中に持ってくる値(例の-50)です。

この25.5は黒の最大値と白の最大値を足して2で割れば問題無いと思います。

実際に測定して計算して、式に当てはめてみてください。

 

P制御の説明は以上です。

うまくまとめられた自信がないのでわかりづらかったかと思いますが、挑戦してみてください。

 

完成したロボットの動きをyoutubeにアップしました。

www.youtube.com

 

最後にプログラム全体を載せときます。参考にしていただけると幸いです。

f:id:anbalioh:20160229150353p:plain

 

 

明らかに間違えていて、やり直したプログラムを上げたいところですが、EV3を持ってるわけじゃないのでやり直せない・・・

まあ、最初のグラフまではあってなくもないので参考までに・・・