2024年11月21日

007-1.モーター制御入門-第5回「まっすぐ進むロボット」

ここでは、モーターの制御に関わる技術を紹介していきたいと思います。ロボット競技にも応用してみましょう。(文/松原拓也)

◆ 移動ブロックを使わない

用意するのは、こちらのロボット。モータを2個だけ使ったシンプルなロボットです。モータは次のようにつなぎます。
出力ポートB:右側のタイヤのモータ
出力ポートC:左側のタイヤのモータ

ロボットの後輪部分はこうなっています。キャスターが1個だけ付いています。 重心が後ろにあるので、キャスターに力がかかりやすくなっていて、まっすぐ進みにくくなっています。

続いて、検証用のフィールドを用意します。 ロボットの前方60cm手前に目印を置いて、それに向かって走らせます。

通常、ロボットをまっすぐ進めるには「移動ブロック」を使います。2つのモータをタイミングを合わせて回すことができるというブロックです。
移動ブロックには「ステアリング」という設定があり、 これでまっすぐ進む度合いを調整できます。
この機能を使ってしまうと、即、解決してしまいますので、 今回はこの移動ブロックを使わないでまっすぐ進めてみたいと思います。

◆ まっすぐ進めない例

移動ブロックを使わない例を紹介します。 このように「モーターブロック」を2個立て続けに呼び出すという方法があります。

実行すると、このような感じで進路が大きくズレてしまいました。当然ながら、失敗です。
なぜ失敗したかというと、左右のモータの回転量が同じではないからです。

「左右のモータの回転量がどれくらいズレているのか」を確認するためのプログラムを作ってみました(program-1)。
スタートからゴールまでのモータの回転量の差をグラフに描きます。

モータの回転量の差はこのようにして求めます。 2つの回転センサから値を取り出し、片方でもう片方を引いて、その結果を変数「diff」に入れます。
この値がぴったり「0」の場合はまっすぐ進んでいることになります。 プラスの場合は右側に進み、マイナスの場合は左側に進んでいます。

プログラムを実行してみました。
今度もまっすぐ進みません。進む方向はほとんどランダムのようです。画面にはグラフが描かれました。

★では、グラフに注目してみましょう。
X座標はロボットが進んだ距離です。Y座標は回転量の差です。 Y座標の目盛りは中心(Y座標32)が0で、1ピクセル=1度に割り振っています。
グラフを見たところでは、 スタートしてからゴールするまでに1/3くらい進んだ段階で、回転角が30度以上ズレているようです。値がはみ出してしまいましたが、ゴールした時点では90度くらいズレているのではないでしょうか。

◆ 比例制御で向きを直す

先ほどのプログラムを改良して、ロボットがまっすぐ進むようにします(program-2)。 先ほどは、左右の回転センサの差を変数「diff」に入れていましたが、このdiffの値を左右のモータのパワーとして割り振ります。変数「power」にはモータの基本的なパワーの値(50)を入れておきます。
以前、紹介したライントレースのプログラムと原理は同じです。ライントレースでは光センサの値をもとに比例制御を行っていましたが、こちらでは回転センサによって比例制御を行います。

プログラムを実行しました。目印から2cmくらいズレが場所で止まりました。
思った以上にまっすぐ走るようになりました。あと、ゴールの60cm付近で止まらず、10cmくらいオーバーランしてしまいましたが、次のプログラムで直します。

さらにプログラムを改良します(program-3)。
変数diffの算出の過程で結果を5倍にするようにしました。この「5」の定数を「ゲイン」と呼ぶことにします。 これで、回転センサの値が1度あたりモータのパワーが5加わることになります。これで進路が曲がったさいにまっすぐ戻りやすくなったと思います。
さらにグラフを描く機能を追加してみました。オーバーランしないようにモーターを停止する命令を追加しました。

実行結果です。性能の変化は、ハッキリとしないのですが、 まっすぐ進む性能は向上したような気がします。 ハッキリわかるような、うまい検証方法がないですね。
最初のprogram-1と比べて、ほとんどまっすぐなグラフが出来上がりました。 中心から1~2度ズレているだけの状態を維持できているようです。
今回紹介した方法は、回転センサのズレを検出しながら進んでいます。つまり、進路を曲がってしまった「あと」で直していますので、曲がってしまったぶんは直せないままになってしまうようです。 さらに、タイヤがスリップしてしまうと、「回転センサ上ではまっすぐだけど現実はまっすぐじゃない」という現象が起きてしまいます。
結局、ソフトウェアで対策できる限界があるわけです。

まっすぐ進むための工夫として、ハードウェアでできる対策としては、重心に気を配ることです。
ロボットの重心はタイヤの上にくるように調整します。さらに重心はできるだけ低いほうがいいです。こうすると、床面に対してタイヤの力が伝わりやすくなります。 平面としての重心の位置は、やじろべえの要領で指でロボットを下から持ち上げたら分かります(もしくは糸で吊り下げる)。90度回転させて2回やれば、立体的に重心の位置が分かるのではないでしょうか。
重心をタイヤの上に合わせると、今後はロボットは後ろだけじゃなくて、前にも倒れてしまいます。なので、キャスターが2個必要になります。

[DOWNLOAD]今回作成したプログラム(教育用レゴマインドストームNXT2.0以上推奨)

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