プログラムを改善してもっとうまく走ろう
モーターの制御方法を検討しよう
2輪倒立振子ロボットをライントレースさせる方法にON/OFF制御を使うと、カクカクした走行になり速く走ることができないこと、そして速く走るためにカクカクの度合いを小さくして滑らかに走行させようとしたら、今度はラインから外れやすくなってしまうことがわかりました。簡単な実験をして、ON/OFF制御にはどんな問題があるのか調べてみましょう。
ON/OFF制御の実験
モーターを回転させて、目的の角度で止めることを考えてみましょう。
図2のように教育用レゴ マインドストームNXTのモーターひとつにアームブロックを取り付けただけの簡単な実験装置を作ります。このモーターをNXTの出力ポートAに接続します。
図4:モーターの回転動作を調べる実験装置 |
このモーターを開始位置からちょうど90度回転させた状態を維持するようにしたいのです。これをON/OFF制御で考えると、目標値の90度までは順回転させて、目標値90度を超えたら逆回転させます。すると目標値の90度より小さい角度になりますから、再び順回転させて90度に近づけます。これを繰り返すことで目標値の90度に近い位置で安定することになるはずです。ライントレースのとき、ライン上なのかライン外なのか、また90度より大きいか小さいかが対応しています。このときのモーターの動きは図5のようになりました。
図5:モーターの動き(ON/OFF制御) |
モーターの回転角度の変化をグラフに表すと図6のようになります。
図6:モーターの回転角度の変化(ON/OFF制御) |
グラフを見ると分かりますが、90度ちょうどで停止しません。これまでと同様、目標値の90度を中心に値が上下にぶれたまま推移していることがわかります。90度を超えると、ズレの多少によらず決まったスピードで逆回転し、90度を下回ると再び順回転しています。いつまでたっても、目標に到達して静止することができない状態が続いています。
偏差に比例して速度を変化させてみる
ON/OFF制御では2つの値で制御していました。では、もっと多くの値に分割したらどうでしょうか。例えば、目標値の90度に対して、差が30度以下のときには遅く、差が30度から60度のあいだは中速で、差が60度以上あるときには高速で回転させてみてはどうでしょう。
3つの値を使った制御です。段階が増えたのでさっきより滑らかになるかもしれません。そして、4つ、5つと区間を細かくして値を増やしていきます。そうすると、常に目標値の90度との差(目標値との差を偏差と呼びます)を計算して、その差の大きさに対応したスピードで回転させるようになります。偏差が大きければ速く、偏差が小さくなるにつれて遅く細やかにスピードを変えていくという方法です。式に直すと次のようになります。
- モーターの回転速度 = 定数×(90度 - 現在のモーターの角度)
90度が目標値です。90度から現在のモーターの角度を引いた値を求めている部分が偏差です。モーターの回転速度をこの偏差が大きいほど速く、小さいほど遅くしたいのですから、偏差と回転速度は比例しています。そこで、偏差に定数をかけてモーターの回転速度を求めるようにしています。定数は実験をしてちょうどよい値を求めます。現在のモーターの角度が90度に近づけば近づくほど、モーターの回転スピードは小さくなり、理想的には90度でスピードが0になり止まるはずです。
この式をプログラムに反映して実行してみました。このときのモーターの動きは図7のようになりました。
図7:モーターの動き(P動作) |
モーターの回転角度の変化をグラフに表すと図8のようになります。
図8:モーターの回転角度の変化(P動作) |
ON/OFF制御に比べると、スムーズに90度に近づいていることがよくわかります。このような制御方法を、偏差量に比例して制御量を変えるため「比例制御」または「比例動作」と呼びます。そして、この制御動作のことを、比例(プロポーショナル:Proportional)の頭文字をとって「P動作」と呼びます。
しかし、ちょっとまってください。90度付近を拡大してみてみましょう。
図9:モーターの回転角度の変化(P動作)の拡大図 |
90度ぴったりではなく、小さなズレがあるようです。しかも、このズレは時間が経過しても0にはなりません。実世界では、摩擦やエネルギーロスがあるため、制御量(回転速度)が小さすぎて、モーターを動かすことができなくなってしまうからです。このようなことが原因となって、P制御には定常的な偏差(定常偏差)が残ることがあります。