2024年12月17日

013-1.EV3ライントレース入門-第6回「色を検出しながらライントレースをする」

この連載では「教育版レゴ マインドストームEV3基本セット」を使ったライントレースロボットの作り方を紹介していきたいと思います。ライントレースロボットはその名のとおり「線(ライン)を追跡(トレース)」するロボットのことです。(文/松原拓也)

◆ 「色」を使ったライントレースのお題

今回がライントレース入門の最終回となりますので、できるかぎり難易度の高いお題を考えてみたいと思います。そこで「色を検出する」「ライントレースを中断する」という機能が必要なコースを考えてみました。 これはロボット競技ではおなじみのお題です。 楕円コースの途中に赤色の紙を配置します。

赤色の紙のサイズは5cm×5cmです。のりは付いていないので、そのままラインの上に置くだけです。

今回のお題を考えてみました。これは手を使ってロボットを動かしながら撮影したイメージ写真です。 まず、ロボットがライントレースをします。床面の赤色を検出すると、ロボットは向きを変えて、意図的にコースアウトします。あとは、ロボットが180度向きを変えて、元の位置に戻って、ライントレースを再開します。かなり複雑な動きですが、これをプログラムで実現するにはどうしたらいいでしょうか。

◆ 「色」と「反射光の強さ」を同時に検出する

では、技術的な課題をクリアしていきましょう。
ロボットが色を検出する方法を考えます。 すでに搭載している2個のカラーセンサーは「反射光の強さ」モードで使用していますので、カラーセンサーを新たに追加して、それを「色」モードに割り当てる必要があります。 しかし、3個目のカラーセンサーを用意するというのは、お金の負担が増えますし、ロボットの構造が複雑になってしまいます。
そこで、カラーセンサーを増やさない方法を考えてみましょう。センサーのモードを「色」←→「反射光の強さ」に切り替えながら読み取ることにします。こうすると、今までと同じようにカラーセンサーが2個だけで動かすことができます。今回は色を読み取る対象物が大きいので、モードを切り替えるセンサーは1個だけです。当然ですが、片方のモードにセンサーを切り替えていると、もう片方のモードで使うことができません。このため、センサーの見落としが発生しやすくなってしまいます。

突然ですが、予想外の問題が発生しました。
PORTVIEWでカラーセンサーの色モードを確認してみたところ、赤色の紙を近付けても「1(黒)」と認識されてしまいます。なぜかカラーセンサーが正しく動作しません

原因は床面に対してカラーセンサーが遠すぎるからです。
そして、センサーと紙のきょりを1.5cmくらいに調整すると、正しい値の「5(赤)」が表示されました

そこで、センサーの位置を下げることにしました。写真のように2つのセンサーの取り付け位置を1ポッチ下に移動させます。
この変更によってライトの光が小さくなってしまい、感度が敏感になってしまっています。これはロボットの動きに大きく影響しますので、あとで調整します。

このように紙が床面にあっても、正しく検出できるようになりました。

◆ カラーセンサーのモードを高速に切り替える

本当に1つのセンサーで「色」と「反射光の強さ」を検出できるのか、実際に確認してみましょう。床面の色を検出しながらライントレースをするプログラムを作ってみました(linetrace1.ev3)。 前回との違いとして、ゲイン(変数gain)の値が2→0.5に減っています。カラーセンサーの取り付け位置が下がったため、センサーの感度が上がりましたので、それを調整するために減らしています。 プログラムはループが2重になっています。 内側のループでは「反射光の強さ」モードでライントレースの処理を行っています。外側のループでは「色」モードを使って検出しています。こうしてカラーセンサーのモードを高速に切り替えるという仕組みです。 今回の場合、色を検出する処理よりもライントレースの処理の方が重要です。そこで、内側のループを200回実行させています。

プログラムを実行した様子です。
ロボットがラインをトレースをします。途中、赤色の紙を通過すると停止します。センサーが正しく読み取れるか心配でしたが、問題なく動作しました。 実行中、カラーセンサーのライトの色は「赤」「白」に激しく切り替わります。

このプログラムでは「反射光の強さ」モードが200回に対して、「色」モードは1回しか実行されません。このため、色の反応速度は少しにぶくなっています。何度か実行してみましたが、ロボットが停止する位置が安定していません。しかし、今回は高い精度を求めていないので、このままで良しとします。

◆ ロボットの移動とせん回

最後に残った技術的な課題をクリアします。
ライントレースを行わない状態でロボットが移動するためのプログラムです(linetrace2.ev3)。
「数学」ブロックを使って、モーターの回転角度を計算します。そして、「ステアリング」ブロックを使って移動やせん回を行います。

プログラムを実行した結果がこちらです。ロボットが19cm前進して、その後、90度時計方向にせん回します。これでラインから外れた状態でもロボットを動かすことができます。

◆ プログラムの完成

以上の技術を組み合わせて、完成したプログラムがこちらです(linetrace3.ev3)。「色の検出」「ラインのトレースの中断」機能が組み込まれています。
プログラムのサイズが大きくなりましたので、見やすくなるようにマイブロックを使いました。

マイブロック「trace」の内部のプログラムです。
ここではライントレースの処理を行っています。ループの実行回数は100回にしています。このループ回数が多いほど、ライントレースの能力は増しますが、色に反応するタイミングがズレやすくなります。

マイブロック「move」と「turn」の内部のプログラムです。 マイブロック「move」には前進したいきょり(単位はmm)を入力します。
そして、マイブロック「turn」にはせん回したい角度(単位は度)を入力します。

プログラムを実行した結果がこちらです。最初、ロボットがライントレースをします。床面の赤色を検出すると、赤色を検出した瞬間には「RED」としゃべり、8cmほど通りすぎます。これはせん回した時に位置がズレるのを防ぐためです。 そして、90度向きを変えて、19cmほど移動します。ロボットがコースの中央に到着すると「HELLO」としゃべります。その後、180度向きを変えて元の位置に戻ったら、ライントレースを再開します。
考えたとおりに動かすことができました。 これらの技術はロボット競技にも応用できると思います。

細かい話になりますが、ライン上の赤い紙はロボットが通過するさいに位置がズレてしまうため、セロハンテープで固定しました。粘着力が強力なテープだと、剥がした時にコースに傷がついてしまいますので、粘着力の弱いテープを使いましょう。

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。