2025年1月27日

022-1.SPIKE&AIカメラ入門-第8回「ライントレースロボットを動かす」

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

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

前回に引き続きハスキーレンズを使って、ライントレースロボットを作ります。
まずはロボットの手直しを行います。前回の時点でロボットの足元が撮れていないことが判明していたのですが、そのままではライントレースを行うには問題があることがわかりました。そこで、ハスキーレンズの位置を後ろに動かしました。さらにコネクタのパーツを改良して、配線をすっきりさせています。

ハスキーレンズはラインを2つの座標(HeadとTail)として捕らえます。この座標から角度を求めます。角度を算出するにはatan2関数を使います。atan2はアークタンジェントを求める関数です。関数の書式は「atan2(Y軸の移動量,X軸の移動量)」です。アークタンジェントは大学あたりで登場する知識なので、ちょっと難しいかもしれません。atan2関数の戻り値はラジアンという単位です。ラジアンは扱いにくいのでdegree関数を使って、度数に変換します。
ここで求めた角度は右方向を「0度」として考えています。ロボットのプログラムを作る時は上方向を0度としたほうが使いやすいので、角度を90度足すことにします。

atan2関数のテストをするプログラムです。 実行すると、X軸とY軸の移動量から角度を算出します。 たとえば、X移動量=3、Y移動量=-3の場合、角度は45度となります。

ライントレースロボットのプログラムです。 角度を求めて、モーターのパワーを設定します。角度に比例してパワーを制御していますので、これを比例制御といいます。

プログラムを実行してみると、見事に失敗でした。
どうやってもロボットがコースアウトしてしまいます

なぜコースアウトしてしまうのでしょうか? ロボットの動きを観察して、以下の結論にたどり着きました。
原因はカメラが遠くを撮りすぎているためだと思います。遠くにあるカーブに反応してしまい、進路を早く変えすぎてコースアウトしてしまいます。
ハスキーレンズは「まっすぐ進んでから、最後に曲がるライン」でも「一直線のライン」として返してしまうのですが、これが問題です。こちらの都合としては「最後に曲がる」という部分を無視して欲しいのですが、ハスキーレンズにはそういう細かい設定ができません。
カメラの角度を変えれば解決できるのですが、それだと、面白くないので、ソフトウェアで解決してみたいと思います。

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

その後、試行錯誤を繰り返して、ロボットがコースアウトしないプログラムができました。それがこちら。
ラインのトレース方法を2種類に分けてみました。 1つはTailのX座標だけで比例制御を行う方法です。カーブが遠くにある場合、この方法で走ります。Headの情報を使わないので、カーブを無視することができます。
もう1つはラインの角度による比例制御です。最初に試した方法と同じです。カーブが近くにある場合、この方法で走ります。「カーブが近い」か「カーブが遠い」かはHeadのY座標で判断しています。

プログラムを実行すると、このとおり。 ロボットがコースを周回できるようになりました。成功です。
ロボットの走りが若干ガクガクしているのが気になるのですが、ハスキーレンズとの通信に時間がかかってしまうのが原因のようです。プログラムを改良すれば、もっと上手に走らせることができるかもしれません。

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

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