Creating RTCs on OpenRTM-aist C++ for Ubuntu
Ubuntu OS上のOpenRTM-aist C++版でRTコンポーネントを作成する方法を解説します。
▶ 更新履歴
-
22/12/2013 ソースコードの説明を行ごとに指示するよう変更しました。
3. テンプレートの生成
まずは「ConsoleIn」のテンプレートを生成しましょう。
テンプレートの生成には、OpenRTPを使用します。
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. ソフトウェアのインストール
今回は、ビルド環境の設定に必要ソフトウェアをインストールします。
まずは、ビルド環境の自動設定を行なってくれる、CMakeをインストールします。

OpenRTPが起動すると以下の画面が起 動します。
テンプレートの作成には「RTC Builder」を使用するので、「パースペクティブを開く(Open Perspective)」から
「その他(other)」を選択し、「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 アクションコールバックの設定
①のアクティビティタグ(Activity)を選択し、RTコンポーネントのアクションコールバックを設定します。
アクションコールバックはコンポーネントの状態に合わせて呼ばれる関数です。
今回は以下のアクションコールバックを使用します。
②の領域からアクティビティを選択して、それぞれ③のONボタンを押します。
このボタンはアクティビティを選択するごとに、その都度押して下さい。
-
onInitialize
コンポーネントの初期化時に呼ばれます。初期化に必要な処理を記述します。
-
onActivated
Inactive状態からActive状態になるときに呼ばれます。ループの前処理に使用します。
-
onDeactivated実行周期:RTコンポーネントの実行周期を指定します。単位はHzです。
Active状態からInactive状態になるときに呼ばれます。ループの後処理に使用します。
-
onExecute
RTコンポーネントがActive状態のときに周期的に呼ばれます。
RTコンポーネントの周期で設定した値は、onExecuteが呼び出される周期となります。
ほんとどの場合、RTシステムには繰り返し処理が必要となりますので、メインの処理をここに記述することになります。
3.3 データポートの設定
①のデータポート(Data Ports)を選択し、RTコンポーネントのデータポートを設定します。
データポートは、RTコンポーネント同士がデータをやり取りする基本的な機能です。
ConsoleInは、ユーザがキーボードに入力した値をOutポートから出力します。
-
Outポートの追加
②のAddボタンを押して、Outポートを追加します。
③の領域にポート名を入力します。今回は「keyboard」とします。
-
Outポートの設定
④の領域からOutポート設定を行います。
データ型:データポートの型を指定します。今回はTimedLongを使用します。
これはlong型(-2147483648~2147483647)のデータと、タイムスタンプがセットになっている型です。
今回は使用しませんが、このタイムスタンプは主にシステムの同期に使用します。
変数名:データポートに名付けられる変数名を指定します。今回は「data」とします。
表示位置:ポートの位置はRT System Editor上でRTCが表示されるときに、どこにポートを表示するか選ぶことができます。
今回はRIGHTを選択します。
3.5 コードの生成
①の基本(Basic)を選択し、基本情報の入力フォームに戻ります。
②のコード生成ボタンを押すと、テンプレートが生成されます。
Informationダイアログが立ち上がり、「Generate success.」と表示されれば、テンプレートの生成は完了です。

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



ダイアログの「Yes」ボタンを押すと、ビルド方法を設定するダイアログが表示されます。
①のプルダウンメニューから「Unix Makefiles」を選択します。
②の「Use default native compilers」にチェックが入っていることを確認して「Finish」ボタンを押します。

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

成功すれば以下のよ うに、「Generate done」と表示されます。
これでテンプレートの生成は完了です。
5. コーディング
ついに「ConsoleIn」のコーディングを行います。
コーディングには、「gedit」や「emacs」などの任意のエディターを使用してください。
ここでは最低限の説明だけを行い、C++言語の解説や、エディタの詳しい使い方は他のサイトや書籍に譲ります。
/workspace/ConsoleIn/srcの中にある、「ConsoleIn.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内の数値をアウトポートから出力します。
以上のコーディングが終了したら、~/workspace/ConsoleIn/build/srcにあるMakefileを使用してmakeを行います。
もしエラーが出た場合は、コードの記述ミスを探して修正して下さい。
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となっています。
以上のコーディングが終了したら、~/workspace/ConsoleOut/build/srcにあるMakefileを使用してmakeを行います。
無事ビルドできた場合は、~/workspace/ConsoleOut/build/srcに「ConsoleOutComp」が生成されているはずです。
~/workspace/ConsoleOutにある「ConsoleOut.conf」と「rtc.conf」を、
実行ファイルがある~/workspace/ConsoleOut/build/srcにコピーして下さい。
これで、ConsoleOut RTCの完成です。
7. 動作確認
基本的には環境のインストール時に行った動作確認方法と同じです。
ただし、今回はRT System EditorはOpenRTPのパースペクティブを切り替えて使用します。
①の「「RT System Editor」パースペクティブ(RT System Editor perspective)」のボタンを押します。
するとパースペクティブがRT System Editorに切り替わるので、あとは以前と同じです。
3.4 言語の指定
①の言語・環境(Language and Environment)タブを選択します。
②のC++にチェックを入れます。
$ sudo apt-get install cmake-gui
$ sudo apt-get install doxygen







無事ビルドできた場合は、~/workspace/ConsoleIn/build/srcに「ConsoleInComp」が生成されているはずです。
~/workspace/ConsoleInにある「ConsoleIn.conf」と「rtc.conf」を、
実行ファイルがある~/workspace/ConsoleIn/build/srcにコピーして下さい。
これで、ConsoleIn RTCの完成です。
$ make
