今までのプログラムでは、一つのRTコンポーネントのみで完結する構造でした。しかし、RTコンポーネントは、複数のプログラム同士を自由に連携させて、より複雑な処理をさせることが大きな特徴です。CPUボードの制御も、一つのプログラム内で取得したセンサ情報などを他のプログラムへ渡したり、逆に別のプログラムからモータ速度などのデータを受け取ったりできれば、CPUボードを様々なプログラムへ組み込むことが出来ます。
では、もう少し実用的なプログラムとして、データ出力ポートを使ってCPUボードの情報を外部に発信してみたいと思います。
では、実際にRTコンポーネントのプロジェクトを作成して見ましょう。最初のテスト用プロジェクトを作成した場合と同様に、eclipseのRTC Builderを起動して、メニューより「File」→「Open New Builder Editor」をクリックしてください。
「基本」のタブでは、先ほどのプロジェクト作成手順と同様に「Module Name」「Module Description」などの名前や、プロジェクトを作成するフォルダ名などを入力してください。ちなみに、今回のサンプルプロジェクトでは「Module Name」を「OUTPUT_TEST」にしています。また、「アクティビティ」のタブで「onExecute」にチェックを入れ、「言語・環境」のタブで「C++」を選択することも忘れずに行ってください。
次に、新しい設定項目として「データポート」のタブを開いてください。ここでは、作成したRTコンポーネントから出力するデータの数とそれぞれの種類を設定します。
今回は下画像の3つのポートを追加します。なお、画像にもある通り、Outputのポートは「OutPort(データ出力ポート)プロファイル」の方で設定します。Input側の設定と間違えないように注意してください。
各ポートの概要は下記の通りです。
追加したら、これまでと同様に「コード生成」でプロジェクトを作成し、新規作成したプロジェクトのフォルダを開いて「copyprops.bat」を実行してください。
続いて、VS-WRC003 SDKをソース・ファイルともに組み込み、Visual Studioからプロジェクトを開いてください。開いたら、onExecute関数を次のように変更します。
RTC::ReturnCode_t OUTPUT_TEST::onExecute(RTC::UniqueId ec_id) |
データ出力ポートを持つプロジェクトを作成すると、出力ポートごとにオブジェクトが設定され、実データをやり取りする変数(構造体)に関連付けられます。オブジェクト名は'm_(設定した変数名)Out'で、変数名は'm_(設定した変数名)'です。出力ポートからデータを送り出す場合は、まず、出力ポートの構造体のメンバ変数'data'に数値を書き込み、続いて、出力ポートのオブジェクトのメソッド'write()'を実行してください。
続いて、作成したRTコンポーネントが正しく動作するか確認してみようと思います。しかし、最初の動作確認に使用した「ConsoleOutComp」では、Inputのポートが「TimedLong」型なので、「TimedUShort」型及び「TimedBoolean」型のOutputである本コンポーネントとは入出力の形式が一致せず、接続できません。
そこで、Inputを持つRTコンポーネント作成の練習も兼ねて、これらの形式から数値を取得して画面に表示するだけの簡単なデバッグプログラムを作成してみたいと思います。
プロジェクトを作成たらVisual Studioで開き、onExecute関数を以下のように変更します。
RTC::ReturnCode_t OUTPUT_CHECK::onExecute(RTC::UniqueId ec_id) |
データ入力ポートはデータ出力ポートと同じく、比較的簡単な手順で数値を扱うことが出来ます。入力ポートのオブジェクト・変数の命名は先ほどと同じですが、'Out'の部分が'In'に変わります。
それぞれのプロジェクトをビルドしたら、実際にRTC System Editorで動かしてみましょう。二つのプロジェクトを実行し、更に「OpenRTM-aist」→「c++」→「tools」の「Start Naming Server」と「RT System Editor」を実行してください。
実行したら「File」→「Open New System Editor」をクリックして「System Diagram」を開き、二つのプロジェクトを追加しましょう。ちなみにNaming Serverとの接続は、最初に一度行なっていれば基本的にやり直す必要はありません。
追加したら、出力ポートと入力ポートをマウスでドラッグして接続しましょう。ドラッグしてポートを接続すると、下記のダイアログを表示します。基本的に「OK」だけクリックすれば問題ありません。
↓マウスでドラッグして、対応するポートまでラインを伸ばす
↓マウスのボタンを離すとダイアログを表示。今回はこの内容のまま「OK」をクリック
↓「OK」をクリックすると正式にラインがつながる
↓同じように別のポートも接続していく
注意として入出力同士の型(Data Type)が一致しないと接続できません。画面中のどのポートがプログラム上のポート名と一致するかは、画面左の「プロパティー」より確認できます。
接続したら「All Active」ボタンをクリックしてプログラムを実行してみましょう。入力ポートを持つプロジェクトのプロンプト画面に下記のようなセンサ情報が1秒ごとに表示されます。CPUボードにセンサを接続し、センサの反応に応じて画面の数値が変わるか確認してみましょう。
次は入力ポートを利用して、CPUボードのモータ・LED・ブザーを制御してみたいと思います。
RTC Builderには、過去に作成したプロジェクトに追加・変更する便利な機能が備わっています。今回の各種捜査も、この機能で最初に作成したプロジェクトを変更して作成することも出来ます。ただし、この機能を利用するとソースファイルなどが自動で書き直され、その際、自分で書き足したソースが消えてしまいます。書き換えられる前のソースは自動的にバックアップされるので、そこからソースを復元できますが、若干操作が複雑になり、ソースの修正し忘れなどによってビルドエラーが発生する場合もあります。
今回の説明では基本的にこの機能を利用せず解説を進めますが、今後の開発で利用してみると良いかもしれません。