サービスポート (応用編)

執筆中 (n-ando)

サービスポート(コンシューマ)から相手(プロバイダ)の状態を取得する

コンシューマからプロバイダを呼び出す際には、サービスポートが接続されていて、かつ相手のRTCがActive状態になっている必要があります。コンシューマはコンシューマが接続されているか、相手のRTCがアクティブかどうかを以下の方法で確認することができます。

CORBAコンシューマ型(C++ではRTC::CorbaComsumer<T>)は以下の3つの状態を取ることができます。

  • nil: コンシューマにプロバイダのオブジェクト参照がセットされていない(接続されていない)状態
  • active: プロバイダのオブジェクト参照は割り当てられており、かつ相手のオブジェクトが活性化(RTCもActive状態)になっている状態
  • inactive: プロバイダのオブジェクト参照は割り当てられているが、相手のオブジェクトが非活性化(RTCはInactive状態)になっている状態
プロバイダの状態とRTCの状態は連動しています。

RTC::CorbaComsumer<T>がnilかどうかは、CORBAの標準関数:CORBA::is_nil()で確認することができます。 さらに、オブジェクトがアクティブかどうかは、CORBAオブジェクトのメンバ関数、_non_existent()で確認することができます。

こういった情報はCORBAのマニュアルやドキュメントから得ることができます。一番確実なのはOMGから入手できるCORBAの仕様書を読むことです。

しかしながら、これらの標準仕様書はページ数も多いので、例えばVisiBrokerなどのCORBA製品のマニュアルを利用するとよいかもしれません。

以上の情報から以下のようなサンプルコードが書けます。

&#10; RTC::ReturnCode_t MyServiceConsumer::onExecute(RTC::UniqueId ec_id)&#10; {&#10;   try&#10;     {&#10;       if (CORBA::is_nil(m_myservice0._ptr()))&#10;         {&#10;           std::cout << "[nil] object reference is not assigned." << std::endl;&#10;         }&#10;       else&#10;         {&#10;           if (m_myservice0->_non_existent())&#10;             {&#10;               std::cout << "[inactive] provider is inactive." << std::endl;&#10;             }&#10;           else&#10;             {&#10;               std::cout << "[active] provider is active." << std::endl;&#10;             }&#10;         }&#10;     }&#10;   catch (...)&#10;     {&#10;       std::cout << "Unknown exception." << std::endl;&#10;     }&#10;   coil::sleep(1);&#10;   return RTC::RTC_OK;&#10; }&#10;

このコードのonExecute関数をOpenRTM-aistのサンプルSimpleServiceのMyServiceConsumer.cppのoExecute関数と入れ替えてMyServiceProviderCompとともに実行してみてください。 MyServiceConsumerCompをアクティブ化すると、MyServiceProviderCompのサービスポートが接続されるまではコンシューマ(m_myserivce0)の状態はnilです。MyServiceProviderCompのポートを接続すると、inactive状態になり、その後MyServiceProviderをアクティブ化するとactive状態になります。

以上のようにして、相手のRTCの状態をサービスポートを通して知ることもできます。

最新バージョン

初めての方へ

Windows msi(インストーラ) パッケージ (サンプルの実行ができます。)

C++,Python,Java,
Toolsを含む
1.1.2-RELEASE

RTコンポーネントを開発するためには開発環境のインストールが必要です。詳細はダウンロードページ

統計

Webサイト統計
ユーザ数:1604
プロジェクト統計
RTコンポーネント286
RTミドルウエア21
ツール20
文書・仕様書1

OpenHRP3

動力学シミュレータ

Choreonoid

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

OpenHRI

対話制御コンポーネント群

OpenRTP

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

産総研RTC集

産総研が提供するRTC集

TORK

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

DAQ-Middleware

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

VirCA

遠隔空間同士を接続し、実験を行うことが可能な仮想空間プラットホーム