各開発環境における課題と対処法について解説します。
※EV3RTの検証はβ5で実施しています。
Bluetoothドングルやドライバに相性問題があります。
現状で検証した結果についてはEV3RTのページのWindows でのBluetoothの接続方法を参照してください。
EV3RTのデフォルトでのBluetoothデバイス名は "Mindstorms EV3"、PINコードは "0000" になっています。
参加しているチームが同じ会場でBluetooth PANで走行体とペアリングしようとしたなら、以下のような状況になることが容易に想像できます。
対処方法としてはデバイス名をチームごとに変更し、PINコードをチーム内で秘密のものに変更することです。
EV3RT β4以降でデバイス名とPINコードを変更する方法は、EV3RTのページのFAQの「Bluetooth 接続に関する質問」を参照してください。
初回起動時は、メニュー画面(StartupApp.exe)とファームウェアに入っているMonoBrickFirmware.dllに対してAOT(Ahead-Of-Time)コンパイラが動くので、かなり「猿ダイアログ」の出ている時間が長くなります。気長にお待ちください。
Bluetooth PANはWifiアダプタを使わなくてもBluetoothでIP接続できる便利なものですが、デフォルトではデバイス名がEV3で、PINコードなしでペアリングできてしまいます。参加しているチームが同じ会場でBluetooth PANで走行体とペアリングしようとしたなら、以下のような状況になることが容易に想像できます。
対処法としてはデバイス名をチームごとに変更することとPINコードでの認証を強制することです、MonoBrickは標準ではどちらの機能も提供していません。
EV3way用のサンプルプログラムでは以下の拡張を導入していて、プログラムの先頭部分で呼び出しています。この実行により認証が強制されるようになります。
ETRobocon.EV3.Brick.InstallETRoboExt();
ホスト名を変更するには以下を呼び出す必要があります。
ETRobocon.EV3.Brick.SetName(デバイス名);
PINコードを変更するには InstallETRoboExt() を最初に呼び出す前にソースコード Brick.cs の以下の部分を修正するか、EV3にログインして /etc/bluetooth/btpin ファイルの中身を書き換える必要があります。
if (!File.Exists (LEJOS_BTPIN)) { fs = File.Create (LEJOS_BTPIN); sw = new StreamWriter (fs); sw.WriteLine ("1234"); // ここを書き換える sw.Close (); fs.Close (); }
ペアリング前に上記変更を行ってからプログラムを起動し、一度実行を中断してMonoBrickを再起動してからペアリングを行ってください。
Yosemite で一度ペアリングしてしまうと、EV3のデバイス名やPINコードを変更した後にペアリングをやり直せないという問題があります。これは以前のペアリングを削除しても情報がキャッシュ情報として残っていて、再ペアリングの際に利用されるためです。
回避方法としては、一度Bluetoothを無効にし(Bluetooth接続のキーボードやマウスも使えなくなるので注意)、 /Library/Preferences/com.apple.Bluetooth.plistを削除し、OSを再起動することで再ペリングが可能になることを確認しています。この回避方法を行うとペリングしている他のデバイスの情報も消えてしまうので、再度ペアリングし直す必要があります。
注意 システムファイルの削除を行う操作となるため、細心の注意の上で操作を行なってください。本対処の結果について、ETロボコン実行委員会は責任を負いません。
Xamarin StudioからプログラムをEV3に転送して実行すると、プログラムを終了した時に、メニュー画面(firmware画面)に戻りません。これは、環境構築ガイドにも記載している通りです。プログラムを終了する時に、メニュー画面(実体は、StartupApp.exeというアプリケーションです)を起動し直すことで、この問題を解決できます。
EV3wayのサンプルコードでは、この対処を行っています。このサンプルでは、MainClassクラスのMain()メソッドの末尾で、System.Diagnostics.DebuggerクラスのIsAttachedプロパティがtrueの場合は、ETRobocon.EV3.BrickクラスのExitToMenu()メソッドを呼び出します。ExitToMenu()では、メニュー画面(StartupApp.exe)を起動することにより、アプリケーションが終了した時にメニュー画面に戻るようにしています。
注意:アプリケーションをEV3のSDカードに転送して、メニュー画面から起動した場合(つまり、リモートデバッグ実行ではなく、通常実行した場合)は、ExitToMenu()を呼び出すと、メニュー画面が 二重に動作 してしまいます(StartupApp.exeが二つ同時に動いている状態になってしまい、動作がおかしくなります)。そのため、System.Diagnostics.DebuggerクラスのIsAttachedプロパティを使って、デバッグ実行中かどうかを判定し、 デバッグ実行中の場合にだけ ExitToMenu()を呼び出すようにして下さい。
leJOS EV3もMonoBrickと同様の問題があります。ペアリング前にUSBケーブルでleJOSとPCをRNDIS接続し、ETロボコン実行委員会が提供するツールを利用して、デバイス名とPINコードを変更してください。
leJOS EV3もMonoBrickと同様の問題があります。MonoBrickの場合と同様に対処してください。
leJOS EV3では、Javaの実行にNXTまでのTiny VMではなく、Oracle純製のVMを利用しています。Javaの機能をフルに利用できるようになった反面、NXTまでのものより実行が重くなっています。実際に計測したところモータやセンサにアクセスするのにそれぞれ数ミリ秒かかっていました。このため、EV3wayのような4ミリ秒の間にセンサから情報を読みだして倒立振子制御を行なってモータを駆動しなければならない場合には走行体を立たせることもできなくなります。
OracleのJavaにはHotSpotという機能があり、プログラム中の頻繁に利用する部分からCPUネイティブなコードに変換していきます。デフォルトでは1500回実行したメソッドからネイテイブコードに変換します。この機能を利用して倒立振子制御を行う前にモータやセンサに1500回アクセスしておくと、以後のアクセスが高速化され、倒立振子制御に十分な性能が得られるようになります。EV3way用のサンプルプログラムでは、このHotSpotの機能を利用して倒立振子制御を実現しています。