2024年11月18日
004-4.アルゴリズム入門-第6回「モータのスピードをコントロールする、その2」
「アルゴリズム」とは英語で書くと「Algorithm」、プログラムにおける「考え方」を表した言葉です。
この連載では、ロボットのプログラミングの中で、アルゴリズムを活用する方法を紹介していきたいと思います。(文/松原拓也)
◆ 前回のおさらい

前回と同じく、次のような装置を用意します。
インテリジェントブロックNXTのポートAにモータを接続します。
そして、モータにはアーム(テクニックビーム)とタイヤを取り付けます。これがモータの回転時の負荷となります。

前回のおさらいですが、「スピードコントロール」のプログラムです。
[Download]モータのスピード調節プログラム1(NXTソフトウェア2.0で作成)
目標となる角度との差を求め、その差に比例したパワーでモータを回転させます。

このプログラムでは、回転する速度を「1回転あたり2秒」に設定しています。

それでは、プログラム実行させてみましょう。
プログラムは10秒後に停止するように設定しています。つまり、モータが5回転して、タイヤの先端がスタート地点で戻ってくれば成功のはずです。

プログラムが終了しました。
モータの回転した角度を見てみると、先端(タイヤの取り付け位置)が目標の位置よりも手前で止まってしまったようです。
これはいったいなぜでしょうか? 問題の解決方法については、この後のページで紹介します。
◆ 対策その1(時間の管理)

それでは、ちゃんと目標の位置で停止できるように、プログラムを見直ししていきたいと思います。
ループブロックの終了する部分に、比較ブロックを追加してみました。こうすることで、タイマ側の管理する時間と、ループ側の管理する「時間のずれ」が無くなるはずです。
[Download]モータのスピード調節プログラム2(NXTソフトウェア2.0で作成)

プログラムを実行してみました。
意外にも、改良前との違いは特に見当たりませんでした。やみくもに対策してるようじゃいけませんね。
次のページでは、もっと効果的な対策方法を紹介します。
◆ 対策その2(ゲインを増やす)

さらにプログラムを改造します。
前回のプログラムには、きちんと目標位置にたどりつけないという問題点がありました。
[Download]モータのスピード調節プログラム3(NXTソフトウェア2.0で作成)

プログラムを実行してみました、、、。1秒あたり0.5回転の速度でモータが回ります。

プログラムが終了しました。
プログラムの変更前に比べて、目的の位置にかなり近づきました。おおむね成功です。
ゲインを上げることで、目標位置に近づきやすくなったということになります。

変更前と変更後でグラフを比較してみました。
ゲインを3倍にすることで、パワーも3倍になるのかと思ってしまいますが、実際には見分けがつかないほど出力されるパワーは同じでした。大きな違いはスタート時のパワーですが、これはスタート時はモータが止まっているので、より大きなパワーを必要とするからです。
◆ 回転速度を求める

先ほどのプログラムをさらに改良して、「回転速度(角速度ともいいます)を求める機能」を追加してみました。
[Download]モータのスピード調節プログラム4(NXTソフトウェア2.0で作成)

速度を求める方法を図で表わしてみました。
青色の人が目標位置、オレンジ色の人が現在位置です。両者の位置を差し引けば差が求まります。そして、一定時間おきに現在位置の差を求めれば、それが速度になります。
作成したプログラムでは変数「deg」に現在の位置(角度)を入れて、変数「degbak」にループの一周前の位置を入れています。変数「deg」の値から変数「degbak」の値を引くことで速度が求められるわけです。

プログラムの実行結果です。
グラフに速度の値が描かれました。 1秒あたり0.5回転ということは、 0.01秒あたり0.005回転=1.8度。おそらくこれくらいのペースでループブロックを循環しているため、値が小さくなってしまっているようです。
これで「速度」を求めることができるようになりましたので、次のページではこれを応用した制御方法を紹介します。
◆ PD制御

先ほどのプログラムをさらに改造します。
回転の速度(変数speed)を元にパワーを求め、それに今まで使っていたパワー(変数power)を足してみました。これによって、「急いで回転している時ほど、より大きなパワーを出す」という制御が加わりました。
先ほど行っていたのは比例(P)制御で、今回を足したのは微分(D)制御、二つ合わせて「PD制御」となります。本来、PD制御の「D」は「微分」という意味なのですが、プログラムを簡単にするために、ここでは「速度」を微分の代わりとして使います。
[Download]モータのスピード調節プログラム5(NXTソフトウェア2.0で作成)

プログラムを実行してみました。
グラフが二重になっていますが、これは速度の変化に対してモータのパワーが小刻みに変化しているためです。
気になる効果についてですが、今までの制御に比べて動きが機敏になったような気がします。速度を一定に保つように設定しているので、かなり分かりにくいのですが、、、。
◆ 完成

さらにプログラムを改造します。
変数を用意して、モータの動作時間と回転速度を自在に設定できるようにしました。動作時間は変数totaltimeに代入して、回転速度は変数pitchに代入します。ここでは、モータの回転速度を「1秒あたり1回転」、動作時間を「3秒間」に設定しました。
[Download]モータのスピード調節プログラム6(NXTソフトウェア2.0で作成)

プログラムを実行させてみました。
モータの回転は指定どおり1秒あたり1回転を実現しましたが、最初はガクガクとした動きになりました。

では、グラフを確認してみましょう。
実行を開始してから 0.2~0.3秒あたりで、ガクッとパワーが落ち込んでいます。これは、回転に勢いがありすぎて、目標を追い抜いてしまったということを表しています。つまり、ゲインが大きすぎたようです。この値を調整することで快適にモータが回転するんじゃないかと思います。
全6回に渡って紹介してきた「アルゴリズム入門」ですが、今回で最終回です。今まで紹介したプログラムをロボット作りに活かしてみてください。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。