このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。
まずは資料をダウンロードしてください。
ZIPファイルは Lhaplus 等で展開してください。
インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。
シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。
以下の Raspberry Piマウス というロボットのシミュレーションができます。
シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。
Raspberry Piマウスはアールティが販売している独立二輪駆動型の移動ロボットです。
ラズパイマウスの仕様 | |
CPU | Raspberry Pi 2 Model B |
モーター | ステッピングモーターST-42BYG020 2個 |
モータードライバー | SLA7070MRPT 2個 |
距離センサー | 赤色LED+フォトトランジスタ(ST-1K3) 4個 |
モニター用赤色LED | 4個 |
ブザー | 1個 |
スイッチ | 3個 |
バッテリー | LiPo3セル(11.1V)1000mAh 1個 |
RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。
GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。
作成手順は以下の通りです。
以下の環境を想定しています。
RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。
コンポーネント名称 | RobotController |
InPort | |
ポート名 | in |
型 | TimedShortSeq |
説明 | センサー値 |
OutPort | |
ポート名 | out |
型 | TimedVelocity2D |
説明 | 目標速度 |
Configuration | |
パラメーター名 | speed_x |
型 | double |
デフォルト値 | 0.0 |
制約 | -1.5<x<1.5 |
Widget | slider |
Step | 0.01 |
説明 | 直進速度の設定 |
Configuration | |
パラメーター名 | speed_r |
型 | double |
デフォルト値 | 0.0 |
制約 | -2.0<x<2.0 |
Widget | slider |
Step | 0.01 |
説明 | 回転速度の設定 |
Configuration | |
パラメーター名 | stop_d |
型 | int |
デフォルト値 | 30 |
説明 | 停止するセンサー値の設定 |
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はロボット中心座標系での速度を表しています。
Raspberry Pi マウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。
直進速度vx、回転速度vaを指定することでロボットの操作を行います。
Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。
デバイスファイルから取得した数値 | 実際の距離[m] |
1394 | 0.01 |
792 | 0.02 |
525 | 0.03 |
373 | 0.04 |
299 | 0.05 |
260 | 0.06 |
222 | 0.07 |
181 | 0.08 |
135 | 0.09 |
100 | 0.10 |
81 | 0.15 |
36 | 0.20 |
17 | 0.25 |
16 | 0.30 |
シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。
RobotController コンポーネントの雛型の生成は、RTCBuilder を用いて行います。
Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。
まずは Eclipse を起動します。 Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.2.0」>「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++(言語)を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。
最後に、「基本」タブにあ [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。
プロジェクトを右クリックして、「表示方法」→「システム・エクスプローラー」を選択するとワークスペースをエクスプローラーで開くことができます。
RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt からVisual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。
CMake を利用してビルド環境の Configure を行います。 まずは CMake(cmake-gui) を起動してください。「スタート」>「アプリビュー(右下矢印)」>「CMake 3.11.2」>「CMake (cmake-gui)」をクリックすると起動できます。
画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txtがある場所) と、ビルドディレクトリーを指定します。
ソースコードの場所は RobotController コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/RobotController になります。
このディレクトリーはエクスプローラから cmake-gui にドラックアンドドロップすると手入力しなくても設定されます。
ビルドディレクトリーとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/RobotController/build のように分かりやすい名前をつけた RobotController のサブディレクトリーを指定することをお勧めします。
Where is the soruce code | C:\workspace\RobotController |
Where to build the binaries | C:\workspace\RobotController\build |
指定したら、下の [Configure] ボタンをクリックします。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は Visual Studio 15 2017 とします。Visual Studio 2013や Visual Studio 2019を利用している方はそれぞれ変更してください。 またプラットフォームにはx64を設定します。32bit版をインストールしている場合はWin32を選択してください。
ダイアログで [Finish] ボタンをクリックすると Configure が始まります。 問題がなければ下部のログウインドウに「Configuring done」と出力されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と出ればプロジェクトファイル・ソリューションファイル等の出力が完了します。
なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] でキャッシュを削除して Configure からやり直してください。
次に先ほど指定した build ディレクトリーの中の RobotController.sln をダブルクリックして Visual Studio 2013 を起動します。
※cmake-gui の新しいバージョンでは cmake-gui 上のボタンをクリックすることで起動できます。
RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。
onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。
センサー値を一時的に格納する変数 sensor_data を宣言します。
private: int sensor_data[4]; //センサー値を一時格納する変数
下記のように、onActivated()、onDeactivated()、onExecute() を実装します。
RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id) { //センサー値初期化 for (int i = 0; i < 4; i++) { sensor_data[i] = 0; } 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 < 4) { sensor_data[i] = m_in.data[i]; } } } //前進するときのみ停止するかを判定 if (m_speed_x > 0) { for (int i = 0; i < 4; i++) { //センサー値が設定値以上か判定 if (sensor_data[i] > m_stop_d) { //センサー値が設定値以上の場合は停止 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(); return RTC::RTC_OK; }
Visual Studioの [ビルド] >「ソリューションのビルド」を選択してビルドを行います。
作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。
コンポーネントの参照を登録するためのネームサービスを起動します。
RT System Editorのネームサービス起動ボタンを押すと起動します。
&color(red){※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。
RobotController コンポーネントを起動します。
RobotController\build\src\Debug(もしくは、Release)フォルダーの RobotControllerComp.exe ファイルを実行してください。
このコンポーネントは先ほどダウンロードしたファイル(RTM_Tutorial_RaspberryPiMouse.zip)を展開したフォルダーの EXE/RaspberryPiMouseSimulatorComp.exe を実行すると起動します。
下図のように、RTSystemEditor にて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。
RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。
下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。
講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能ですので、時間に余裕がある人は試してみてください。
手順は以下の通りです。
Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。
内側の電源スイッチをオンにするとRaspberry Piが起動します。
Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。
アクセスポイントへの接続方法は以下のページを参考にしてください。
SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあります。
まず右下のネットワークアイコンをクリックしてください。
続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。
すると以下の3つの RTC が見えるようになります。
RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。
RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。
動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。
そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。
このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。
まずは資料をダウンロードしてください。
git clone https://github.com/OpenRTM/RTM_Tutorial_RaspberryPiMouse
インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。
シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。
以下の Raspberry Piマウス というロボットのシミュレーションができます。
シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。
Raspberry Piマウスはアールティが販売している独立二輪駆動型の移動ロボットです。
ラズパイマウスの仕様 | |
CPU | Raspberry Pi 2 Model B |
モーター | ステッピングモーターST-42BYG020 2個 |
モータードライバー | SLA7070MRPT 2個 |
距離センサー | 赤色LED+フォトトランジスタ(ST-1K3) 4個 |
モニター用赤色LED | 4個 |
ブザー | 1個 |
スイッチ | 3個 |
バッテリー | LiPo3セル(11.1V)1000mAh 1個 |
RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。
GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。
作成手順は以下の通りです。
Linux (ここでは Ubuntu 18.04 を仮定) 上に開発環境を構築します。
ubuntu 18.04 (64bit) の場合 $ wget https://raw.githubusercontent.com/OpenRTM/OpenRTM-aist/master/scripts/pkg_install_ubuntu.sh $ sudo sh pkg_install_ubuntu.sh
$ sudo apt-get install openjdk-8-jdk
Ubuntu 18.04、18.10の場合は以下のコマンドでjava8に切り替えます。
$ sudo update-alternatives --config java
eclipse起動後、RTSystemEditor でネームサーバに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。
$ hostname ubuntu1804 ← ホスト名は ubuntu1804 $ 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
ODEのビルドに必要です。
$ sudo apt-get install premake4
シミュレーターコンポーネントについては手動でビルドを行います。 以下のコマンドを入力してください。
$ wget https://raw.githubusercontent.com/OpenRTM/RTM_Tutorial_RaspberryPiMouse/master/script/install_raspimouse_simulator.sh $ sh install_raspimouse_simulator.sh
インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布の USBメモリー内のスクリプトを起動してください。
$ sh install_raspimouse_simulator_usb.sh
RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。
コンポーネント名称 | RobotController |
InPort | |
ポート名 | in |
型 | TimedShortSeq |
説明 | センサー値 |
OutPort | |
ポート名 | out |
型 | TimedVelocity2D |
説明 | 目標速度 |
Configuration | |
パラメーター名 | speed_x |
型 | double |
デフォルト値 | 0.0 |
制約 | -1.5<x<1.5 |
Widget | slider |
Step | 0.01 |
説明 | 直進速度の設定 |
Configuration | |
パラメーター名 | speed_r |
型 | double |
デフォルト値 | 0.0 |
制約 | -2.0<x<2.0 |
Widget | slider |
Step | 0.01 |
説明 | 回転速度の設定 |
Configuration | |
パラメーター名 | stop_d |
型 | int |
デフォルト値 | 30 |
説明 | 停止するセンサー値の設定 |
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はロボット中心座標系での速度を表しています。
Raspberry Piマウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。
直進速度vx、回転速度vaを指定することでロボットの操作を行います。
Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。
デバイスファイルから取得した数値 | 実際の距離[m] |
1394 | 0.01 |
792 | 0.02 |
525 | 0.03 |
373 | 0.04 |
299 | 0.05 |
260 | 0.06 |
222 | 0.07 |
181 | 0.08 |
135 | 0.09 |
100 | 0.10 |
81 | 0.15 |
36 | 0.20 |
17 | 0.25 |
16 | 0.30 |
シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。
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 をダブルクリックしてCode::Blocks を起動します。
ヘッダ (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: double sensor_data[4]; //センサー値を一時格納する変数
下記のように、onActivated()、onDeactivated()、onExecute() を実装します。
RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id) { //センサー値初期化 for (int i = 0; i < 4; i++) { sensor_data[i] = 0; } 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 < 4) { sensor_data[i] = m_in.data[i]; } } } //前進するときのみ停止するかを判定 if (m_speed_x > 0) { for (int i = 0; i < 4; i++) { //センサ値が設定値以上か判定 if (sensor_data[i] > m_stop_d) { //センサ値が設定値以上の場合は停止 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(); return RTC::RTC_OK; }
Code::Blocksの [ビルド] ボタンをクリックしてビルドを行います。
作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。
コンポーネントの参照を登録するためのネームサービスを起動します。
$ rtm-naming
RobotController コンポーネントを起動します。
RobotController\build\srcフォルダーの RobotControllerComp ファイルを実行してください。
$ RobotControllerComp
RaspberryPiMouseSimulator コンポーネントをインストールしたディレクトリーに移動後、下記のコマンドにて起動できます。
$ src/RaspberryPiMouseSimulatorComp
下図のように、RTSystemEditorにて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。
RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。
下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。
講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。
手順は以下の通りです。
Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。
内側の電源スイッチをオンにするとRaspberry Piが起動します。
Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。
SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあるので、その SSID に接続してください。
※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。
続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。
すると以下の2つの RTC が見えるようになります。
RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。
RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。
動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。
そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。