2025年1月27日

021-2.SPIKEプライムヒント集-第2回「ロボットの最高速度は毎秒何cmか?」

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

◆ 前回の5倍の速さで走らせる

今回のお題は「ロボットの最高速度を測定すること」です。ロボットを「限界の速度」で走らせて、その速度を記録できたら成功とします。ルールとして移動できるきょりは25cmだけです。移動きょりがそれより短かったり、長かったりすると失敗とします。
ちなみに、前回作成したプログラム(speed_control 5.llsp3)では、加速度を「低速」に設定すると、このように一瞬だけ速度が上がりすぎるという現象が発生していました。これはロボットの速度が遅い場合にだけ発生するファームウェアのアルゴリズムのクセのようなものだと思います。

ロボットを速く移動させたいならば、「移動スピードを~%にする」ブロックの値を大きくすればいいだけです。 まずは実験として、移動速度を「秒速25cm」に設定したプログラム(speed_control 6.llsp3)を作ってみました。変数「speed_rate(速度/スピード)」の値は約0.434なので、算出されるスピードは25×約0.434=約57%です。スピード100%までにはまだ余裕があります。

プログラムを実行すると、ロボットが秒速25cmで移動します。前回の5倍の速さで走らせているので、勢いがあります。 急にタイヤが回転するので、フィールドの紙をテープで貼り付けておきます。

出力されたグラフがこちら。グラフの横軸が時間[秒]、縦軸はロボットの速度[cm/秒]です。3種類の加速度のモード(低速/中/高速)で測定しています。
「秒速25cm」ということは、1秒でゴールしてしまいそうですが、グラフを見るとゴールまでには1.2~1.6秒ほどかかっています。なぜでしょうか?
それは、加速と減速に余分な時間がかかってしまうからです。 加速度が「高速」設定なら、素早く移動することができますが、地面のスリップが発生しやすく信頼性は下がります。逆に「低速」設定なら、信頼性は上がりますが、加速と減速に時間がかかってしまいます。このように一長一短があります。
では「移動スピードを~%にする」ブロックを100%にすると、ロボットは秒速何cmで移動するのでしょうか? これは計算で求めることができます。答えは100×0.434=秒速43.4cmです。これは移動ブロックを使った場合の理論上の最高速度となります。
これより速くロボットを走らせるには移動ブロックではなくモーターブロックを使います。モーターの制御には「スピード」と「パワー」の2種類がありますが、これらは別ものです。スピード制御よりもパワー制御のほうがモーターを速く動かすことができます。

◆ 台形駆動

モーターブロックのパワー制御を使ってロボットを動かしたいと思うのですが、これが難問です。いきなり100のパワーでモーターを回してしまうと、正確に走らせることができません。
そこで、モーターで加速→等速→減速という制御を行うことにします。これを台形駆動(または台形制御)といいます。ただし、台形駆動は減速させる処理が難しいです。減速のタイミングを間違えると、下の図のようにゴール手前でノロノロ運転になってしまいます。

処理を簡単にするため、時間ではなく「きょり」でモーターのパワーを調整するという方法を考えてみました。この方法だと、減速のタイミングを間違えることはありません。パワーは上限と下限を設定して、きょりに対して比例させることにします。
パワーの下限はモーターがストールする(力が負けて回転しない状態)よりも大きな値である必要があります。でないと、モーターがいつまで経っても回転してくれません。 個体差はありますが、Mモーターの場合だと20以上のパワーじゃないと回転しないと思います。

以上の処理を組み込んだのがこの台形駆動のプログラム(speed_control 7.llsp3)です。プログラムが長くなってしまったので、画像は2枚に分かれています。 1枚目の画像は「スタート時の処理」「速度を測定してグラフに描く処理」「初期化の処理」です。

2枚目の画像です。ロボットの移動きょりを取得するため「モーター~相対位置」ブロックを使ってみました。通常の「~位置」ブロックは回転軸が一周すると、値が「0度」に戻ってしまいます。しかし、「~相対位置」ブロックは0度に戻らずに角度が累積されます。タイヤは1回転で17.5cm進みますので、「相対位置×17.5÷360」で、移動きょりを算出できます。

モーターのパワーの算出部分を抜き出してみました。 モーターを加速させるか、減速させるかは移動きょり(length)の値で判断します。 パワーの最小値は25と設定しました。スタート地点から6cm進むと、パワーが100に達するように数式を設定しています。

プログラムを実行すると、ロボットがすさまじい勢いで走ってから止まります。走る時間はおよそ1.1秒です。 考えられる最大のパワーでモーターを回しています。
モーターブロックは移動ブロックとは違い、2つのモーターを同期させることができません。そのため、ロボットがまっすぐ走ってくれないのが残念なところです。

出力されたグラフです。
ロボットの最高速度は「秒速47.39cm」と表示されました。これが「限界の速度」。今回のお題の答えとなります。 助走に時間を使ってしまうので、最高速度に達している時間は0.2~0.3秒しかありません。 移動ブロックを使うと秒速43cmくらいが限界ですが、モーターブロックを使って、それよりも良い記録を出すことができました。 これ以上、ロボットを速く走らせるにはタイヤの直径を大きくするか、加速ギヤを使うしかないと思います。
今回のお題は他にも解決策があるかもしれません。興味のある方は挑戦してみてください。

◆ ちょっと脱線

ロボットをまっすぐ走らせたくて、モーターブロックではなく、移動ブロックを使ったプログラム(speed_control 8.llsp3)も作ってみました。
移動ブロックを使っているので、今度はまっすぐ走らせることができました。秒速47.27cmを達成しています。理論的には秒速43cmが限界かと思っていたのですが、予想が外れてしまいました。 移動速度が速すぎて、ロボットが止まる地点が25cmを通り越してしまうのが難点です。

移動中にスピードを変更するにはひと工夫必要です。
「移動スピードを~%にする」ブロックを呼び出したら、そのあとに「移動を開始する」ブロックを呼び出しましょう。 「移動を開始する」を行わないと、スピードは変化してくれないので注意しましょう。

実験には失敗は欠かせません。じゃんじゃん失敗して改良を続けていきましょう。
今回作成したプログラム(SPIKEアプリ3用)

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