小・中学校の授業や、多くのロボット・プログラミング教室で採用されているライントレースカーについて、その動作をコンピューター上だけで再現できるようなシミュレーションプログラムを作成し、公開しています。







はじめに


ライントレースカーとは、描かれた線に沿って動く車のことです。異なる線の上にのせれば、装置の設定を変えなくても、描かれた線に沿って進むように設計されています。線の太さや色、形などにある程度のきまりはあるものの、基本的にはどのような線を描いてもその通りに動いてくれます。このようにわかりやすい動作をするものが、センサー数個とプログラミングの知識が少しあればできるので、多くのロボット・プログラミング教室で教材として採用されています。また、以下のような組み立てキットも販売されています。

ライントレースカーは、センサーを使って動きを調節する仕組みを使って動作しています。センサーとは、まわりの状況を感じることができる装置のことです。センサーを使って「もの」の動きを調節する仕組みをもつものは、身のまわりに結構あります。例えばエアコンの場合、部屋の温度が設定より高いと温度のセンサーが感じるとエアコンは部屋の温度を下げるように強く働きますが、設定温度近くになると温度を下げる働きは弱くなります。最近では、人がいる場所をセンサーが感じ取ると、人に直接風をあてる(ない)ように風向きを変えたりします。このように、最新の電化製品には、何かのセンサーが組み込まれていることがほとんどです。

「おもちゃ」として遊ぶだけでしたら、組み立てて遊んで終わり、で十分でしょう。ただ、センサーを使って「もの」の動きを調節する仕組みを学ぶために、ライントレースカーはとてもよい材料です。ただし、その仕組みを1回組み立てただけで完全に理解できる人はいないでしょう。仕組みを理解するためには、与えられた指示通りに組み立てるだけでなく、自分でいろいろな部分を変えて試してみることが必要です。1回作ったライントレースカーをもう一度分解したり、装置の設定をいろいろと変えてみたりするのも1つのやり方です。ですが、この方法だと、異常な設定や不適切な取り扱いにより、装置の部品が壊れたら終わりです。一方で、私の作ったようなコンピューター上で動くライントレースカー(私の場合「カー」ではなくて「ねこ」です)ならば壊れる心配はありませんから、装置の設定を自由に変えて、動きの変化を確かめることが容易にできます。たとえ動かなくなっても、プログラムを元に戻せば元の動作に戻ります。このように、ライントレースカーのシミュレーションプログラムの利用は、その仕組みを理解するために都合がよいと思います。


ライントレース「ねこ」のプログラム


まず最初に、緑のはたを押すと、3種類あるグレーのラインからランダムに1種類が選ばれます。次に、ねこを押すとねこが動き出します。どのラインも周回コースなので、プログラムの実行を止めない限り、ねこはずっと進み続けます(ラインを外れたら止まるようにプログラムされています)。動きが遅い(!)ので、大したコースではありませんが一周するのにかなりの時間がかかります(2分40秒~3分30秒)。プログラムの実行を止めるには、画面左上の赤ボタンを押してください。

(ごくまれに、ボックスの中に広告が表示されてしまうことがあります。このときは、ページを再読み込みすると、広告が別の場所にうつってくれます。)


--- ここに画面が表示されます ---


こちらのスクラッチのサイトでも見ることができます。


わたしがつくったラインだけでなく、自分で描いたラインにそってねこを動かすこともできます。その時は、こちらのスクラッチのサイトで以下の手順に従ってもらえば(おそらく)うまく動いてくれると思います。

  1. 「ライン」の「コスチューム」を追加する。
  2. 「コスチューム」の名前を「4」にする。
  3. 太さ「30」のラインを、スタート地点のねこのところを通るように引く(色は何でもよい)。
  4. 「ライン」の「コード」で「1から3までの乱数」を「1から4までの乱数」に変更する。
  5. 自分の描いた「ライン」が出てくるまで、何回か「緑のはた」を押す。
  6. ねこを押す

なお、このプログラムの初期設定では、急角度を曲がることはできません。適切に設定値を変えてやればうまく曲がるようになるかもしれませんが、そこまではサポートしません。あしからず。




ねこがラインの上を進む仕組み


センサーとは


センサーとは、音や光、温度など、モノの状態を調べることができる装置のことです。ここで使われるセンサーは、紙の上などに引かれた線があるところを見つけられるような装置です。最も簡単な例として、白い紙の上に書かれた黒い線を見分けることができるしくみについて簡単に説明します。

色の白黒の違いは、その表面で反射する光の量の違いです。白い部分に光を当てると、多くの光は反射して戻ってきます。その結果、白の面から光がたくさん出ているように見えるため、明るくなります。一方で、同じ量の光を黒い部分にあてると、かなりの量の光が黒い部分に吸収されてしまいます(吸収された光は熱に変わります)。反射して戻る光はわずかしかありません。すなわち、黒い面からは光が少なくしか出てこないため、暗く見えることになるのです。

このことを利用すると、黒と白の部分の区別をすることができます。光を紙に当てて、反射してくる光の量を計測します。反射して戻ってくる光の量が多ければ光を当てた部分は白、反射して戻ってくる光の量が少なければ黒となります。この程度のしくみであれば安価で製造することができるので、実物のライントレースカーなどでも利用されています。

なお、ここで提供するプログラム上で動くライントレースねこの場合は、本物のセンサーをつける必要はありません。異なる2つのものが接触したことをプログラム上で検出することができます。




組み合わせたセンサーのはたらき


このプログラムにも、センサーのようなはたらきをする部分がねこのまわりに5か所ついています。その状態をわかりやすく表しているのが、プログラムの画面左上にある、5つの〇と矢印です(下の図の左)。

それぞれの〇は各センサーの状態を表しています。矢印がネコの進む向きを表しています。ねこの向きが変わるにつれて、矢印と〇の向きも変わります。センサーは、ねこのまわりに5コついています。どれも小さくて見えにくいですが、ねこの左手の近くにある小さな黒い点がセンサー2です(上の図の右)。残りの4つのセンサーは「ねこ」の下にかくれています。およその場所は赤い〇つきの数字で表しています。センサーが黄色になっている場合、そのセンサーがラインの上にあることを示しています。一方、センサーが白くなっている場合は、そのセンサーがラインからはずれた位置にあることを表しています。上の図の場合、センサー0、2、4はラインの上にありますが、センサー1と3ははずれています。ですから、センサー0、2、4だけが黄色くなっています。これら5つのセンサーの状態から、ねこの進む速さと方向を決めています。したがって、ねこが進むだけでなく、5つのセンサーもねこにくっついて動きます。むしろ、5つのセンサーがついた透明な車が、足踏みをするねこを乗せながら、センサーの状態に応じて進んでいるようなイメージのほうが正しいかもしれませんね。

センサーは、0と1~4で役割が異なります。センサー0は全体の中心にあり、これがライン上にあるときは、ねこはラインから大きくずれていることはありません。逆に、センサー0がライン上にない時は、ねこがラインから外れかかっていることを表します。一方で、残りのセンサー1~4は、ラインの方向にねこを向けるために使います。センサー1と2は前方、センサー3と4は後方に配置されています。1と2または3と4の間はラインの幅より大きくなっています。したがって、ねこが真ん中でラインと同じ方向を向いているときは、センサー0だけが反応します。それ以外の状態のときは、ねこがラインに対して不適切な位置にいると考えられます。以下に、ねこの方向を決めながら進む方法を解説します。以下、センサーが「オン」(黄色)のときはセンサーがライン上にあることを表し、「オフ」(白)のときはセンサーがライン上にないことを表します。

A. センサー0が「オン」で、方向の修正が必要ない場合
前に述べたように、センサー0だけが「オン」のときは、ねこがラインの真ん中で、ラインの方向に向いていることを表します。この場合は、向きはそのままで、大きく真っすぐ進めばよいことになります。

(センサーは、わかりやすくするために大きく描いてあります)
また、以下のように、センサー1と2が同じでセンサー3と4が同じときは、センサーの状態だけから進行方向に対する傾きを判断できないので、直進します。


B. センサー0が「オン」で、方向を修正する場合
センサー0が「オン」なので、ねこはラインの中心付近にはいるものの、向きがラインの方向とは異なる場合は、センサー1~4の状態に応じて向きを変えます。以下のような場合、進行方向に対して左へ曲げます
  • センサー1が「オン」、センサー2が「オフ」の場合
  • センサー1とセンサー2が異なる状態をとる場合、センサー3と4の状態がどのような場合でも、進行方向に対してねこが傾いている向きは決まります。
    (0・1・3が「オン」の状態の例)

    (その他の場合)


  • センサー1とセンサー2が同じ状態で、センサー3が「オフ」、センサー4が「オン」の場合
  • センサー1と2が同じ状態でも、センサー3と4が異なる状態をとっていれば、ねこは進行方向に対して傾いています。

    (その他の場合)


    これ以外の場合は、進行方向に対して右へ曲げます。また、方向を修正するときは、進む速さも直進のときよりも遅くします。なぜならば、間違った方向のままでどんどん進むとラインから外れやすくなるためです。

    C. センサー0が「オフ」で、方向を修正する場合
    センサー0が「オフ」なので、ねこはラインの中心から外れています。このままではラインから外れてしまうので、大きな軌道修正が必要です。曲げる向きは、先ほどと同様にセンサー1~4の状態で決めます。曲げる角度はセンサー0が「オン」のときよりも大きくする一方、進む速さはかなり遅くしなければなりません。

    D. センサー0~4の全てが「オフ」の場合
    この状態は、全部のセンサーがラインから外れてしまったことを表しています。こうなると、次にどのように動かすべきかを決めることができません。したがって、このような状態になったらプログラムの実行を停止します。



    プログラムの解説


    以下のプログラムは、複雑な数式や、難解なアルゴリズムを使わずに作成しています。条件分岐さえ理解できれば、小学生でも十分に作成可能なレベルです。ライントレーサーは、多くの人がつくっているので、それこそもっと洗練された方法はあります。しかし、こんな単純な方法でも十分なライントレーサーになるのだという一例としてご覧いただければありがたいです。


    初期設定


    緑のはたを押すと、プログラムが開始します。このプログラムは、開始しただけでは何も起きません。最初に、さまざまな動きを制御するいくつかの数字を決めます。まず、ねこのプログラムから。


    このプログラムでは、3つのラインから1つを選ぶようにしています。そこで、どのラインもスタート地点を共通の場所にしておけば、そのあとのラインの形が異なっても問題ありません。ここでは、そのスタート地点がこのプログラムではx座標が0、y座標が-120の位置になっています。そのスタート地点に、右側(90度の向き)を向いた透明な箱をおき、そこにねこと5つのセンサーを取り付けるような設定になっています(①)。

    次に、1回の操作で進む距離(速さに相当)と、方向を変えるために曲げる角度を決めます。これらは、上で説明したように、センサーの状態に応じて3通り考える必要があります。「A. センサー0が「オン」で、方向の修正が必要ない場合」はもっとも速く進んでよいので、このときの1回の操作で直進する距離は「高速」に入力します(②)。「B. センサー0が「オン」で、方向を修正する場合」では方向の微調整が必要なので、曲げる角度を「ゆるやかな回転」、1回の操作で直進する距離は「中速」に入力します(③)。「C. センサー0が「オフ」で、方向を修正する場合」では大きな軌道修正が必要なので、曲げる角度は「急回転」、1回の操作で直進する距離は「低速」に入力します(④)。


    次は、センサーのプログラムです。代表してセンサー0のプログラムを説明します。他のセンサーも同じようなプログラムです。

    まず、ねこと同じように、スタート地点においた透明な箱にセンサーをつけます(①)。次の部分は、センサーとしての動作を表しています。もし、このセンサーがラインに触れていたら、「センサー0」という変数に1を入れ、ラインに触れていなかったら0を入れるようにします(②)。


    最後にラインのプログラムです。

    ラインは、ライントレースの機能としては何もしていません。プログラムは、最初に3つのラインから1つをランダムに選ぶためのものです。ラインは、ねこやセンサーよりも下にあるものですから、最初に最背面に移動しておきます(①)。次に、ラインが3通りあるので、1~3のいずれかの番号を乱数で選びます(②)。番号が各ラインの名前になっているので、選ばれた番号のラインを呼び出します(③)。


    これで、ねこを動かす準備ができました。




    ねこ(とセンサー)を動かす


    ねこが押されたときのプログラムを解説します。以下は、その前半部分です。

    最初の「すすんだ距離」は、プログラムの本質には関係ありませんが、ねこが「歩く」ように見せるためにするプログラムで使う変数です。これを「0」に初期化します(①)。この変数は、別の場所で使います。

    これ以降のプログラムは、ねこがどの方向へどれだけ進むかを決める部分です。したがって、ねこが動くたびに次の動きを判断しなければならないので、ねこが動く限りずっと実行される部分です(②)。組み合わせたセンサーのはたらきで説明したように、最初にセンサー0の状態で判断します。③の部分は、すべてセンサー0が「オン」のときのプログラムです。センサー0が「オン」で、センサー1と2が同じ、センサー3と4が同じならば直進です。すなわち、曲がらず(曲がる角度が0)で、「高速」で進むことができます(④)。そうでない場合は、方向を微調整しながら進みます。もし、センサー1が「オン」でセンサー2が「オフ」(センサー1>センサー2)ならば、左方向に「ゆるやかに」曲げます。または、センサー1とセンサー2が同じでも、センサー3が「オフ」でセンサー4が「オン」(センサー4>センサー3)でも、左方向に「ゆるやかに」曲げます。進む速さは、方向を微調整しているために、「中速」になります(⑤)。センサーの状態が反対でしたら、曲げる方向を右にして、「ゆるやかに」曲げます。同様に、進む速さは「中速」です(⑥)。


    次は、ねこが押されたときのプログラムの後半部分です。

    ⑦の部分は、センサー0が「オフ」のときのプログラムです。まず、すべてが「オフ」の場合は、プログラムの実行を停止します(⑧)。そうでない場合は、大きく軌道修正する必要があります。先ほどと同様に、センサー1が「オン」でセンサー2が「オフ」(センサー1>センサー2)ならば、左方向に「急回転で」曲げます。または、センサー1とセンサー2が同じでも、センサー3が「オフ」でセンサー4が「オン」(センサー4>センサー3)でも、左方向に「急回転で」曲げます。進む速さは、大きな軌道修正中ですから、「低速」になります(⑨)。センサーの状態が反対でしたら、曲げる方向を右にして、「急回転で」曲げます。同様に、進む速さは「低速」です(⑩)。

    以上で、次のステップで曲げる角度と進む量を決めることができました。ここで、ねこと全てのセンサーを同じように動かすための命令を出します(⑪)。


    進む命令を受けるのは、ねことセンサーです。以下は、ねこを動かすためのプログラムです。

    ねこが移動の命令を受け取ると、先ほど決めた「曲げる角度」で方向を変え、「進む量」の分だけ前進します(①)。この部分は、センサーも同様です。ねこの場合は、歩いているように見えるように、イメージを交互に表示するためのプログラムが追加有れています。具体的には、3進むと、イメージが変わるようになっています(②)。ねことセンサーの動きがすべて終わると、前のプログラムに戻ります。センサーの場所が変わったので、センサーの状態も変化している可能性があります。その場所でのセンサーの状態から再び「曲げる角度」と「進む量」を決めます。この部分の操作が繰り返されることで、ラインに沿ってねこが動くようになります。