ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今回はコンポーネントオブザーバーのようにRTCが外部のサービスを使う方法について説明します。
まずは利用するサービスをIDLで定義します。
このようにSDOPackage::SDOServiceを継承したインターフェースを定義します。
次にこのようにOpenRTM_aist.SdoServiceConsumerBaseを継承したクラスを作成します。
ここで定義したtestServiceConsumerはtestServiceConsumerInit関数を呼び出すことでファクトリが登録されます。
そして外部からRTCのオブジェクトリファレンスを取得してadd_service_profile関数を呼び出すと、testServiceConsumerのinit関数が呼び出されます。
init関数ではRTCオブジェクトとプロファイルを受け取ることができます。
このプロファイルからサービスのプロバイダ等を取得することができます。
後はアクションでもポートでもいいのでリスナを追加して、その中でサービスを呼び出してやるとRTCからサービスを利用している事にはなります。
まあ独自に外部サービスを作成する人もあまりいないだろうし、あまり知ってても役には立たないような気はしますけど。
普通はRTC自体にサービスポートを作成してそれで使うので、何か事情がない限り上記の方法で追加するのはあまり好ましくないように思います。
次にコネクタのSubscription Typeを独自に作成する方法を説明します。
まずはこのようにPublisherBaseクラスを継承したクラスを作成します。
適当な例が思い浮かばなかったので、今回は1回write関数を呼び出すと2回データを送信するという謎仕様にしています。全く役には立ちません。
そしてrtc.confのmanager.modules.preloadに記述するか何かしらの方法でPublisherTestInit関数を呼び出してファクトリを登録するだけです。
後はRTシステムエディタで接続時にSubscription Typeをtestに設定してあげれば使えます。
まあこれも知っていても独自にパブリッシャーを作成する事もあまりないように思うので、あまり意味はないような気はします。
ただ独自に外部のモジュールを作成して何らかの機能を追加するにしても、RTCがそのモジュールに依存しないように設計するようにはする必要はあると思います。
例えばそのモジュールを使用するためにRTCのソースコードを変更する必要がある、というのは本末転倒なので避けるようにしましょう。
最後に独自のバッファの作り方を説明します。
と言いたいところですが、作り方自体はパブリッシャーやプロバイダ、コンシュマーとあまり変わらないので省略します。
こんな感じでBufferBaseクラスを継承したクラスを作成して、~Init関数でファクトリを登録するだけです。この例はwrite関数を呼び出すと変数にデータを書き込んで、read関数を読み込むと変数をNoneにするというだけなので、実用性は皆無です。
ただRTシステムエディタのコネクタの設定ウィンドウでバッファの種類を選択するドロップダウンリスト等はないみたいなので、詳細から直接入力してください。
dataport.buffer_typeという項目名で設定できます。
全然関係ないけどLuaのCORBA実装のOiLを使ってみたのですけど、何故かomniORBとかみたいな他のCORBA実装と通信できませんでした。何が違うのかは分かりませんけど、面倒なので調べるのはやめておきます。知っている人は教えてください。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
まずは利用するサービスをIDLで定義します。
このようにSDOPackage::SDOServiceを継承したインターフェースを定義します。
次にこのようにOpenRTM_aist.SdoServiceConsumerBaseを継承したクラスを作成します。
ここで定義したtestServiceConsumerはtestServiceConsumerInit関数を呼び出すことでファクトリが登録されます。
そして外部からRTCのオブジェクトリファレンスを取得してadd_service_profile関数を呼び出すと、testServiceConsumerのinit関数が呼び出されます。
init関数ではRTCオブジェクトとプロファイルを受け取ることができます。
このプロファイルからサービスのプロバイダ等を取得することができます。
後はアクションでもポートでもいいのでリスナを追加して、その中でサービスを呼び出してやるとRTCからサービスを利用している事にはなります。
まあ独自に外部サービスを作成する人もあまりいないだろうし、あまり知ってても役には立たないような気はしますけど。
普通はRTC自体にサービスポートを作成してそれで使うので、何か事情がない限り上記の方法で追加するのはあまり好ましくないように思います。
次にコネクタのSubscription Typeを独自に作成する方法を説明します。
まずはこのようにPublisherBaseクラスを継承したクラスを作成します。
適当な例が思い浮かばなかったので、今回は1回write関数を呼び出すと2回データを送信するという謎仕様にしています。全く役には立ちません。
そしてrtc.confのmanager.modules.preloadに記述するか何かしらの方法でPublisherTestInit関数を呼び出してファクトリを登録するだけです。
後はRTシステムエディタで接続時にSubscription Typeをtestに設定してあげれば使えます。
まあこれも知っていても独自にパブリッシャーを作成する事もあまりないように思うので、あまり意味はないような気はします。
ただ独自に外部のモジュールを作成して何らかの機能を追加するにしても、RTCがそのモジュールに依存しないように設計するようにはする必要はあると思います。
例えばそのモジュールを使用するためにRTCのソースコードを変更する必要がある、というのは本末転倒なので避けるようにしましょう。
最後に独自のバッファの作り方を説明します。
と言いたいところですが、作り方自体はパブリッシャーやプロバイダ、コンシュマーとあまり変わらないので省略します。
こんな感じでBufferBaseクラスを継承したクラスを作成して、~Init関数でファクトリを登録するだけです。この例はwrite関数を呼び出すと変数にデータを書き込んで、read関数を読み込むと変数をNoneにするというだけなので、実用性は皆無です。
ただRTシステムエディタのコネクタの設定ウィンドウでバッファの種類を選択するドロップダウンリスト等はないみたいなので、詳細から直接入力してください。
dataport.buffer_typeという項目名で設定できます。
全然関係ないけどLuaのCORBA実装のOiLを使ってみたのですけど、何故かomniORBとかみたいな他のCORBA実装と通信できませんでした。何が違うのかは分かりませんけど、面倒なので調べるのはやめておきます。知っている人は教えてください。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
この記事にコメントする