こんにちは、桁野(ケタノ)です。
この記事では、SPIKEプライムでマインドストームEV3のソフトウェアで使われていたステアリングブロックを再現する方法をご紹介します。
1.作成のきっかけと本記事の注意点
LEGO社から販売されているMINDSTORMS EV3の販売終了に伴い、後継機(?)としてSPIKE(スパイク)プライムが発売されましたね。
たまたまSPIKEに触れる機会があったので、車型のロボットを作って動かしてみました。
SPIKEアプリにある移動ブロックのステアリングブロックを使って色々と動かしてみたのですが、どうやらEV3のアプリケーションにあったステアリングブロックとは仕様が異なるっぽいんですよね。
EV3で慣れている自分としてはあのEV3アプリのステアリングブロックが欲しい!
という事で、「無いなら自分で作ればいいじゃないか!」ということで今回作ってみることにし、それを本記事でまとめています。
本記事の注意点を以下に示します。
- 注意1
本記事には、ステアリングブロックとステアリングブロックのパラメーターであるステアリングが出てきます。混乱を招くので、ステアリングブロックは「ステアリングブロック」、パラメーターのステアリングを指すときは単に「ステアリング」もしくは「ステアリング値」と表記します。 - 注意2
今回SPIKEアプリで作成するステアリングブロックのパワーは負の数は入力されないという前提で作成します。
2.EV3とSPIKEのステアリングブロックの違い
まずはEV3とSPIKEのステアリングブロックの違いからお話したいと思います。
どちらのアプリにもステアリングブロックがありますが、仕様が異なります。
以下のグラフは、パワー100で動かした際の右のモーターのパワーについてまとめたものです。
大きな違いは、ステアリング値が1~99の時のパワーの変化の仕方です。
EV3アプリは一定の割合で変化するのに対し、SPIKEアプリのほうは、90を起点に一気に変化の割合が変わります。
今回の目的はEV3アプリと同じステアリングブロックを作ることですので、EV3アプリでのステアリングブロックの仕様についてさらに詳しく見ていきましょう。
3.EV3のステアリングブロックの仕様
ここではEV3アプリでのステアリングブロックの仕様について詳しく説明いたします。
3-1.一言で説明すると「左右のモーターの回転差の割合」
EV3のステアリングブロックは、一言で表すならば「左右のモーターの回転速度の差の割合」です。
ステアリング値が0とは左右のモータ回転の差が0%であるということ。
すなわち、左右とも差がなく、全く同じように動いているということです。
一方で、ステアリング値が100ということは、左右のモーターの回転差が100%あるということ。
すなわち、左右のモーターが完全に逆方向に動いているということです。
3-2.ステアリング値と曲がり方について
先ほど、EV3のステアリングブロックは「左右のモーターの回転速度の差の割合」と伝えましたが、確認していきましょう。
まずステアリングブロックの理解をするうえで、助けになるのがタンクブロックです。
タンクブロックはステアリングブロックと同じく2つのモーターを制御するプログラムです。
ステアリングブロックとは違い、タンクブロックは左右のパワーを調整して曲がり方を変えます。
どちらも左右のモーターを制御するプログラムに変わりはないのですが、曲がり方の調整方法が違います。
- ステアリングブロック
ステアリングというパラメータを調整することで曲がり方を変える。 - タンクブロック
左右のモーターのパワーを調整することで曲がり方を変える。
ということで、ステアリングブロックをタンクブロックで表すとどうなるのかを理解すれば、ステアリングというパラメータの意味が分かってくると思います。
・直線移動の場合
ステアリングブロックで、ステアリング値を0にします。
この時、パワーを20で動かす場合、タンクブロックでは左右のモーターのパワーは20となります。
もちろん、パワーを80で動かした場合は左右のモーターのパワーは80となります。
・タイヤを回転軸にして旋回
タイヤを回転軸にして旋回にする場合、右旋回であればステアリングブロックのステアリング値を50にします。
左旋回であれば、マイナスをつけて、-50となります。
もし、パワーを20で右旋回をタンクブロックで行う場合、左のパワーは20、右のパワーは0となります。
同様にパワーを80で左旋回の場合であれば、左のパワーは0、右のパワーは80となります。
・左右のタイヤを結ぶ線の中心を回転軸にして旋回
左右のタイヤを結ぶ線の中心を回転軸にして旋回する場合、右旋であればステアリンググロックのステアリング値は100にします。
同様に左旋回であればマイナスをつけて、-100にします。
これをパワー20で右旋回をタンクブロックで行う場合は、左のパワーを20、右のパワーを-20にします。
逆の左旋回でパワーを80にした場合であれば、左のパワーを-80、右のパワーを80にします。
このようなことから、EV3のステアリングブロックは一言で表すならば「左右のモーターの回転差の割合」ということになります。
4.ステアリング値とパワーの関係性
ここからは、SPIKEアプリでEV3アプリのステアリングブロックを作成するにあたり、ステアリング値の値とパワーの関係性を考えてみましょう。
ステアリング値をX、モーターのパワー(左と右)をグラフにするとこんな感じです。
このグラフからわかることは、
- パワーが変化する部分は1次関数(y = ax + b)で表すことができる
- パワーの値がそのまま切片となり、パワーの値によって、グラフの傾きが変わるということ
- パワーの絶対値を超えると、その数値で維持し続ける
ということですね。
重要になるのは、 パワーの変化する部分は1次関数のグラフ の部分です。
上記のとおり、パワーの変化する部分は1次関数のグラフなので、y=ax+bで表すことができます。
そして傾き(a)に関しては、パワーを2倍したものを100で割ると導きだすことができます。
切片(b)に関しては、パワーをそのまま使うことができます。
以上のことから、ステアリングブロックのステアリング値とパワーを決めてしまえば、タンクブロックでの左右のモーターのパワーを求めることができます。
5.SPIKEアプリでEV3アプリのステアリングブロックのプログラムを作ってみる
さて、ここでは実際にEV3アプリのステアリングブロックをSPIKEアプリで作成してみましょう。
作成の流れとしては以下の通り。
①ステアリング値とパワーの変数を作る
②パワーを元に1次関数の傾きを求める
③傾きが定まった1次関数の式を元に、左右のパワーを求める
④求めた左右のパワーを修正する
⑤左右のモーターを動かす。
① ステアリング値とパワーの変数を作る
ステアリング値とパワーを可変にするために、まずはそれぞれの変数を作ります。
②パワーを元に1次関数の傾きを求める
ステアリング値により、左右のモーターのパワーが一定の割合で変化をしますので、一次関数で表すことができます。
この一次関数の傾きですが、これは設定されたパワーによって変わります。
なので、傾きを求める処理を入れます。
先にも述べましたが、今回傾きはパワーを2倍したものを100で割ると求めることができます。
③傾きが定まった1次関数の式を元に、左右のパワーを求める
傾きが決まったので、あとは右と左のパワーを求めます。
1次関数の式は「y = ax + b」です。
yはパワー、xはステアリング値となります。
また、aは先ほど求めた傾きを入れ、b(切片)はパワーに設定した値になります。
これを踏まえて処理を入れます。
この時、四捨五入をしていますが、時々左右のパワーの数値がきれいな小数点にならない場合があるからです。
(おそらく浮動小数点数による計算が原因かと思われます)
④求めた左右のパワーを修正する
求めた左右のパワーの数値が、最初に設定したパワーの数値よりも超えていた場合は、設定したパワーの数値に変更します。
これが、ここでいう求めた左右のパワーを修正するということです。
例えば、最初にパワーを20で設定したならば、20を超過してはいけないし、-20未満になってもいけません。
すなわち-20~20の範囲内で収めねばならないということです。
ちなみにグラフでいうところの1次関数のところではない水平の部分となります。
これを条件分岐用いて処理をします。
⑤左右のモーターを動かす。
左右のモーターのパワーの値を決めることができたので、最後にこのパワーで左右のモーターを動かします。
この時、左右のモーターの回転の向きに注意してください。
ざっと作り方を説明しましたが、意味が分からなくてもとりあえず作成していただければ動くと思います。
ぜひ、SPIKEプライムでEV3のステアリングブロックを使ってみてください。