2025年1月27日

021-2.SPIKEプライムヒント集-第5回「目当ての色のブロックだけを運ぶにはどうすればいいか?」

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

◆ カラーセンサーを追加する

今回のお題は「ロボットで緑色のブロックをゴールまで運ぶ」というものです。
そのままだと簡単すぎますので、ブロックの並びはランダムに置くこととします。このため、ロボットにはカラーセンサーを搭載する必要があります。

前回作成したグリッパー付きのロボットにカラーセンサーを取り付けてみました。
カラーセンサーはポートAに接続します。

ブロックとカラーセンサーとのきょりは1ポッチくらいです。この状態でブロックがぶつからないか心配でしたが、実際にブロックを持ち上げてみると全く問題ありませんでした。

グリッパーの先端とカラーセンサーの取り付け位置には若干のずれがあります。このずれのおかげでブロックは衝突しないで済んでいるようです。

◆ リスト機能を使う

今回はブロックの色を読み取って記憶するさいに「リスト」という機能を使います。リストというのは複数の情報をまとめて格納できる特殊な変数のことです。他のプログラム言語では「配列」と呼んだりします。
リストを使うには変数のカテゴリにある「リストを作る」というボタンをクリックします。そして、リストに名前を付けます。作りたてのリストには何も情報が入っていません。

リストに情報を追加するプログラムの例です。 この例の場合、5つの要素を追加しています。実行後もリストの中身は残るので、プログラムを実行するたびに要素が増えてしまいます。
リストの中身を消したい場合には「~のすべてを削除する」というブロックを実行します。

いよいよここから本題です。ロボットを25cm走らせて、それと同時にカラーセンサーを読み取ります(list1.llsp3)。
モーターの「相対位置」ブロックを使って、ロボットがスタート地点からどこまで進んだかをmm単位で検出します。そして、ロボットが1mm前進するごとにカラーセンサーの値をリストに追加します。これでカラーセンサーの測定結果を1mm単位で記録します。

プログラムを実行しました。ロボットが25cm前進して止まります。
果たして変数の中身はどうなっているのでしょうか。

実行後の変数の中身です。
変数「length」にはロボットの現在位置が格納されています。この値はスタート地点を「0」として考えます。単位はmmです。
リスト「list」にはカラーセンサーの測定値が格納されています。インデックスの値はロボットの位置に対応しています。たとえば、「listの60番目の値が9」の場合、「スタート地点から60mmの所で赤色を検出」したという意味です。

◆ リストを検索する

無事に測定することができましたので、 今度は目当てのブロック(ここでは緑色)のある場所までロボットを動かします(list2.llsp3)。プログラムが大きくなってしまったので、2つの画面に分けています。
写真中央にある「search_color」はリストを検索するためのマイブロックです。ここでは引数を「6」とすることで緑色のブロックの位置を探します。
その下にある「((result-20)-length)/10」という計算式に注目です。変数「result」には目的のブロックが存在する位置が格納されています(単位はmm)。変数「length」はロボットの現在の位置です。「20」というのはグリッパーの先端とカラーセンサーの取り付け位置とのきょりです。

2画面目のプログラムです。
目当ての色を検索するマイブロック「search_color」です。ここではリストの要素をすべて比較します。
比較した結果、該当する要素は複数存在します。そこで、平均化して、最も適切な位置を求めています。

プログラムを実行すると、ロボットがゴールまで進みます。
それからバックして目的のブロックのある場所に戻ります。グリッパーの先端がブロックの中心で止まります。

ちょっとイジワルをして、ブロックの位置をずらしてみました。それでも、グリッパーの先端はブロックの中心で止まります。
平均化することで、ここまで正確に位置を合わせることができるわけです。もはや、5cm単位の目盛りにブロックを置く必要はありません。

続いて「グリッパーを持ち上げる処理」と「ゴールに行く処理」と「グリッパーを下げる処理」を追加しました(list3.llsp3)。

ロボットが緑色のブロックをつかんでゴールまで運びます。
これでお題をクリアすることができました。

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

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