2025年1月27日

021-2.SPIKEプライムヒント集-第3回「カラーセンサーを正確に読み取るには?」

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

◆ 走りながら色を読み取るロボット

今回のお題は色の読み取りです。 ロボットが「25cmのきょりを移動して、色を正確に読み取る」ことができたら成功とします。
スタートからゴールまでの途中には5cm間隔にブロック(2×4ポッチ×2個)を置きます。 色の組み合わせはランダムです。

ロボットの製作例です。
ブロックの上を走れるようにロボットの車高を高くします。ブロックとカラーセンサーのきょりは2ポッチにしています。
この例だと、キャスターが1個だけで安定感が悪いかもしれません。拡張セットを持っている場合はキャスターをもう1つ付けたほうがいいと思います。

プログラムです(run_and_scan1.llsp3)。
ロボットの移動速度は秒速約10cmに設定しています。 色の認識結果をグラフに描きます。

プログラムを実行すると、ロボットが25cm進んで止まります。
秒速10cmなので、約2.5秒で走り終わります。

出力されたグラフがこちらです。グラフの横軸が時間[秒]、縦軸はカラー番号です。カラーセンサーは8つの色を認識できます(「なし」を含めて9種類)。ブロックのない時は「黒/白/なし」のどれかに認識されます。
青ブロックを読んだら「緑」と認識するような、見当違いの結果が出るかと思ったのですが、そうした誤動作は全く起こりませんでした。
無事にお題はクリアできたと思います。

◆ カラーセンサーの読み取り回数を測定する

次のお題は「カラーセンサーの読み取り回数を測定」します。レゴ エデュケーションの公式サイトによると、カラーセンサーのサンプルレートは「100Hz」=1秒間に100回のペースで色を取り込んでいると明かしています。
それとは別に、ここではカラーセンサーと通信できる回数を求めることにします。
プログラムです(run_and_scan2.llsp3)。25cmを秒速10cmで走って、カラーセンサーを読み取るのは前回と同じです。0.1秒おきに読み取り回数をグラフに描くという機能を追加しています。

出力されたグラフがこちらです。グラフの横軸が時間[秒]、縦軸はカラーセンサーの読み取り回数[回/秒]です。
なんとも不思議な結果になってしまいました。 実行してから最初の0.7秒くらいまでは400回/秒ものペースでカラーセンサーが読み取れています。 しかし、それを過ぎると、50回/秒くらいに激減してしまいます。これはラージハブのOS内部で起こっていることなので、原因を突き止めることができません。謎が残ったままですが、そういう仕様であると覚えておきましょう。

「カラーセンサーが1秒間に50回読める」というのは、 どういうことでしょうか。図で表してみました。
ロボットが秒速10cmで移動していて、ブロックのサイズが3.2cmだとすると、カラーセンサーがブロックを読み取れる回数は50×32÷100 = 16回です。
この回数を多いと見るか、少ないと見るか。

◆ RGBで色を読み取る

「RAWカラー」ブロックを使うと、RGBで色を読み取ることができます。RGBとは赤(Red)、緑(Green)、青(Blue)の略で、光の三原色のことです。
RGBを表示するプログラムです(rgb.py)。実行すると、画面にRGBの値を表示します。 SPIKEアプリ3の「RAWカラー」の値は0~1024でした。SPIKEアプリLegacyの「RAWカラー」では値は0~255だったのですが、仕様が変わったようです。
ここでは4で割って0~256に変換して使うことにします。

測定結果です。 対象物とカラーセンサーとのきょりによってRGBの値が大きく変わります。
カラーセンサーを正確に読み取るためには、 対象物とのきょりを適切に保つことが重要だとわかります。
レゴ エデュケーションの公式サイトによると、カラーセンサーとのきょりは16mm(2ポッチ)を推奨しています。

赤以外のブロックも読み取ってみました。
カラーセンサーのきょりは8mm(1ポッチ)にしています。

実際に測定した結果とデータテーブルの値を比較してみました。少し食い違いがあります。 実物のほうは青と緑の値にメリハリがありません。
データテーブルというのは、レゴ エデュケーションが公式ブログに公開しているカラーセンサーの色の見本です。おそらく、見本の値に近いほど、正確に色が認識されるのだと思います。
https://community.legoeducation.com/blogs/31/220

自前のアルゴリズムで色を判定するプログラムを作ってみました(color_recog.llsp3)。
RGBの割り合い(0~100%)を計算して、40%よりも大きかったら、その色と判定しています。この方法は赤、緑、青の判定には使えます。ただし、黄色や紫などを判定したい場合には別のしきい値を用意しないといけません。

◆ HSVで色を読み取る

RGBではなく、HSVという色の考え方があります。HSVでは色相 (Hue)、彩度 (Saturation)、明度 (Value)という3つの要素で色を作ります。
色を見分けるにはRGBよりもHSVを使ったほうが効率的です。 たとえば、「白っぽい赤」や「黒っぽい赤」があったとしても、色相は同じなので、どちらも「赤」と判定することできます。

カラーセンサーの読み取った色の色相を表示するプログラムを作ってみました(hsv.llsp3)。
RGBをHSVに変換する数式を使っています。色相は変数「h」に格納されます。

プログラムを実行します。 カラーセンサーでRGBを読み取って、色相(0~359)を画面に表示します。
例として、緑色のブロックを読み取ってみた結果, 「色相 = 151」の値が表示されました。

色相=151というと、だいたいこのあたりです。完全な緑ではなく、青っぽい緑です。

このプログラムをロボットに組み込んだら、色の認識がもっと正確になるのでしょうか。気になるところです。実際に試してみてはいかがでしょうか。 ここで一旦終わりにしますが、「色」についてはやるべきことが多すぎて、いくらやっても終わりません。ロボット競技は正解がないものなので、終わらなくて当然というべきでしょうか。

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

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