2024年12月5日
010-1.ロボット競技に役立つEV3センサー入門-第2回「回転センサーを見える化しよう2」
この連載では「教育版レゴマインドストームEV3」を使い、各種センサーをロボット競技に役立てるためのノウハウを紹介していきます。本当に役立てるためのには実際に手足を動かすしかありませんので、これを参考に実践してみましょう。なお、使用するプログラミング環境は「教育版EV3ソフトウェア」です。(文/松原拓也)
◆ 前回のおさらい

前回は回転センサーについてお話をしました。 前回作成したプログラムは、一つは「60cm前進するプログラム」、、、

、、、そして、もう一つは「モーターの角速度を測定するプログラム」でした。

この2つのプログラムと前回で使用したロボットをそのまま使います。このロボットは出力ポートAにLモーターを接続しています。モーターは1つだけなので、前進後退のみで右折・左折ができません。
◆ 回転センサーで移動速度を測る

前回、作成した「60cm前進するプログラム」と「モーターの角速度を測定するプログラム」。この2つを合体させて1つのプログラムにしました。完成したプログラムがこちらです(fow600mm2.ev3)。
60cm前進する処理と角速度の測定を並列的に処理します。並列的に処理を行うには写真のようにワイヤーを二股にしてブロックを接続します。

では、プログラムを実行します。

液晶ディスプレイにグラフが表示されました。
グラフのX軸は時間です。1ピクセルが0.025秒に相当します。グラフの終わった地点が約2.4秒を示しています。Y軸は角速度(時間あたりの回転角度)です。ややこしいですが、0.025秒間に回転した角度を測定して、それを4倍したピクセル数で描いています。計算すると、Y軸の一番上が1280度/秒(213 RPM)に相当します。見たところ下側4割くらいが埋まっていますので、85 RPMくらいでしょうか。前回の測定ではパワー100で160 RPMだったので、パワー50で85 RPM相当というのは、ほぼ計算どおりです。
このグラフを見ただけだと、特に問題点は見当たらないと思います。そこで、さらに見える化を推し進めたいと思います。
◆ ロボットがグラッとして止まる証拠

さきほどのプログラムを改良しました(fow600mm3.ev3)。改良したのはグラフの原点です。算出するY座標を変更することでグラフ全体が12ピクセルほど上に移動しました。

実行後の結果がこちらです。Y座標の0位置を少しだけ上に移動させました。この変更によってY座の上限が193 RPMに変わりました。
注目すべきはグラフの最後の部分です。 角速度(Y軸)の値がゴール直前でマイナスを示しています。回転センサーがとらえたモーターが逆に回っている証拠です。
つまり、ロボットが目標地点をオーバーランして戻っているということです。 実際に見ると、ロボットがグラッとして止まる様子が確認できます。
◆ ロボットをゆっくり止める

ロボットがグラッと止まることが分かりましたので、これをなくしたいと思います。
改良したプログラムがこちらです(fow600mm4.ev3)。モーターのパワーを自前のプログラムで制御するように変更しました。プログラムが巨大化したので、グラフ描画に関するプログラムはマイブロックに移行させました。

プログラムを実行した結果がこちらです。
ロボットが停止時にグラッとなる現象が少し収まりました。ロボットの加速と減速もゆるやかになりました。 急発進/急停止をしないことで動きが正確になります。さらに0.1~0.2秒ほどゴールへの到着が早くなっています。

このプログラムでは「加速」「等速」「減速」の3段階でモーターの回転速度を制御しています。 等速時にはパワー100で回転します。
ピンク色で塗った部分はモーターを回転させるさいの最低限のパワーです。ここではパワー10と設定しました。このパワーが0だとスタート時にモーターが回らず動いてくれません。
◆ 加速減速レートの調整

しかし、最後に逆回転する現象は完全に解決していません。
そこで、先ほどのプログラムを改良します。 加速減速レートを0.3→0.1に変更してみました。モーターの回転が遅くなれば逆回転が発生しなくなると予想したためです。

プログラムの実行結果がこちらです。
予想どおり、逆回転が発生しなくなりました。一応、これで解決になるのですが、ゴールへの到着が前よりも遅くなってしまいました。
あと、細かい話ですがグラフが左右対称ではないので気持ちが悪いです。

距離とパワーの関係をグラフにすると、こうなります。 加速減速レートが低いとパワーは100%に達しないので、台形にはなりません。
モーターのパワーが弱すぎたため、ロボットの加速に時間がかかりすぎて、グラフのバランスが悪くなったようです。
◆ 完成したプログラム

最終的に完成したプログラムがこちらです(fow600mm5.ev3)。
改良点としては、モーターブロックの「オフ」の設定を「ブレーキ」じゃなくて「惰性運転」に変更しました。加速減速レートは最初の0.3に戻しています。
ブレーキをかけると、その場に踏み止まろうとしてモーターの逆回転が発生してしまいます。惰性運転に変更すれば、逆回転はなくなりますが、今度はモーターが正確な位置に止まれません。ジレンマに悩まされます。
解決策としては、ゴール地点を実際よりも手前に設定してモーターの回転を早めに落とすようにしてみました。 減速の基準となる回転センサーの角度は「midpoint」という変数で設定していますので、プログラム内で探してみましょう。

距離とパワーのグラフで表現するとこうなります。
このプログラムではゴールの1.8cm手前でパワー10の等速運動に切り替わります。

プログラムの実行結果はこのとおりです。
逆回転もなく、ゆっくり停止できるようになりました。

対策前と対策後を比べてみました。解決しましたが、少々不満があります。ゴールへの到着時間が変わっていません。加速減速レートやmidpointの値をうまく設定すれば改善するかもしれません。
[DOWNLOAD]今回作成したプログラム(教育版EV3ソフトウェア用)
[LINK]2015年10月に私が書いたマイスターブログも参考になると思います。ロボットの正確な移動方法について紹介しています。
https://afrel.co.jp/techblog/ev3/100-01/
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。