2025年1月27日

022-1.SPIKE&AIカメラ入門-第7回「ラインを検出する」

この連載では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」と「ハスキーレンズ(HuskyLens)」を組み合わせたロボットの作り方を紹介したいと思います。ハスキーレンズとはDFROBOT(Zhiwei Robotics Corp.)というメーカーが開発した特殊なカメラ(AIカメラ)です。このカメラを使って、物体追跡、物体認識、ライン追跡などの機能を備えたロボットを作ってみましょう。この連載では最終的にハスキーレンズをSPIKEプライムのラージハブに接続して動かしたいと思います。
ハスキーレンズの基本的な情報については、メーカーのWikiページを読むことをオススメします。ページのURLは以下のとおりです。
https://wiki.dfrobot.com/HUSKYLENS_V1.0_SKU_SEN0305_SEN0336(文/松原拓也)

◆ ライントレースロボットを作る

ハスキーレンズを使って、ライントレースロボット(線の上を走るロボット)を作ってみたいと思います。今回はロボットの動作テストまでを紹介します。
前回まではハスキーレンズの「Object Tracking(物体追跡)」という機能を使っていましたが、今回は「Line Tracking(ライン追跡)」という機能を使います。 ハスキーレンズの電源を入れたら、機能ボタン(押し込みと左右の操作)で、モードを「Line Tracking」に設定します。最初、ハスキーレンズの画面内には矢印がめちゃくちゃに表示されますが、これはまだラインを学習していないのが原因です。 学習させたいラインにカメラを向けて、学習ボタンを押します。すると、画面内の矢印が白色→水色に変化して、矢印が安定します。 学習した内容を消すには学習ボタンを2回押します。

この例ではアフレル製のA3サイズのオーバルコースを使用しています。このコースは中央に黒い四角形が塗られているのですが、これをラインだと誤認識してしまいます。ライントレースロボットを動かす時にはじゃまになるかもしれません。

ロボットにカメラを取り付けます。
カメラを下方向に45度傾けてみました。45度に曲げるパーツは純正品です。カメラをねじで固定するパーツは3Dプリンタで自作しています。

これでライントレースロボットが出来上がりました。カメラとモーターは次のように接続しています。
・ハスキーレンズ:ポートA
・左モータ:ポートE
・右モータ:ポートF

カメラが撮ったコースの映像です。
ラインが曲がっている場合、このようにショートカットしたように矢印が表示されます。
この情報をどう処理してロボットを走らせたらいいのか。さらに、カメラの取り付け位置がこれで正しいのか、今の時点ではまだわかりません。 次回には実際にロボットを走らせて、確認してみたいと思います。

カメラがどの部分を撮影しているのかを数学的に考えてみましょう。
カメラの取り付ける角度は45度です。そのため、「カメラ」「カメラの真下の床」「被写体の中心」の3点を結ぶと、直角二等辺三角形になります。 「カメラの取り付ける高さ」と「カメラの真下の床から被写体の中心までのきょり」(辺a)は同じです。a×ルート2の数式で、カメラから被写体までの直線きょりを求めることができます。

◆ ライン検出のプログラム

続いてカメラの動作テストのプログラムを作ります。
ラインを追跡するには「Arrow」というデータ構造を使います。ArrowはHead(矢印の先端)とTail(矢印の尾)の2点で構成されています。HeadとTailには、それぞれに座標が割り振られています。 プログラムの中では、Headの座標を(objx1,objy1)、Tailの座標を(objx2,objy2)という変数に格納することにします。

ラインを追跡するには、ハスキーレンズに対してコマンドを送信します。 それに対して、ハスキーレンズはレスポンスを返信します。ライン追跡の成功/失敗は、レスポンスの6~7バイト目の値で判断することができます。 ラインが見つからない(失敗)場合、レスポンスは全部で16バイトです。ラインが見つかった(成功)場合、レスポンスは32バイトです。レスポンスの中には、HeadとTailの座標とIDが含まれています。

プログラムはSPIKEアプリのPythonを使って作ります。
処理の重要な部分を紹介します。

プログラムを実行すると、このようにカメラが検出したラインの座標が表示されます。IDは常に1なので意味がないと思います。 ラインが見つからない場合には「NotFound」と表示されます。
筆者の場合ですが、ハスキーレンズとの通信に失敗するというトラブルが突然発生しました。ハスキーレンズの通信設定を「Auto Detect」ではなく「9600baud」に変更すると、正常に通信できるようになりました。もし同じ現象が発生した場合には試してみてください。

次回にはロボットを走らせてみたいと思います。
今回作成したプログラム(SPIKEアプリ用)

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