Creating RTCs on OpenRTM-aist C++ for Windows
Windows OS上のOpenRTM-aist C++版でRTコンポーネントを作成する方法を解説します。
▶ 更新履歴
-
06/20/2014 Pythonの環境変数の登録順番について、注意を追加しました。
-
29/01/2014 IDLコンパイラを64bitのWindowsでも使用できるよう、Pythonのインストール方法を変更しました。
-
22/12/2013 ソースコードの説明を行ごとに指示するよう変更しました。

3. テンプレートの生成
まずは「ConsoleIn」のテンプレートを生成しましょう。
テンプレートの生成には、RTミドルウェアの統合開発環境環境であるOpenRTPを使用します。
OpenRTPはeclipseのプラグインとして実装されています。
OpenRTPを解凍するとeclipseというフォルダがあり、その中のeclipse.exeをダブルクリックして起動して下さい。
*eclipseの動作にはJavaが必要となります。Javaがインストールされていない場合はインストールして下さい。
1. はじめに
OpenRTM-aistの動作確認に使用したConsoleInとConsoleOutを作成しながら、RTコンポーネントの作成方法を学びます。
RTコンポーネントの作成手順は以下のようになります。
(1) テンプレートの生成
(2) ビルド環境の設定
(3) コーディング
(4) 動作確認
RTコンポーネントの基本的な機能である、RTコンポーネント間の通信やRTコンポーネントの状態遷移などのRTMの基本となる処理に関しては、テンプレート生成時に自動的に記述されます。
そのため、開発者はRTコンポーネントのコアロジックの記述に集中することができます。
それでは早速、RTコンポーネントを作成してみましょう。
8. おわりに
これでOpenRTM-aist C++版でRTコンポーネントを作成することができるようになりました。
これを参考に自分のRTコンポーネントをどんどん作成してみて下さい。
ちなみにInitialize時と、Activated時、Deactivated時にそれぞれ先ほどコーディングしたメッセージが表示されましたか?
見逃した場合はもう一度RTCの実行からやり直してみて下さい。
RTCの状態が変化していることがよくわかると思います。
このように各状態に何か処理を書くことで、必要なRTシステムを構築していきます。
2. 必要なソフトウェア
RTコンポーネントの作成に必要なソフトウェアを以下に示します。
これらのソフトウェアはOpenRTM-aistのオフィシャルホームページからもダウンロードできます。
・OpenRTP 1.1.0-RC4
eclipse381-openrtp110rc4v20130216-ja-win32-x86_64.zip
・Visual Studio 2010 or Visual C++ 2010
・CMake
・Doxygen
・PyYAML
■Windows XP / 7 / 8 64bitの場合
・Python
Windows x86 MSI Installer (2.6.6) (sig)
Windows x86-64 MSI Installer (2.7.6) (sig)
Windows x86-64 MSI Installer (3.3.3) (sig)
複数バージョンのPythonを共存させるには、いくつか設定が必要です。
ここを参考に、設定を行って下さい。
* OpenRTM-aist Python版を併用する場合は、Pythonの環境変数をOpenRTM関連の変数より後ろに登録する必要があります。
どれがRTM関連の変数かわからない場合は、一番後ろにPythonの環境変数を登録してください。
独自定義型とサービスに必要な、IDLファイルのコンパイルを正常に行うために必要な処置となります。
■Windows XP / 7 / 8 32bitの場合
・Python
Windows x86 MSI Installer (2.6.6) (sig)
こらのソフトウェアをダウンロード後インストールを行なって下さい。
OpenRTPはインストールは不要です。圧縮ファイルを適当な場所に解凍してください。
はじめて起動すると以下のように、ワークスペースを選択するダイアログが表示されます。
今後OpenRTMの開発に使用するフォルダを指定して下さい。
また、「この選択をデフォルトとして使用し、今後この質問を表示しない」にチェックをつければ、起動時に毎回聞かれずに済みます。

OpenRTPが起動すると以下の画面が起動します。
この画面はRT System Editorとなっています。
以下のどちらかの方法で、RTC Builderにパースペクティブを切り替えます。
①の「「RTC Builder」 パースペクティブ」ボタンを押します。
②の「パースペクティブを開く」から「その他」を選択し、「RTC Builder」を選択します。

RTC Builderにパースペクティブを切り替えると、以下のような画面となります。
①の「Open New RtcBuilder Editor」ボタンを押します。
すると新しいプロジェクト名を指定するダイアログが立ち上がります。
まずは、ConsoleInを作成するので、プロジェクト名は「ConsoleIn」として下さい。

新規プロジェクトを立ち上げると、以下の画面が表示されます。
① 作成しているパッケージが参照できます。
② 編集中のパッケージや起動中のSystem Editorを切り替えることができます。
③ RTコンポーネントのテンプレート作成に必要な情報を入力します。
④ 入力する情報を切り替えるタブです。
⑤ 作成中のRTコンポーネントの形状(データポートの数や種類)を確認することができます。
②の領域に情報を入力することでテンプレートを作成できます。


3.1 基本情報の入力
まずは基本情報を入力します。以下の図の①の部分に次の情報を入力して下さい。
-
モジュール名:RTコンポーネントを識別する名前です。
ConsoleIn
-
ベンダ名:RTコンポーネントの製作者の名前です。信頼できるベンダかどうかユーザは確認することができます。
あなたの名前
-
モジュールカテゴリ:RTコンポーネントのカテゴリを入力します。使用方法は未定だそうです。
TEST
-
実行周期:RTコンポーネントの実行周期を指定します。単位はHzです。
100
3.2 アクションコールバックの設定
①のアクティビティタグを選択し、RTコンポーネントのアクションコールバックを設定します。
アクションコールバックはコンポーネントの状態に合わせて呼ばれる関数です。
今回は以下のアクションコールバックを使用します。
②の領域からアクティビティを選択して、それぞれ③のONボタンを押します。
このボタンはアクティビティを選択するごとに、その都度押して下さい。
-
onInitialize
コンポーネントの初期化時に呼ばれます。初期化に必要な処理を記述します。
-
onActivated
Inactive状態からActive状態になるときに呼ばれます。ループの前処理に使用します。
-
onDeactivated実行周期:RTコンポーネントの実行周期を指定します。単位はHzです。
Active状態からInactive状態になるときに呼ばれます。ループの後処理に使用します。
-
onExecute
RTコンポーネントがActive状態のときに周期的に呼ばれます。
RTコンポーネントの周期で設定した値は、onExecuteが呼び出される周期となります。
ほんとどの場合、RTシステムには繰り返し処理が必要となりますので、メインの処理をここに記述することになります。

3.3 データポートの設定
①のデータポートを選択し、RTコンポーネントのデータポートを設定します。
データポートは、RTコンポーネント同士がデータをやり取りする基本的な機能です。
ConsoleInは、ユーザがキーボードに入力した値をOutポートから出力します。
-
Outポートの追加
②のAddボタンを押して、Outポートを追加します。
③の領域にポート名を入力します。今回は「keyboard」とします。
-
Outポートの設定
④の領域からOutポート設定を行います。
データ型:データポートの型を指定します。今回はTimedLongを使用します。
これはlong型(-2147483648~2147483647)のデータと、タイムスタンプがセットになっている型です。
今回は使用しませんが、このタイムスタンプは主にシステムの同期に使用します。
変数名:データポートに名付けられる変数名を指定します。今回は「data」とします。
表示位置:ポートの位置はRT System Editor上でRTCが表示されるときに、どこにポートを表示するか選ぶことができます。
今回はRIGHTを選択します。

3.5 コードの生成
①の基本を選択し、基本情報の入力フォームに戻ります。
②のコード生成ボタンを押すと、テンプレートが生成されます。
Informationダイアログが立ち上がり、「Generate success.」と表示されれば、テンプレートの生成は完了です。


4. ビルド環境の設定
CMakeを使用することで、開発者の環境に合わせたビルドの設定を自動的に行います。
まずは、CMakeを起動します。
起動後、①の領域に先ほど作成したConsoleInプロジェクトのパスを指定します。
私の場合は以下のようになります。
C:/Users/Hiro/workspace/OpenRTM/ConsoleIn
次に②の領域に、~/ConsoleIn/buildとパスを指定しています。
このbuildフォルダにソルーションファイルが作成されます。
③の「Configure」ボタンを押します。
すると「Create Directoryダイアログ」が表示され、buildフォルダを作成するか聞かれるので「Yes」を押して下さい。



ダイアログの「Yes」ボタンを押すと、ビルド方法を設定するダイアログが表示されます。
①のプルダウンメニューからジェネレータを選択します。
■64bit OSの場合
Visual Studio 10 Win64
■32bit OSの場合
Visual Studio 10
②の「Use default native compilers」にチェックが入っていることを確認して「Finish」ボタンを押します。

成功すれば以下のように、「Configure done」と表示されます。
次に、「Generate」ボタンを押します。

成功すれば以下のように、「Generate done」と表示されます。
これでテンプレートの生成は完了です。
5. コーディング
ついに「ConsoleIn」のコーディングを行います。
Windows環境ではコーディングにVisual Studio 2010を使用します。
ここでは最低限の説明だけを行い、C++言語の解説や、Visual Studioの詳しい使い方は他のサイトや書籍に譲ります。
~\ConsoleIn\buildフォルダの中にある、「ConsoleIn.sln」をダブルクリックします。
すると、以下のようにVisual StudioもしくはVisual C++が起動します。
①のソリューションエクスプローラから「ConsoleIn」を展開します。
さらに、「Source Files」を展開して、「ConsoleIn.cpp」をダブルクリックします。
②の領域にConsoleln.cppのソースコードの中身が表示されます。
ここにコードを記述していきます。

ConsoleIn.cppに以下のコードを記述します。
RTコンポーネントは、テンプレート内の必要な部分に記述することで作成します。
今回は、使用する4つのアクションコールバック関数の中に処理を記述します。
必要のないコードを変更したり、削除しないよう気をつけて下さい。
下のコードは編集の必要な部分だけ記しています。実際にはこれらのコールバック関数は並んでいません。
以下にコードを示します。
以下のコードは抜粋となります。生成したテンプレートに当てはめて下さい。
-
RTC::ReturnCode_t ConsoleIn::onInitialize()
-
{
-
addOutPort("keyboard", m_dataOut);
-
-
std::cout << "onInitialize" << std::endl;
-
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t ConsoleIn::onActivated(RTC::UniqueId ec_id)
-
-
std::cout << "onActivated" << std::endl;
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t ConsoleIn::onDeactivated(RTC::UniqueId ec_id)
-
{
-
std::cout << "onDeactivated" << std::endl;
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t ConsoleIn::onExecute(RTC::UniqueId ec_id)
-
{
-
std::cout<< "input number:" << std::endl;
-
std::cin >> m_data.data;
-
m_dataOut.write();
-
-
return RTC::RTC_OK;
-
}
-
5行目
RTコンポーネントの初期化時に「onInitilize」と表示します。
-
12行目
RTコンポーネントがInactive状態からActive状態に遷移するとき、「onActivated」と表示します。
-
18行目
RTコンポーネントがActive状態からInactive状態に遷移するとき、「onDeactivated」と表示します。
-
24行目
キー入力を促します。
-
25行目
m_data.dataというメンバ変数にキー入力されたデータを格納します。
変数名は以下のように決まります。
m_変数名
今回はm_dataとなっています。
-
26行目
m_dataOutというOutPortオブジェクトでデータをOutPortから出力します。
m_dataOutの~OutはOutPortの意味です。
このようにして、m_data.data内の数値をアウトポートから出力します。
以上のコーディングが終了したら、Releaseモードに変更した後、F7ボタンを押してビルドして下さい。
もしエラーが出た場合は、コードの記述ミスを探して修正して下さい。
無事ビルドできた場合は、~\ConsoleIn\build\src\Releaseに「ConsoleInComp.exe」が生成されているはずです。
~\ConsoleInにある「ConsoleIn.conf」と「rtc.conf」を実行ファイルがある~\ConsoleIn\build\src\Releaseにコピーして下さい。
これで、ConsoleIn RTCの完成です。
6. ConsoleOutの作成
先程までと同様の方法で「ConsoleOut」を作成します。
ConsoleOutのテンプレートの設定は以下のようになります。
-
モジュール名 ConsoleOut
-
ベンダ名 あなたの名前
-
モジュールカテゴリ TEST
-
実行周期 100
-
アクションコールバック
onInitialize
onActivated
onDeactivated
onExecute
-
ポート名(InPort) receive
-
データ型 TimedLong
-
変数名 data
-
表示位置 LEFT
-
言語 C++
ConsoleOut.cppのコードを以下に示します。
以下のコードは抜粋となります。生成したテンプレートに当てはめて下さい。
-
RTC::ReturnCode_t ConsoleOut::onInitialize()
-
{
-
addInPort("receive", m_dataIn);
-
-
std::cout << "onInitialize" << std::endl;
-
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t ConsoleOut::onActivated(RTC::UniqueId ec_id)
-
{
-
std::cout << "onActivated" << std::endl;
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t ConsoleOut::onDeactivated(RTC::UniqueId ec_id)
-
{
-
std::cout << "onDeactivated" << std::endl;
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t ConsoleOut::onExecute(RTC::UniqueId ec_id)
-
{
-
if(m_dataIn.isNew())
-
{
-
m_dataIn.read();
-
std::cout<< "data is " << m_data.data << std::endl;
-
}
-
return RTC::RTC_OK;
-
}
-
5行目
RTコンポーネントの初期化時に「onInitilize」と表示します。
-
12行目
RTコンポーネントがInactive状態からActive状態に遷移するとき、「onActivated」と表示します。
-
18行目
RTコンポーネントがActive状態からInactive状態に遷移するとき、「onDeactivated」と表示します。
-
23行目
キー入力を促します。
-
24-28行目
m_dataInというInPortオブジェクトのisNewメソッドで新しいデータがあるか調べます。
isNewは新しいデータがあればbool値のtrueを返します。
m_dataInの~InはInPortの意味です。
-
26行目
m_dataInのreadメソッドで値を読み込みます。
-
27行目
データが送られてきた場合は、m_dataという変数に格納されているのでコンソールに受け取った値が表示されます。
m_変数名というふうに命名されので、m_dataとなっています。
以上のコーディングが終了したら、Releaseモードに変更した後、F7ボタンを押してビルドして下さい。
もしエラーが出た場合は、コードの記述ミスを探して修正して下さい。
無事ビルドできた場合は、~\ConsoleOut\build\src\Releaseに「ConsoleOutComp.exe」が生成されているはずです。
~\ConsoleOutにある「ConsoleOut.conf」と「rtc.conf」を実行ファイルがある~\ConsoleOut\build\src\Releaseにコピーして下さい。
これで、ConsoleOut RTCの完成です。
7. 動作確認
基本的には環境のインストール時に行った動作確認方法と同じです。
ただし、今回はRT System EditorはOpenRTPのパースペクティブを切り替えて使用します。
①の「「RT System Editor」パースペクティブ」のボタンを押します。
するとパースペクティブがRT System Editorに切り替わるので、あとは以前と同じです。

3.4 言語の指定
①の言語・環境タブを選択します。
②のC++にチェックを入れます。
