サービスポートの設定手順

IDLファイルの作成

使用するIDLファイルを作成します。 OpenRTM-aistのサンプルコンポーネントに付属しているMyService.idlを使用します。 以下のコードをコピーして使用する場合は、行頭のスペースを削除してください。

 module SimpleService {
 typedef sequence<string> EchoList;
 typedef sequence<float> ValueList;
 interface MyService
 {
   string echo(in string msg);
   EchoList get_echo_history();
   void set_value(in float value);
   float get_value();
   ValueList get_value_history();
 };
 };

RTCの作成

Required側のRTC作成

RTC Builderでモジュール名がMyServiceConsumerのRTCを作成してください。 アクティビティはonExecuteを有効にしてください。

次に、作成したIDLファイル(MyService.idl)をRTC Builderのパッケージエクスプローラーから、MyServiceConsumerのidlフォルダにドラッグアンドドロップして、ファイルをコピーします。

/ja/node/7199

サービスポートの設定で、Add Portボタンを押してサービスポート、Add Interfaceボタンを押してサービスインターフェースを追加します。

今回は、ポート名をmyservice0、インターフェース名をMyService、方向をRequired、インターフェース型をSimpleService::MyServiceに設定します。

/ja/node/7199

RTCの仕様をまとめると、以下のようになっています。

コンポーネント名 MyServiceConsumer
言語 C++
アクティビティ onInitialize、onExecute
Service
ポート名 myservice0
Interface
インターフェース名 MyService
方向 Required
インターフェース型 SimpleService::MyService

RTC Builderでコード生成して、onExecute関数を以下のように編集してください。

 RTC::ReturnCode_t MyServiceConsumer::onExecute(RTC::UniqueId /*ec_id*/)
 {
    try
    {
      std::cout << m_MyService._ptr()->echo("test") << std::endl;
    }
    catch (...)
    {
    }
   return RTC::RTC_OK;
 }

IDLファイルで定義したMyServiceインターフェースのecho関数を呼び出しています。 サービスポートを接続すると、Provided側で実装したecho関数が呼ばれます。 Provided側のRTCがアクティブ状態ではない場合、echo関数は例外を投げるためtry~catchで例外処理しています。例外処理をしなかった場合、RTCがError状態に遷移することがあります。

後はビルドして実行ファイルを生成してください。

Provided側のRTC作成

RTC Builderで以下の仕様のRTCを作成してください。 インターフェースの方向はProvidedに設定してください。

コンポーネント名 MyServiceProvider
言語 C++
アクティビティ onInitialize
Service
ポート名 myservice0
Interface
インターフェース名 MyService
方向 Provided
インターフェース型 SimpleService::MyService

コード生成したら、MyServiceSVC_impl.cppSimpleService_MyServiceSVC_impl::echo関数を編集します。

 #include <iostream>
 /*
  * Methods corresponding to IDL attributes and operations
  */
 char* SimpleService_MyServiceSVC_impl::echo(const char* msg)
 {
   std::cout << msg << std::endl;
 
   return CORBA::string_dup(msg);
 }

MyServiceConsumerのonExecute関数でecho関数を呼びましたが、サービスポート接続時にはSimpleService_MyServiceSVC_impl::echo関数が呼ばれます。 戻り値の型が文字列(char*)の場合、CORBA::string_dup関数でmsgからメモリをコピーする必要があります。

編集が完了したらビルドしてください。

動作確認

以下のようにRT System Editorでポートを接続して、RTCをアクティブ化してください。

/ja/node/7199

ウィンドウにtestと連続して表示されていたら正常に動作しています。 これはRequired側ではProvided側のecho関数を呼び出して文字列を渡しています。 Provided側では、受け取った文字列を標準出力後に、Required側に返しています。 最後にRequired側で返された文字列を標準出力しています。

文字列以外のデータを利用する方法、Python、Java、Luaでの使用方法は以下のサンプルコンポーネントを参考にしてください。

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2160
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク