このページではシミュレーター上の Educator Vehicleを操作するためのコンポーネントの作成手順を説明します。 Educator VehicleはレゴマインドストームEV3の組み立て例の一つです。
まずは資料をダウンロードしてください。
git clone https://github.com/OpenRTM/RTM_Tutorial_EV3
付属のシミュレータで以下の Educator Vehicle 改のシミュレーションができます。
Lモーター、Mモーターの制御だけではなく、タッチセンサー、ジャイロセンサー、超音波センサーのシミュレーションも可能になっています。
EV3Simulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。
GUI(スライダー)によりシミュレーター上のロボットの操作を行い、タッチセンサーがオンの時には自動的に停止するコンポーネントの作成を行います。
作成手順は以下の通りです。
Linux (ここでは Ubuntu 16.04 を仮定) 上に開発環境を構築します。
インストールスクリプトでインストールします。
$ wget http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/build/pkg_install_ubuntu.sh $ sudo sh pkg_install_ubuntu.sh
こちらのURL から Linux版の OpenRTP (コンポーネント開発ツール、システム開発ツール統合環境) をダウンロード、インストールします。 OepnRTP の実行には Java も必要となりますので default-jre パッケージをインストールします。
$ apt-get install default-jre $ wget http://openrtm.org/pub/openrtp/packages/1.1.2.v20160526/eclipse442-openrtp112v20160526-ja-linux-gtk-x86_64.tar.gz $ tar xvzf eclipse442-openrtp112v20160526-ja-linux-gtk-x86_64.tar.gz
eclipse起動後、RTSystemEditor でネームサーバに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。
$ hostname ubuntu1404 ← ホスト名は ubuntu1404 $ sudo vi /etc/hosts
127.0.0.1 localhost を以下のように変更 127.0.0.1 localhost ubuntu1404
$ sudo apt-get install cmake cmake-gui
Code::Blocks は C/C++ に対応した統合開発環境です。 以下のコマンドでインストールできます。
$ sudo apt-get install codeblocks
最新版を入手したい場合は以下のコマンドを入力します。
$ sudo add-apt-repository ppa:damien-moore/codeblocks-stable $ sudo apt-get update $ sudo apt-get install codeblocks
シミュレーターコンポーネントについては手動でビルドを行います。 以下のコマンドを入力してください。
$ wget https://raw.githubusercontent.com/Nobu19800/RTM_Tutorial_iREX2017/master/script/install_ev3_simulator.sh $ sudo sh install_ev3_simulator.sh
インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布の USBメモリー内のスクリプトを起動してください。
$ sudo sh install_ev3_simulator_usb.sh
RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度を設定するコンフィギュレーションパラメーターを持っています。
コンポーネント名称 | RobotController |
InPort | |
ポート名 | in |
型 | TimedBooleanSeq |
説明 | センサー値 |
OutPort | |
ポート名 | out |
型 | TimedVelocity2D |
説明 | 目標速度 |
Configuration | |
パラメーター名 | speed_x |
型 | double |
デフォルト値 | 0.0 |
制約 | -1.0<x<1.0 |
Widget | slider |
Step | 0.01 |
説明 | 直進速度の設定 |
Configuration | |
パラメーター名 | speed_r |
型 | double |
デフォルト値 | 0.0 |
制約 | -2.0<x<2.0 |
Widget | slider |
Step | 0.01 |
説明 | 回転速度の設定 |
2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。
struct Velocity2D { /// Velocity along the x axis in metres per second. double vx; /// Velocity along the y axis in metres per second. double vy; /// Yaw velocity in radians per second. double va; }; struct TimedVelocity2D { Time tm; Velocity2D data; };
このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。
vx、vy、vaはロボット中心座標系での速度を表しています。
Educator Vehicle改のように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。
直進速度vx、回転速度vaを指定することでロボットの操作を行います。
RobotController コンポーネントの雛型の生成は、RTCBuilder を用いて行います。
Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。
まずは Eclipse を起動します。 OpenRTP を展開したディレクトリーに移動して以下のコマンドを入力します。
$ ./openrtp
最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。
すると、以下のような Welcome ページが表示されます。
Welcome ページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。
右上の [Open Perspective] ボタンをクリックしてください。
「RTC Builder」を選択することで、RTCBuilderが起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが現れます。
RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。
左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。
「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] をクリックします。
指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。
生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。
RTC.xmlが生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。
まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた RobotController コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。
次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。
RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。
さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。
次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。
直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。
次に、「言語・環境」タブを選択し、プログラミング言語を選択します。 ここでは、C++(言語) を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。
最後に、「基本」タブにある [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。
※ 生成されるコード群は、eclipse起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え...] で確認することができます。
RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt から Visual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。
CMake を利用してビルド環境の Configure を行います。 まずは CMake(cmake-gui) を起動してください。
$ cmake-gui
画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txt がある場所) と、ビルドディレクトリーを指定します。
ソースコードの場所は RobotController コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/RobotController になります。
このディレクトリーはエクスプローラから cmake-gui にドラックアンドドロップすると手入力しなくても設定されます。
ビルドディレクトリーとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/RobotController/build のように分かりやすい名前をつけた RobotController のサブディレクトリーを指定することをお勧めします。
Where is the soruce code | /home/ユーザー名/RobotController |
Where to build the binaries | /home/ユーザー名/RobotController\build |
指定したら、下の [Configure] ボタンをクリックします。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は CodeBlocks - Unix Makefiles を指定します。 Code::Blocks を使わない場合は Unix Makefiles を使ってください。
また cmake-gui を使用しない場合は以下のコマンドでファイルを生成できます。
$ mkdir build $ cd build $ cmake .. -G "CodeBlocks - Unix Makefiles"
ダイアログで [Finish] をクリックすると Configure が始まります。問題がなければ下部のログウインドウに「Configuring done」と出力されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と出ればプロジェクトファイル・ソリューションファイル等の出力が完了します。
なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] を選択して、キャッシュを削除してから Configure からやり直してください。
次に先ほど指定した build ディレクトリーの中の RobotController.cbp をダブルクリックして Visual Studio 2013 を起動します。
ヘッダ (include/RobotController/RobotController.h) およびソースコード (src/RobotController.cpp) をそれぞれ編集します。 Code::BlocksのProjectsからRobotController.h、RobotController.cpp をクリックすることで編集画面が開きます。
64bitの環境の場合に Code::Blocks の動作が不安定になることがあります。 その場合は code completion というプラグインを無効化すると動作することがあります。
「Plugins」>「Manage plugins...」を選択します。
「code completion」を選択して [Disable] ボタンをクリックします。
動作しないときはこの手順を試してください。
RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in)から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。
onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。
センサー値を一時的に格納する変数 sensor_data を宣言します。
private: bool sensor_data[2]; //センサー値を一時格納する変数
下記のように、onActivated()、onDeactivated()、onExecute() を実装します。
RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id) { //センサー値初期化 for (int i = 0; i < 2; i++) { sensor_data[i] = false; } return RTC::RTC_OK; }
RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id) { //ロボットを停止する m_out.data.vx = 0; m_out.data.va = 0; m_outOut.write(); return RTC::RTC_OK; }
RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id) { //入力データの存在確認 if (m_inIn.isNew()) { //入力データ読み込み m_inIn.read(); for (int i = 0; i < m_in.data.length(); i++) { //入力データ格納 if (i < 2) { sensor_data[i] = m_in.data[i]; } } } //前進するときのみ停止するかを判定 if (m_speed_x > 0) { for (int i = 0; i < 2; i++) { //タッチセンサのオンオフを判定 if (sensor_data[i] == true) { //タッチセンサがオンの場合は停止 m_out.data.vx = 0; m_out.data.va = 0; m_outOut.write(); return RTC::RTC_OK; } } } //すべてのタッチセンサがオフの場合はコンフィギュレーションパラメーターの値で操作 m_out.data.vx = m_speed_x; m_out.data.va = m_speed_r; m_outOut.write(); }
Code::Blocksの [ビルド] ボタンをクリックしてビルドを行います。
作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。
以下より EV3Simulator コンポーネントをダウンロードしてください。
インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。
コンポーネントの参照を登録するためのネームサービスを起動します。
$ rtm-naming
RobotController コンポーネントを起動します。
RobotController\build\srcフォルダーの RobotControllerComp ファイルを実行してください。
$ RobotControllerComp
EV3SimulatorComp コンポーネントをインストールしたディレクトリーに移動後、下記のコマンドにて起動できます。
$ src/EV3SimulatorComp
下図のように、RTSystemEditor にて RobotController コンポーネント、EV3Simulator コンポーネントを接続します。 システムダイアグラムは左上のOpen New System Editorボタンで表示できます。
RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。
下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。
正常に動作している場合は、開始し位置から直進した場合に壁の前で停止します。
正常に動作していない場合は、壁に接触後にそのまま前進を続けます。
講習会で EV3実機を用意している場合は実機での動作確認が可能です。
手順は以下の通りです。
EV3 は分解した状態で参加者に配ります。 組み立て方は以下の通りです。
ただし、超音波センサー、カラーセンサー、ジャイロセンサーについては、講習で使用しないため取り付ける必要はありません。 以下の※の作業については、時間が余った人が実施してください。
まずは土台部分を取り出してください。
右側のタッチセンサーを取り付けてください。
超音波センサーを取り付けてください※。
Lモーター右 | ポート C | 25cmケーブル |
Lモーター左 | ポート B | 25cmケーブル |
Mモーター※ | ポートA | 25cmケーブル |
タッチセンサー右 | ポート 3 | 35cmケーブル |
タッチセンサー左 | ポート 1 | 35cmケーブル |
超音波センサー※ | ポート 4 | 50cmケーブル |
ジャイロセンサー※ | ポート 2 | 25cmケーブル |
ケーブルは EV3 の上下に A~D と 1~4 のポートがあるのでそこにケーブルを接続します。
左右にパーツを取り付けます※。 Lモーター右、Lモーター左、Mモーター、タッチセンサー右、タッチセンサー左のケーブルを挟むようにして取り付けてください※。
Lモーター右、タッチセンサー右のケーブルは右側から、Lモーター左、Mモーター、タッチセンサー左は左側から通してください※。
中央のボタンを押せば電源が投入されます。
EV3 の電源を切る場合は最初の画面で EV3 本体の左上の戻るボタンを押して「Power Off」を選択してください。
再起動する場合は最初の画面で EV3 本体の左上の戻るボタンを押して「Reboot」を選択してください。
ev3dev の起動が途中で停止する場合には、中央ボタン、戻るボタン(左上)、左ボタンを同時押ししてください。画面が消えたら戻るボタンを離すと再起動します。
EV3 の操作画面から「File Browser」を上下ボタンで選択して中央のボタンを押してください。
------------------------------ 192.168.0.1 ------------------------------ [File Browser > ] Device Browser > Wireless and Networks > Battery > Open Roberta Lab > About > ------------------------------
次に scripts を選択して中央ボタンを押してください。
------------------------------ 192.168.0.1 ------------------------------ File Browser ------------------------------ /home/robot ------------------------------ [scripts ] ・・ ・・ ------------------------------
次の画面から start_ap.sh を選択して中央ボタンを押すとスクリプトが起動します。
------------------------------ 192.168.0.1 ------------------------------ File Browser ------------------------------ /home/robot/scripts ------------------------------ ../ Component/ ・・ [start_ap.sh ] ------------------------------
しばらくすると無線LANアクセスポイントが起動するので、指定の SSID のアクセスポイントに接続してください。 SSID、パスワードは EV3 に貼り付けたテープに記載してあります。
SSID、パスワードは EV3に貼り付けたシールに記載してあります。
※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。
続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.0.1 を追加してください。
するとEducatorVehicle0という RTC が見えるようになります。
RTシステムエディタで EducatorVehicle、RobotController コンポーネントを以下のように接続します。
そして RTC をアクティブ化すると EV3の操作ができるようになります。