2025年1月27日

021-2.SPIKEプライムヒント集-第6回「交差したラインを走破するには?」

この連載ではロボットコンテスト(ロボコン)で役立つロボット作りのヒントを紹介していきたいと思います。ヒントを実感しやすいように、ここでは競技風の「お題」を出します。お題をクリアするロボットを作ってみましょう。自分の手を動かすことが大切です。この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」とSPIKEアプリ3を使用しています。(文/松原拓也)

◆ フィールドとロボットを作る

今回のお題は「ロボットで交差したラインを走破する」です。ここでは交差したラインのことを「十字路」と呼ぶことにします。 ロボットがスタート地点から出発したら、最初の十字路で右に曲がって、2番目の十字路で左に曲がり、ラインを抜け出したらゴールとします。
まずは競技フィールドを作ります。フリーソフトの「OpenOffice Draw」を使って十字路を描き、A4サイズの紙に印刷します。ラインの幅は2cmとしました。紙を2枚並べているので、余白の部分でラインが途切れています。

ラインをトレースする方法を考えてみましょう。
ロボットに付いているカラーセンサーが1個だけの場合、間違えて横方向のラインをトレースしてしまいます。横断することができません。 プログラムを工夫すれば、ラインを読み飛ばすことはできますが、事前にフィールドの情報を覚えておく必要があるので、融通のきかないロボットになってしまいます。
この問題の解決策として、カラーセンサーを2個使うことにします。 ただし、カラーセンサーは基本セットに1個しか付いていないため、もう1つカラーセンサーを入手する必要があります。 筆者の場合は拡張セットからカラーセンサーを入手しました。拡張セットについてはマイスターブログで紹介しているので参考にしてみてください。

ロボットを作ります。ラージハブに次のパーツを取り付けます。
ポートA:左側カラーセンサー
ポートB:右側カラーセンサー
ポートE:左モーター
ポートF:右モーター

ロボットの製作例です。 「取っ手」を付けたり、ケーブルを折りたたんだり、細かい工夫をしています。

◆ センサーの特性を調べる

せっかく完成したロボットですが、最初にセンサーの特性を知らないといけません。
特性を調べるため、センサーの位置を写真のように付け替えます。 横方向のラインに対して5cm手前にロボットを置きます。

センサーの特性を調べるためのプログラムです(doublesensor1.llsp3)。 カラーセンサーは反射光モードで使用します。
「相対位置」ブロックで移動きょりを測り、ロボットが1mm進むたびにセンサーの値をグラフに描きます。

プログラムを実行すると、ロボットが10cm前進→10cm後退して、元の位置に戻ります。

プログラムを実行するとグラフが描かれます。 グラフの縦軸はカラーセンサーの値です。横軸は時間ですが、ほぼ等速で移動していると仮定して、きょりを書き足してします(単位はcm)。
赤い線が右センサー、青い線が左センサーです。 ラインの中心を通過している時、左右のセンサーはどちらも白色を検出しています。

プログラムにブロック1つを追加します(doublesensor2.llsp3)。
「(左センサーの値)-(右センサーの値)」を計算して、その結果をグラフに描きます。

実行結果です。緑色の線が「(左センサー)-(右センサー)」の値です。 これを次のように解釈すると、ラインをトレースすることができます。
・値が0の場合→ラインの中心(そのまま直進すべき)。
・値がプラスの場合→ラインから左に出ている(右に移動すべき)。
・値がマイナスの場合→ラインから右に出ている(左に移動すべき)。
これでセンサーの特性を調べることができました。

◆ 十字路で止まって、せん回する

センサーの取り付け位置を元に戻して、 ロボットをスタート地点に置きます。 これからゴールまで移動するプログラムを作ります。

「左右のセンサーが両方とも黒色」であれば「十字路がある」と判定することができます。 タイヤが十字路の上に乗ったところで、ロボットをその場せん回をさせます。 そのため、十字路を検出したらロボットをすぐに止めず、少し余分に走らせます。

十字路で2回だけ曲がるプログラムです(doublesensor3.llsp3)。 「find_cross」はライントレースをしながら十字路を探すマイブロックです。 「比例制御」という技術を使ってライントレースを行っています。比例制御は目標までの差に比例してハンドル(進む方向)を操作します。変数「handle」にはハンドルの値を格納しています。変数「p_gain」は比例ゲインといって、比例制御の計算に使うための係数です。この値でトレースの度合いを設定することができます。 変数「black」に黒と判定するしきい値(30)を格納しています。 十字路を見つけたら、少し(5.6cm)だけ余分に前進してから停止します。 「turn」はその場せん回をするマイブロックです。 変数「degree」には、せん回する角度を格納します。

プログラムを実行した結果がこちらです。 ロボットが十字路で方向転換します。 途中でラインが途切れていますが、そのまま直進します。 ロボットがゴールの一歩手前まで移動したら止まります。 あとは、このまま10cmくらい前進すればゴールすることができます。しかし、ここでライントレースをしていないのは手抜きに感じてしまいます。十字路を検出してから余分に移動する処理も同じくライントレースをしていないので、手抜きっぽいです。

手抜きをしないで、常にライントレースをするように修正したプログラムがこちらです(doublesensor4.llsp3)。その結果、プログラムが2画面ぶんに増えてしまいました。 1画面目は先ほどとほとんど同じです。ライントレースの処理を他でも使うため、マイブロックに置き換えています。

2画面目のプログラムです。 「trace」は指定したきょりだけライントレースをするマイブロックです。変数「cm」の単位はセンチメートルです。ここでは十字路を検出せず、ライントレースだけを行います。 「trace_sub」はライントレースの処理をループ1回ぶんだけ行うマイブロックです。 先ほどのプログラムでは「~の向きに移動開始する」ブロックで移動する向きを設定していましたが、動きがガクガクしてしまうので、「~% ~%のスピードで移動開始する」ブロックに変更しています。

プログラムを実行すると、ロボットがゴールまで移動しました。 これでお題をクリアすることができました。

出来上がったロボットをオーバルコースに置いてプログラムを実行してみました。十字路が見つからないので、果てしなくライントレースを続けます。 ただし、今回作成したライントレースの処理はまだ改良の余地があります。次回には詳しく紹介したいと思います。

今回作成したプログラム(SPIKEアプリ3用)

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