2024年11月21日

008-1.EV3ソフトウェア入門-第3回「EV3とNXTの動作の違い」

去年(2013年)、新シリーズのレゴマインドストームである「教育用レゴマインドストームEV3」が発売されました。今まで7年間に渡って使われてきた「NXT」との違いにも注目しつつ、EV3を使ったプログラミングについて紹介していきたいと思います。(文/松原拓也)

「EV3ソフトウェア」は「NXTとEV3の両方で動くプログラム」を作ることができます(いくつかの制約がありますが)。
前回までは計算をするだけのプログラムでしたが、今回は「モーター」を動かすプログラムを作ってみたいと思います。

EV3の基本セットに付属するモーターは、2種類のサイズがあります。そのうち、大きいほうのモーターが「Lモーター」です。 公式Webサイトや通販サイトでは「インタラクティブサーボモーターL」と呼ばれています。
このLモーターは、NXT用の「インテリジェントサーボモーター」と互換性があります。パーツの色が違ったり、ブッシュを挿し込む位置がちょっと違っていますが、それ以外は同じです。 「NXT用インテリジェントサーボモーター」だったり、「EV3用インタラクティブサーボモーター」だったり名前がややこしいです。ここでは「インテリジェントサーボモーター」を「NXTモーター」と呼ぶことにします。
この2つのモーターですが、オートID機能では「同じもの」として認識されるようです。インテリジェントブロックEV3(EV3ブロック)で「PortView」を実行した状態で、NXTモーターとEV3 Lモーター、どちらを接続しても画面には「L-MOTOR~」としか表示されません。なので、両者は性能的に同じで、違いは特に無いと思います。

次は「インテリジェントブロックNXT」と「インテリジェントブロックEV3」による動作の違いを検証します。
インテリジェントブロックNXT/EV3で2種類のロボットを用意します。 モーターには違いが無いので、ここでは両方ともNXT用モーターを使っています。

そして、定番のネタですが EV3ソフトウェアを使って「60cm前進するプログラム(motor1.ev3)」を作ってみました。モーターを一定の角度に正転させるだけのプログラムです。
最初に「数学」ブロックを2個使って必要な回転角度を計算して、「モーター」ブロックに与えています。数式は「回転角度=(移動距離×360)÷タイヤの円周」です。タイヤの円周は5.6×円周率=約17.6cmとしました。 「拡張機能」を使えば、数学ブロック1個で済むのですが、そうすると、NXTでは動かず、EV3専用のプログラムになってしまうので、使いませんでした。

動作を確認できるようにテーブルにロボットを置きます。 60cm手前に目印を置きました。

実行すると、ロボットが60cm進んでから止まりました。
1.5cmくらい移動距離が足りていませんが、タイヤの円周が大きすぎたか、回転がロスしたかのどちらかが原因だと思います。ここまでは予定どおりです。

一見すると同じようですが、ロボットが止まる時の動きはまったく違います
NXTの場合、ロボットは停止時に「グラッ」とゆれてから止まりましたが、EV3の場合は、ほとんどゆれずに「ピタッ」と止まりました
プログラムがまったく同じで、モーターも同じなのですが、なぜかNXTとEV3では動作が違うようです。

NXT側のロボットがゆれる原因はモーターが目標の角度より余分に回転してしまうからです。これを「オーバーシュート」と呼びます。ここではタイヤで移動していますので、以後は「オーバーラン」と呼びたいと思います。
オーバーランの後、インテリジェントブロックはモーターを逆に回して、本来あるべき角度に自動で戻してくれます。

データロギング機能を使って、オーバーランの現象を視覚的に確認してみたいと思います。そこで、「データロギング」ブロックを使ってみましたが、ここで「!」マークが出てしまいました
これは「ブロックがNXTでは対応していない」というお知らせです。EV3では問題なく動きますが、NXTでは動きません。これだとデータの比較ができません。

しかたないので、「NXTソフトウェア」を使って、先ほどのプログラムと同じようなプログラムをNXT用に作ってみました(Program-1.rbt)。60cm前進して、モーターの回転角度をロギングします。
モーターブロックの項目ですが、「モーターパワー」のチェックはオンにします。これでパワー制御(回転速度の自動調節)が行われるようになります。EV3ソフトウェアのモーターブロックはパワー制御が常にオンなっています

まず、プログラムを実行します。実行後、インテリジェントブロックをパソコンと接続してデータロギング画面で開きます。すると、このようなデータが取り込めました。
グラフの横軸が時間、縦軸がモーターの角度です

余談になりますが、データロギングのプログラムには「モーター」ブロックの直後に「待機」ブロックを置いておく必要があります。
例として「待機」ブロック(3秒間)が「ない」場合と「ある」場合と比較してみました。 待機ブロックが「ない」ほうはグラフが途切れています。回転がグラついていないように見えますが、データが記録されていないだけで、実際にはグラついています。妙なことですが、「モーター」ブロックが終わったあとにオーバーランぶんを戻しているようです。
では、モーターブロックの終了直後に別のモーターブロックで回転させてしまったら、いつオーバーランを戻すのでしょうか。いろいろと謎が残ります。

さらに余談ですが、 NXTソフトウェアの「モーター」ブロックには、回転速度を変化させる「動作」という項目があります。この項目はデフォルトでは「一定」に設定されていますが、「急上昇(加速)」に変えると、モーターの回転速度を0からスタートして少しずつ上げていくことができます。名前は「急上昇」になっていますが、おそらく翻訳のミスで、正しくは「加速」です。「加速」の他に「減速」もあります。残念ながらEV3ソフトウェアには「加速」や「減速」の機能はなく、速度は常に「一定」です
EV3で無くなってしまった機能については、自作のプログラムで再現してみるしかなさそうです。

続いてEV3ソフトウェアでデータを収集します。先ほどのプログラムに「データロギング」ブロックを追加するだけです。あっという間に完成しました(motor2.ev3)。
データロギングブロック内の一番左側が「モード」です。モードをオンにすると、「頻度(ひんど)」と「測定間隔の単位」を設定できます。 ちょっと分かりにくいのですが、設定は「60」「0」です。右側は「測定間隔の単位」で「0=データ数/秒」なので、写真の状態では「1秒間に60回測定する」という設定になります。 「MyData」というのはデータのファイル名です。

プログラムを一度実行すると、データがインテリジェントブロックの中に記録されます。
収集したデータを見るには、「新規プロジェクト」→「実験」を選択します

実験用のプロジェクトが開かれました。タブには「Experiment(実験)」と表示されます。
ここで、インテリジェントブロックEV3をパソコンに接続して、 右下の「アップロード(上向きの矢印)」ボタンを押します。 アップロードと聞くと、インテリジェント側にデータを送ると思ったのですが、その逆で、パソコン側にデータを送るようです。 ダイアログが開かれますので、そこで「Motor2」のフォルダを選択して「MyData.rdf」を選択して、「インポート」ボタンを押すと、データをパソコンに取り込むことができます。

データが取り込めました。

NXTとEV3のデータを比べてみました。
ずいぶん遠回りになりましたが、「NXTとEV3で動作が違う」という現象をようやく視覚化できました。
NXTよりもEV3のほうがモーターの動きが正確なので、ロボット競技ではEV3が有利になりそうです。
結局、NXTだとオーバーランが発生して、EV3だとオーバーランが発生しないという問題点は残っていて、原因も不明のままです。 おそらく、NXTのファームウェアに問題があって、EV3では改善されているのだと思います
しかし、NXTもソフトウェアを工夫すると、モーターを正確に止めることができます。過去のちゃれんじ教室でもそれをテーマに何度か対策方法を紹介していますので、興味のある方は読んでみてください。

[youtube]プログラム実行時の様子を動画にしてみました。
[DOWNLOAD]今回作成したプログラム(教育用EV3ソフトウェア用)

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