2025年1月27日

022-1.SPIKE&AIカメラ入門-第6回「タイヤ付きのロボットを作る」

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

◆ ロボットを作る

前回はハスキーレンズとラージハブを直結して制御することに成功しました。
今回はタイヤとモータを取り付けて、ロボットとして動かしてみたいと思います。次のようにロボットを作ります。
・ハスキーレンズ:ポートA
・左モータ:ポートE
・右モータ:ポートF
なお、この例ではハスキーレンズのカバーやマウントを3Dプリンタで自作しています。 カバーのCADデータはロボジョイくらぶのブログで公開しています。
もし、3Dプリンタがないという場合はむき出しで使ってかまいません。

反対側から見た様子です。うしろにはボールキャスターが付いています。

SPIKEアプリでロボットを「その場せん回」させるプログラムを作ります(motorpair.llsp)。

プログラムの仕組みを紹介します。 円Aは「その場せん回」をした時のタイヤの通り道です。円Bはタイヤの輪かくです。 タイヤ間のきょりを8cm、タイヤの直径を5.6cmと仮定します。円Aの円周の長さは「8×円周率」。円Bの円周の長さは「5.6×円周率」です(単位はcm)。
円Aは円Bよりも(円A÷円B)倍ほど大きいです。このことを考えると、モーター(タイヤ)を動かすために必要な角度は「せん回させたい角度×(8×円周率)÷(5.6×円周率)」となります。この式は「円周率」がかけ算と割り算に1組存在していて、互いを打ち消し合います。式を簡単にすると「せん回させたい角度×8÷5.6」となります。

プログラムを実行すると、次の動きをします。
(1)15cm前進。
(2)180度、その場せん回。時計方向に回ります。
(3)15cm前進。
うまく動きました。写真を見ると、最後が少しだけせん回の角度が足りていません。回転がロスして、計算値とのズレが生じています。数式の値を修正したほうがいいかもしれません。

◆ 追いかけるプログラム

続いて、物体を追いかけるロボットのプログラムを作成します(HuskyLens_robot.llsp)。まずはカメラの性能を確認します。 ロボットの20cmほど手前に物体(ミニフィグ)をかざしてみました。カメラにちょうどいいサイズに写ります。性能的にはこれくらいの位置のものを追いかけることができます。床に置いてしまうと、カメラには写りません。

ロボットが認識した物体を追跡するプログラムです。 ハスキーレンズで物体を認識して、X座標を求めます。そして、その座標からせん回する角度を求めて、左右のモーターを動かします。 先ほど作ったその場せん回の関数を組み込んでいます。

X座標から角度を算出するには、比(ひ)を使います。
カメラの中心の角度を0度。 カメラの右端の角度を+W度、左端の角度を-W度として考えます。 認識した物体のX座標は0~319なので、中心のX座標はおよそ160です。 そこで、「(X座標-160)*W/160」の式で角度を求めることができます。
Wの値は15度と仮定しました。これから実験を重ねて、正確な値に修正することができます。

さらに、プログラムの工夫として、 ハスキーレンズやモーターのポートの割り振りを変数に格納してみました。 これで、将来、接続するポートが変更になっても変数の中身を書き換えるだけで対応することができます。

プログラムを実行してみます。 カメラの前に物体をかざすと、その方向にロボットがせん回します。
うまく動きました。

次回はライントレースロボットを作ってみたいと思います。
今回作成したプログラム(SPIKEアプリ用)

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