Scratchでライントレース(センサ2つ)

2020-06-18

Scratchでライントレース。

前回は、センサ1つで作ったので、今回はセンサ2つに作ってみたいと思います。

コース

前回の1センサでも、とりあえずラインをトレースすることはできた訳で。なぜセンサを増やすかというと、コースを正確に早く走れるようにする為であり。その為にはコースのルールがはっきりしていないといけない訳で。

リアルのライントレース競技では、大会ごとにいろいろなルールの違いがあるようです。違いとしては、十字路、直角コーナー、鋭角コーナーなどのありなし、など。そのなかでも多く見かけた、「ラインは、直線と円弧の組合せで構成。ラインは交差することがある。」の条件でコースを作ります。

と思ったけど、ヴイストン株式会社さんのビュートレーサーというライントレースカー用のコースがダウンロードできたので、使わせてもらいました。(ヴイストンさんには、掲載許諾をもらっています)

なので、コース条件は、「ラインは、直線と円弧と直角と鈍角と鋭角(ジグザグ部分がそれにあたる?)の組合せで構成。ラインは交差することがある。」になりました。

ただ、このデータはラインの一部がグレーになっていて、とりあえず今回はトレース処理だけをやりたかったので、その部分を黒に変更。ついでにラインそばにあったコーナーの説明の文字を削除しました(リアルなら文字の黒はしきい値の調整で無視できるのだろうけど、Scratchの場合は色に触れたかどうかで判断するので、文字で誤動作するかもしれないから)。

仕様

リアルのセンサ2つの場合、3通りのセンサ設置がある模様。境界線上か外側の事例が多そう。

  • ライン内に入るようにセンサを設置
  • ラインを外から挟むようにセンサを設置
  • ラインの境界線上にセンサを設置

今回のコースの場合、ラインの幅が一定でないので、境界線上に置くのは除外。

センサライン内ライン外
鋭角コーナー大丈夫(だと思う)別の線を誤認識してしまう?
十字路認識できない認識できる
コースアウト、途切れたライン認識できる認識できない

作る前の予想では、こんな違いで出そうな気がします。

でも、ビュートレーサーはラインの外側にセンサがついてるみたいです。

作成

とりあえず、鋭角コーナーが大丈だと予想したライン内センサーで作ります。

背景

コースの画像ファイルをアップロードします。

スプライト

今回も「cat2」を使います。目を、左は緑色、右は青色にして、センサの代わりに。もとの目の位置だとラインの内側に収まらないので、鼻の真横に移動して寄り目にします。

コード

右左のセンサともライン(黒)に触れている → 正しい位置なのでまっすぐ進む
左センサがラインからはみ出した(白に触れた) → 左にずれているので右回転する。
右センサがラインからはみ出した(白に触れた) → 右にずれているので左回転する。

ジグザグする幅を小さくしたいので、「センサがラインから離れたら(黒に触れてないなら)」でなく「ラインからはみ出したら(白にふれたら)」にしました。

テスト走行

直角コーナ直後の十字路はなんとかトレースできたけど、その後のジグザグでセンサが先のラインに触れて、逆方向に回りだし逆走してしまいました。

改善策

スプライトの回転軸を後ろにずらしてみる

リアルのライントレースカーは、駆動輪(ということは回転軸も?)が後ろの方にあって、センサが前の方にあります。

cat2 の回転軸は、前足の付け根ぐらいにあるので、後ろ足の付け根ぐらいに変更してみました。

× さっきは通過できた1つめの鈍角コーナーでセンサが誤動作してコースアウト。曲がり始めのときに、左センサがラインの右側にはみ出して、逆走してしまいます。

スプライトの回転軸を前にずらしてみる

逆に、両目(センサ)の間ぐらいにしてみました。

× ジグザグする幅がかなりおおきくなってしまいました。「色に触れた」があまり反応していない感じ。なぜだろう?

もっと寄り目にする

よく見ると、ジグザグの部分のラインの太さが両目の幅よりも狭かったので、さらに寄り目にしました。回転軸は最初の前足の付け根あたりに戻して。

× 回転軸を後ろにずらしたときと同じように、第一鈍角コーナーで逆走。

回転の判断条件を変える

「ラインからはみ出したら(白にふれたら)」から「センサがラインから離れたら(黒に触れてないなら)」にしました。寄り目、回転軸前足で。

×十字路を左折、ジグザグは最後のコーナーまでいったけど逆走。

コースとスプライトの比率

ふと、コースとスプライトとの比率は合っているのかが気になりました。

ヴイストン株式会社のビュートレーサーのサイズは長さ81mm。鼻先からおしりまでを同じサイズ(しっぽは含めない)にするには、写真の部分と同じ長さにすればいいので、スプライトの「おおきさ」を80にしました。センサは寄り目のまま。

×十字路を左折、ジグザグは最後から2番めのコーナーで左右のループに入りました。

あきらめる

もう少しプログラムを変更しようと思ったけど、いったんライン外側センサをためしてみます。

(つづく)