2025年1月27日

021-2.SPIKEプライムヒント集-第10回「ロボットの位置を求めるには?」

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

◆ ロボットとフィールドの準備

今回のお題は「ロボットの位置情報を求める」ことです。ロボットを移動させて、どの位置に居るのかを表示できたら、お題クリアとします。位置情報を求める方法として、自動車の場合はGPSを使いますが、SPIKEの場合はそうはいきません。そこで、計算を行ってソフトウェア的に位置を求めることにします。
まずはロボットを用意しましょう、前回作ったロボットからグリッパーを取り外します。今回はロボットのベースだけを使います。

続いて「OpenOffice Draw」というフリーソフトを使って、フィールドを描きます。A4サイズの用紙に1cm単位のマス目を描きます。見やすいように、線の色を5cmおきに濃くしました(作成したファイルはこの記事の最後で公開しています)。

A4サイズの紙に2枚印刷して、テーブルに貼ります。代わりに方眼紙(ほうがんし)で済ませてもいいかもしれません。
紙の位置がズレないように、定規やノギスを使って確認しましょう。 目盛りを書いたらフィールドの完成です。

フィールドはマス目の一番左上を原点とします。原点の座標は(0,0)です。原点から見て右側を「0度の方向」と決めておきます。

◆ 三角関数を使う

ロボットの位置を計算するため、「三角関数」を使います。三角関数とは角度から長さを求めたりすることができる関数のことです。三角関数は高校生の数学の授業で習うと思います。
写真は三角関数のsin(サイン)cos(コサイン)を使った実験的なプログラムです(sincos1.llsp3)。SPIKEアプリ3でsinとcosを使うには演算ブロックを使います。

プログラムを実行すると、このようにグラフが描かれます。水色の線はcos、ピンク色の線はsinです。グラフの縦軸はsinやcosの値です(範囲は-1~+1)。グラフの横軸は時間です。ループ回数を間違えて1回少なくしてしまったので、グラフの範囲は0~355度までです。波形は360度で1周して繰り返しになります。

この技術を応用すると、移動量と角度からX軸とY軸の移動量に分離することができるようになります。移動量を1として考えると、cos(角度)がX軸の移動量、sin(角度)がY軸の移動量です。
まだ授業で三角関数を習っていない人には難しいかもしれません。難しいと思った場合には「そういうもの」だと考えて丸暗記しましょう。

◆ ロボットの位置を算出する

sinとcosを使って、ロボットの座標を求めるプログラムです(sincos2.llsp3)。
変数「degree」にはロボットの向きを格納します(単位は度)。変数「x」「y」にはロボットの座標を格納します(単位はcmです)。 変数「tread」には左右のタイヤのきょり(トレッド幅)を格納します(単位はcmです)。ここでは14.3cmと設定しています。 「forward」は前進するマイブロックです。ここで座標を更新しています。 「turn」はその場せん回するマイブロックです。計算式の中にある「5.6」という値はタイヤの直径です。

ロボットをフィールドの原点に置いた状態でプログラムを実行します。
実行すると、ロボットが45度旋回→20cm前進の順に動きます。

実行が完了すると、「X=14.142,Y=14.142」と表示されました。これがロボットの位置(座標)です。値の単位はcmです。
見たところ、実際のロボットの位置は(15,14)なので、大体合っています。

◆ ロボットの位置を算出する(さらに複雑に)

ロボットの動きをさらに複雑にしてみました(sincos3.llsp3)。

プログラムを実行すると、 ロボットが45度旋回→20cm前進→ -45度旋回→15cm前進の順に動きます。

画面には「X=29.142,Y=14.142」と表示されました。見たところ、実際のロボットの位置は(30,13)です。誤差1cm未満なので、ほぼ正確にロボットの位置を割り出していることになります。これでお題をクリアすることができました。 この技術をどう活用したら良いでしょうか。次回はプログラムをさらに改良して、もう少し突き詰めていきたいと思います。

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

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