OpenRTM-aist 2.0.2
|
RT コンポーネント CORBA provider/consumer 用 Port [詳解]
#include <CorbaPort.h>
公開メンバ関数 | |
CorbaPort (const char *name) | |
コンストラクタ | |
~CorbaPort () override | |
仮想デストラクタ | |
void | init (coil::Properties &prop) |
プロパティの初期化 | |
bool | registerProvider (const char *instance_name, const char *type_name, PortableServer::RefCountServantBase &provider) |
Provider を登録する | |
bool | registerConsumer (const char *instance_name, const char *type_name, CorbaConsumerBase &consumer) |
Consumer を登録する | |
![]() | |
PortBase (const char *name="") | |
コンストラクタ | |
~PortBase () override | |
デストラクタ | |
PortProfile * | get_port_profile () override |
[CORBA interface] PortProfileを取得する | |
const PortProfile & | getPortProfile () const |
PortProfile を取得する。 | |
ConnectorProfileList * | get_connector_profiles () override |
[CORBA interface] ConnectorProfileListを取得する | |
ConnectorProfile * | get_connector_profile (const char *connector_id) override |
[CORBA interface] ConnectorProfile を取得する | |
ReturnCode_t | connect (ConnectorProfile &connector_profile) override |
[CORBA interface] Port の接続を行う | |
ReturnCode_t | notify_connect (ConnectorProfile &connector_profile) override |
[CORBA interface] Port の接続通知を行う | |
ReturnCode_t | disconnect (const char *connector_id) override |
[CORBA interface] Port の接続を解除する | |
ReturnCode_t | notify_disconnect (const char *connector_id) override |
[CORBA interface] Port の接続解除通知を行う | |
ReturnCode_t | disconnect_all () override |
[CORBA interface] Port の全接続を解除する | |
void | setName (const char *name) |
Port の名前を設定する | |
const char * | getName () const |
Port の名前を取得する | |
const PortProfile & | getProfile () const |
PortProfileを取得する | |
void | setPortRef (PortService_ptr port_ref) |
Port のオブジェクト参照を設定する | |
PortService_ptr | getPortRef () const |
Port のオブジェクト参照を取得する | |
void | setOwner (RTObject_ptr owner) |
Port の owner の RTObject を指定する | |
void | setOnPublishInterfaces (ConnectionCallback *on_publish) |
インターフェースを公開する際に呼ばれるコールバックをセットする | |
void | setOnSubscribeInterfaces (ConnectionCallback *on_subscribe) |
インターフェースを取得する際に呼ばれるコールバックをセットする | |
void | setOnConnected (ConnectionCallback *on_connected) |
接続完了時に呼ばれるコールバックをセットする | |
void | setOnUnsubscribeInterfaces (ConnectionCallback *on_unsubscribe) |
インターフェースを解放する際に呼ばれるコールバックをセットする | |
void | setOnDisconnected (ConnectionCallback *on_disconnected) |
接続解除に呼ばれるコールバックをセットする | |
void | setOnConnectionLost (ConnectionCallback *on_connection_lost) |
ポートの接続がロストした場合に呼び出されるコールバックをセットする | |
void | setPortConnectListenerHolder (PortConnectListeners *portconnListeners) |
PortConnectListeners のホルダをセットする | |
virtual DirectPortBase * | getDirectPort () |
direct通信用ポートオブジェクト取得 | |
限定公開メンバ関数 | |
ReturnCode_t | publishInterfaces (ConnectorProfile &connector_profile) override |
Provider Interface 情報を公開する | |
ReturnCode_t | subscribeInterfaces (const ConnectorProfile &connector_profile) override |
Provider Interface 情報を取得する | |
void | unsubscribeInterfaces (const ConnectorProfile &connector_profile) override |
Interface への接続を解除する | |
void | activateInterfaces () override |
Port の全てのインターフェースを activates する | |
void | deactivateInterfaces () override |
全ての Port のインターフェースを deactivates する | |
![]() | |
virtual ReturnCode_t | connectNext (ConnectorProfile &connector_profile) |
次の Port に対して notify_connect() をコールする | |
virtual ReturnCode_t | disconnectNext (ConnectorProfile &cprof) |
次の Port に対して notify_disconnect() をコールする | |
virtual void | setConnectionLimit (int limit_value) |
接続の最大数を設定する。 | |
virtual ReturnCode_t | _publishInterfaces () |
Interface情報を公開する | |
bool | isExistingConnId (const char *id) |
id が既存の ConnectorProfile のものかどうか判定する | |
ConnectorProfile | findConnProfile (const char *id) |
id を持つ ConnectorProfile を探す | |
CORBA::Long | findConnProfileIndex (const char *id) |
id を持つ ConnectorProfile を探す | |
void | updateConnectorProfile (const ConnectorProfile &connector_profile) |
ConnectorProfile の追加もしくは更新 | |
bool | eraseConnectorProfile (const char *id) |
ConnectorProfile を削除する | |
bool | appendInterface (const char *instance_name, const char *type_name, PortInterfacePolarity pol) |
PortInterfaceProfile に インターフェースを登録する | |
bool | deleteInterface (const char *name, PortInterfacePolarity pol) |
PortInterfaceProfile からインターフェース登録を削除する | |
template<class ValueType > | |
void | addProperty (const char *key, ValueType value) |
PortProfile の properties に NameValue 値を追加する | |
void | appendProperty (const char *key, const char *value) |
PortProfile の properties に NameValue 値を要素に追加する | |
void | updateConnectors () |
存在しないポートをdisconnectする。 | |
bool | checkPorts (::RTC::PortServiceList &ports) |
ポートの存在を確認する。 | |
void | onNotifyConnect (const char *portname, RTC::ConnectorProfile &profile) |
void | onNotifyDisconnect (const char *portname, RTC::ConnectorProfile &profile) |
void | onUnsubscribeInterfaces (const char *portname, RTC::ConnectorProfile &profile) |
void | onPublishInterfaces (const char *portname, RTC::ConnectorProfile &profile, ReturnCode_t ret) |
void | onConnectNextport (const char *portname, RTC::ConnectorProfile &profile, ReturnCode_t ret) |
void | onSubscribeInterfaces (const char *portname, RTC::ConnectorProfile &profile, ReturnCode_t ret) |
void | onConnected (const char *portname, RTC::ConnectorProfile &profile, ReturnCode_t ret) |
void | onDisconnectNextport (const char *portname, RTC::ConnectorProfile &profile, ReturnCode_t ret) |
void | onDisconnected (const char *portname, RTC::ConnectorProfile &profile, ReturnCode_t ret) |
bool | isExistingMarshalingType (coil::Properties &con_prop) |
指定のシリアライザが使用可能かを判定する | |
限定公開変数類 | |
coil::Properties | m_properties |
プロパティ | |
![]() | |
coil::Properties | m_properties |
プロパティ | |
Logger | rtclog |
ロガーストリーム | |
PortProfile | m_profile |
Port の PortProfile | |
RTC::PortService_var | m_objref |
Port の オブジェクト参照 | |
std::mutex | m_profile_mutex |
PortProfile の mutex | |
std::mutex | m_connectorsMutex |
std::string | m_ownerInstanceName = "unknown" |
インスタンス名 | |
int | m_connectionLimit {-1} |
Port の接続の最大数 | |
ConnectionCallback * | m_onPublishInterfaces {nullptr} |
Callback functor オブジェクト | |
ConnectionCallback * | m_onSubscribeInterfaces {nullptr} |
Callback functor オブジェクト | |
ConnectionCallback * | m_onConnected {nullptr} |
Callback functor オブジェクト | |
ConnectionCallback * | m_onUnsubscribeInterfaces {nullptr} |
Callback functor オブジェクト | |
ConnectionCallback * | m_onDisconnected {nullptr} |
Callback functor オブジェクト | |
ConnectionCallback * | m_onConnectionLost {nullptr} |
Callback functor オブジェクト | |
PortConnectListeners * | m_portconnListeners {nullptr} |
PortConnectListenerホルダ | |
DirectPortBase * | m_directport {nullptr} |
その他の継承メンバ | |
![]() | |
static bool | isEmptyId (const ConnectorProfile &connector_profile) |
ConnectorProfile の connector_id フィールドが空かどうか判定 | |
static std::string | getUUID () |
UUIDを生成する | |
static void | setUUID (ConnectorProfile &connector_profile) |
UUIDを生成し ConnectorProfile にセットする | |
RT コンポーネント CORBA provider/consumer 用 Port
CorbaPort は RT コンポーネントにおいて、ユーザ定義の CORBA オブジェ クトサービスおよびコンシューマを提供する Port 実装である。
RT コンポーネントは、Port を介してユーザが定義した CORBA サービス を提供することができ、これを RT Service (Provider) と呼ぶ。また、 他の RT コンポーネントのサービスを利用するための CORBA オブジェク トのプレースホルダを提供することができ、これを RT Service Consumer と呼ぶ。 CorbaPort は任意の数の Provider および Consumer を管理することがで き、Port 同士を接続する際に対応する Provider と Consumer を適切に 関連付けることができる。 CorbaPort は通常以下のように利用される。
RTC::CorbaPort m_port0; // Port の宣言 MyService_impl m_mysvc0; // この Port が提供する Serivce Provider RTC::CorbaConsumer<YourService> m_cons0; // この Port の Consumer // Service Provider を Port に登録 m_port0.registerProvider("MyService0", "Generic", m_mysvc0); // Service Consumer を Port に登録 m_port0.registerConsumer("YourService0", "Generic", m_cons0 ); // connect が行われた後 m_cons0->your_service_function(); // YourService の関数をコール // connect された 別のコンポーネントにおいて m_cons1->my_service_function(); // MyService の関数をコール
このように、提供したい Service Provider を registerProvider() で登 録することにより、他のコンポーネントから利用可能にし、他方、利用し たい Service Consumer を registerConsumer() で登録することにより他 のコンポーネントの Service をコンポーネント内で利用可能にすること ができる。
PortInterfaceProfile は Port に所属するプロバイダもしくはコンシュー マインターフェースについての情報を記述するためのプロファイルである。 接続を行うツール等は、これらの情報に基づき ConnectorProfile を適切 に生成し、接続を構成する Port のうち任意の一つに対して引数に ConnectorProfile を与えて Port::connect() を呼び出す必要がある。
なお、PortInterfaceProfile のインスタンス名 "*" は特殊なインスタン スを表す。
PROVIDEDすなわちプロバイダのインスタンス名が "*" の場合は、接続開 始時点ではインスタンスが存在せず、コンシューマの要求に応じて動的に インスタンスを生成するタイプのプロバイダであることを表す。したがっ て、接続開始時点ではインスタンス名は存在しないが、接続シーケンス中 のインターフェースを公開するプロセスにおいて、プロバイダは生成した インスタンスに対応した記述子を ConnectorProfile に適正に設定するも のとする。(未実装)
REQUIREDすなわちコンシューマのインスタンス名が "*" の場合は、一つ のコンシューマが複数のプロバイダと接続可能なタイプのコンシューマで あることを示す。(未実装)
以下は、Port間のインターフェースを接続するために ConnectorProfile に マッピングを記述するためのルールを示す。
Portに付属するインターフェースの指定子のフォーマットを以下のように 定める。インターフェースに関するプロパティが以下の場合
インターフェースの指定子を以下の文字列名称で指定するものとする。
<rtc_iname>.port.<port_name>.<if_polarity>.<if_tname>.<if_iname>
PROVIDED(提供)型すなわちプロバイダのインタフェースのプロパティが以 下の場合、
インターフェース指定子は
MyComp0.port.myservice.provided.echo_interface.echo_interface2
のように記述される。また、同様にREQUIRED(要求)型すなわちコンシュー マのインターフェースのプロパティが以下の場合、
インターフェース指定子は、
YourComp0.port.myservice.required.hoge_interface.hoge_inteface1
のように記述することができる。
なお、ここで動的生成インターフェースのインスタンスのための特殊なタ イプのインスタンス名記述子
を定義する。動的生成インターフェースとは、接続時にインスタンスが生 成されるタイプのインターフェースである。(未実装)
コンシューマが要求するプロバイダインターフェース記述子に動的生成型 インスタンス名記述子 "<type_name>*" が指定された場合、プロバイダは インスタンスを1つ新規に生成する。"<type_name>*" の記述子によりプロバ イダを要求する n 個のコンシューマが存在する場合、これらからの要求 (オペレーションコール)を1 つのプロバイダにより処理する関係を構築す る(下図)。
consumer0 ]---< consumer1 ]---< O----[ provider0 consumer2 ]---<
これに対し、コンシューマが要求するプロバイダインターフェース記述子 にインクリメンタル生成型インスタンス名記述子 "<type_name>+" が指定 された場合、記述子 "<type_name>+" の数だけプロバイダのインスタン スが動的に生成される。すなわち、"<type_name>+" の記述子によりプロバ イダを要求する n 個のコンシューマが存在する場合、n 個のプロバイダ がそれぞれの要求を処理する以下のような関係が構築される。
consumer0 ]---< O----[ provider0 consumer1 ]---< O----[ provider1 consumer2 ]---< O----[ provider2
接続に際して、ツール等から ConnectorProfile::properties に適切なイ ンターフェースマッピング指定を記述することで、相互のプロバイダ/コ ンシューマインターフェースを自由に接続することができる。ただし、接 続に関わる RTC の中に、異なるインスタンスでありながら、同一のインス タンス名が存在する場合、インターフェース記述子の一意性が保証できな いので、この方法による接続性は保証されない。
ここでインターフェース記述子を簡単のために <if_desc0>, <if_desc1>, ... とする。また、ConnectorProfile::properties の NVListの key と value を key: value のように記述するものとする。
いま、2つのコンポーネントのサービスポートを接続する場合を考える。 それぞれのコンポーネントのサービスポートが以下の場合、
MyComp0 YourComp0 _______ mycomp_service yourcomp_service ______ | | |~~~|---O echo0 echo9 >---|~~~| | |---< add0 add9 O---| | ~T~ ~T~ | |
MyComp0 の echo0 (プロバイダ) と YourComp0 の echo9 (コンシューマ)、 MyComp0 の add0 (コンシューマ) と YourComp0 の echo9 (プロバイダ) をそれぞれ対にして接続させるものと仮定する。この場合、 ConnectorProfile は以下のように設定する。
ConnectorProfile: name: 任意のコネクタ名 connector_id: 空文字 ports[]: mycomp_service の参照, yourcomp_service の参照 properties: <add0>: <add9> <echo9>: <echo0>
ただし、それぞれ
<add0> は MyComp0.port.mycomp_service.required.add.add0 <add9> は YourComp0.port.yourcomp_service.provided.add.add9 <echo0> は MyComp0.port.mycomp_service.provided.echo.echo0 <echo9> は YourComp0.port.yourcomp_service.required.echo.echo9
である。接続プロセスにおいて、各ポートのプロバイダおよびコンシュー マは、それぞれ以下の作業を、CorbaPort::publishInterfaces(), CorbaPort::PortsubscribeInterfaces() 仮想関数において行う。
プロバイダは、publishInterfaces() 関数において、自分のインターフェー ス記述子をキーとし、値にIORの文字列表記したものを ConnectorProfile::properties に設定する。前提として、このインター フェース記述子は今行おうとしているコネクタにおいては一意であるため、 同じキーは1つしか存在してはいけない。
[この部分の記述は未実装の機能] なお、動的生成インターフェースにつ いては、以下の手続きに従い処理することとなる。publishInterface() 関数において、動的生成インスタンス名記述子 "<type_name>*" または、 インクリメンタル生成型インスタンス名記述子 "<type_name>+" が存在す るかどうかを走査する。動的生成インスタンス名記述子 "<type_name>*" が存在する場合、プロバイダのインスタンスを1つ生成し、そのインター フェース指定子を key に、IOR文字列を value に設定するとともに、動 的生成インスタンス名記述子 "<type_name>*" を value に含むすべての value 上のインターフェース指定子を、ここで生成したインターフェース 指定子に置き換える。
インクリメンタル生成型インスタンス名記述子"<type_name>+" が存在す る場合、インスタンス名記述子の数だけプロバイダのインスタンスを生成 し、それぞれのインターフェース指定子をkey に、IOR文字列を value に 設定するとともに、インクリメンタル生成型インスタンス名記述子 "<type_name>+" を value 含むすべての value 上のインターフェース指 定子に対して順に、ここで生成したそれぞれのインターフェース指定子に 置き換える。
プロバイダは subscribeInterfaces() では特に操作は行わない。
コンシューマは、 publishInterfaces() においては特に操作を行わない。
一方、 subscribeInterfaces() では、自分の記述子を key とする key-value ペア が存在するかどうか調べ、もし存在すれば、その value に設定されたプロバイダのインターフェース指定子で指定される参照を、 さらに ConnectorProfile::properties から探し、それをコンシューマの 接続先として設定する。なお、意図的にコンシューマにプロバイダの参照 を設定しない場合は、予約文字列 "nil" または "null" を設定するもの とする。
コンシューマは、もし自分の記述子が存在しない場合、またはプロバイダ の参照が Connector::properties に存在しない場合、コンシューマは、 自分のインスタンス名および型名と同一のプロバイダを探し、その参照を 自分自身に設定する。これは、OpenRTM-aist-0.4 との互換性を保持する ためのルールであり、1.0以降では推奨されない。
プロバイダ対コンシューマの対応は一対一である必要はなく、プロバイダ 1 に対して、コンシューマ n、またはコンシューマ 1 に対してプロバイ ダ n のケースも許される。プロバイダ 1 に対して、コンシューマ n の ケースでは、あるプロバイダの指定子が、複数のコンシューマに対して、 上記の方法で指定されることにより、実現される。一方、コンシューマ 1 に対してプロバイダ n のケースでは、コンシューマ指定子の key に対 して、複数のプロバイダの指定子がカンマ区切りで列挙される形式となる ものとする。
なお、インターフェースの対応関係の厳密さを指定するオプションとして、 以下のオプションを指定することができる。
port.connection.strictness: strict, best_effort
strict: すべてのコンシューマに指定した参照が存在し、かつナローイン グにも成功しコンシューマに適切にセットできた場合にのみ Port 間の接続を確立する。
best_effort: ナローイング等に失敗した場合でも、エラーを返すことな く Port 間の接続を確立する。
|
explicit |
コンストラクタ
コンストラクタでは、引数に与えられた名前を PortBase に対してセッ トするとともに、PortProfile::properties に対して
をプロパティとして追加する。
name | Port の名前 |
|
override |
仮想デストラクタ
|
overrideprotectedvirtual |
|
overrideprotectedvirtual |
void RTC::CorbaPort::init | ( | coil::Properties & | prop | ) |
プロパティの初期化
OutPortのプロパティを初期化する。このポートへの接続数を指定する プロパティ "connection_limit" が含まれ、適切な数値が設定されてい る場合、最大接続数としてその数値が設定される。プロパティが設定さ れていない場合、もしくは適切な値が設定されていない場合には、最大 接続数は無制限となる。
prop | CorbaPort のプロパティ |
|
overrideprotectedvirtual |
Provider Interface 情報を公開する
この Port が所有する Provider インターフェースに関する情報を ConnectorProfile::properties に代入し他の Port に対して公開する。 今、RTCのインスタンス名等の情報が以下の通りであるとして、
NameValue 型の ConnectorProfile::properties の name と value として 以下のものが格納される。
なお、旧バージョンとの互換性のため以下の表記の NameValue も同時 に格納されるが、将来のバージョンでは削除される可能性がある。
これらの値は ConnectorProfile::properties に格納され、他のポートに対して 伝達される。他の Port でこのインターフェースを使用する Consumer が 存在すれば、ConnectorProfile からこのキーからオブジェクトリファレンスを 取得し何らかの形で使用される。
connector_profile | コネクタプロファイル |
RTC::PortBaseを実装しています。
bool RTC::CorbaPort::registerConsumer | ( | const char * | instance_name, |
const char * | type_name, | ||
CorbaConsumerBase & | consumer ) |
Consumer を登録する
この Port が要求するサービスのプレースホルダであるコンシューマ (Consumer) を登録する。Consumer が関連付けられるサービスのインス タンス名およびタイプ名として、引数に instance_name, type_name お よび Consumer 自身を与えることにより、内部でこれらが関連付けられ る。Port 間の接続 (connect) 時 には、subscribeInterfaces() で述 べられているルールに基づき、Provider Interface の参照が自動的に Consumer にセットされる。
instance_name | Consumer が要求するサービスのインスタンス名 |
type_name | Consumer が要求するサービスのタイプ名 |
consumer | CORBA サービスコンシューマ |
bool RTC::CorbaPort::registerProvider | ( | const char * | instance_name, |
const char * | type_name, | ||
PortableServer::RefCountServantBase & | provider ) |
Provider を登録する
この Port において提供したいサーバントをこの Port に対して登録す る。サーバントは、引数で与えられる instance_name, type_name を、 サーバント自身のインスタンス名およびタイプ名として、サーバントに 関連付けられる。この関数により、サーバントは CorbaPort 内部に保 持されるとともに、PortInterfaceProfile にRTC::PROVIDED インター フェースとして登録される。
instance_name | サーバントのインスタンス名 |
type_name | サーバントのタイプ名 |
provider | CORBA サーバント |
|
overrideprotectedvirtual |
Provider Interface 情報を取得する
この Portが所有する Consumer Interface に適合する Provider Interface に関する情報をConnectorProfile::properties から抽出し Consumer Interface にオブジェクト参照をセットする。
今、RTC のインスタンス名や Consumer Interface 等の情報が以下のと おりであると仮定すると、
この Consumer Interface を表すインターフェース指定子は以下のよう に表される。
<rtc_iname>.port.<port_name>.required.<if_tname>.<if_iname>
この関数は、まず引数 ConnectorProfile::properties に上記インター フェース指定子をキーとして格納されている Provider Interface 指定 子を探し出す。さらに、その Provider Interface 指定子をキーとして 格納されている Provider Interface の参照を表す IOR 文字列を取得 し、Consumer Interface にセットする。
今、仮に、Provider を prov(n), その参照をIOR(n) さらに Consumer をcons(n) のように記述し、これらすべてのインターフェースの型が同 一であり、ConnectorProfile に以下の値が設定されているとする。
ConnectorProfile::properties = { prov0: IOR0, prov1: IOR1, prov2: IOR2, cons0: prov2, cons1: prov1, cons2: prov0 }
このとき、cons(0..2) にはそれぞれ、参照が以下のようにセットされる。
cons0 = IOR2 cons1 = IOR1 cons2 = IOR0
なお、旧バージョンとの互換性のため、 ConnectorProfile::properties に Consumer Interface をキーとした 値がセットされていない場合でも、次のルールが適用される。
今、仮に Consumer Interface が
PortInterfaceProfile { instance_name = "PA10_0"; type_name = "Manipulator"; polarity = REQUIRED; }
として登録されていれば、他の Port の
PortInterfaceProfile { instance_name = "PA10_0"; type_name = "Manipulator"; polarity = PROVIDED; }
として登録されている Serivce Provider のオブジェクト参照を探し、 Consumer にセットする。実際には、ConnectorProfile::properties に
NameValue = { "port.Manipulator.PA10_0": <Object reference> }
として登録されている NameValue を探し、そのオブジェクト参照を Consumer にセットする。
connector_profile | コネクタプロファイル |
RTC::PortBaseを実装しています。
|
overrideprotectedvirtual |
Interface への接続を解除する
与えられた ConnectorProfile に関連する Consumer にセットされた すべての Object を解放し接続を解除する。
connector_profile | コネクタプロファイル |
RTC::PortBaseを実装しています。
|
protected |
プロパティ