Project

General

Profile

機能 #3402

③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)

Added by n-ando almost 6 years ago. Updated about 4 years ago.

Status:
終了
Priority:
通常
Assignee:
Start date:
12/22/2015
Due date:
03/25/2016
% Done:

100%

Estimated time:
30.00 h

Description

コンポーネントコンフィギュレーションファイル(rtc.conf)に設定することで、起動時に同一プロセス内コンポーネントのポート同士を接続する機能を実装すること。

test_Manager_new.py (7.37 KB) test_Manager_new.py miyamoto, 01/14/2016 07:59 PM
test_Manager_new.py (7.38 KB) test_Manager_new.py miyamoto, 02/26/2016 06:41 PM

Associated revisions

Revision 634 (diff)
Added by miyamoto over 5 years ago

[incompat,new_func,->RELENG_1_2] add initPreConnection() to Manager. refs #3402

Revision 646 (diff)
Added by miyamoto over 5 years ago

[incompat,new_func,->RELENG_1_2] add initPreConnection() to Manager. refs #3402

History

#1 Updated by miyamoto almost 6 years ago

  • Due date set to 03/25/2016
  • Assignee set to miyamoto
  • Target version set to RELEASE_1_2_0
  • % Done changed from 0 to 90
  • Estimated time set to 30.00 h

#2 Updated by miyamoto almost 6 years ago

実装

Manager.pyクラスにinitPreConnection関数を実装した。

rtc.confに以下のような形式で記述する事で自動的にポートが接続される。

manager.components.preconnect: RTC0.port0:RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull),RTC2.port2:RTC3.port3()

そのためinitPreConnection関数では以下の作業を行う事で接続するポート名、接続の設定を取得する。

","で区切ることで接続のリストを取得
connectors = str(self._config.getProperty("manager.components.preconnect")).split(",")

["RTC0.port0:RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull)", "RTC2.port2:RTC3.port3()"]

connectorsの各要素を"("で区切ることで、ポート名と接続の設定に分割
conn_prop = c.split("(")

["RTC0.port0:RTC0.port1","interface_type=corba_cdr&dataport.dataflow_type=pull)"]

conn_prop [1]から")"を削除
conn_prop[1] = conn_prop[1].replace(")","")

"interface_type=corba_cdr&dataport.dataflow_type=pull"

conn_prop [0]を":"で分割
comp_ports = conn_prop [0].split(":")

["RTC0.port0","RTC0.port1"]

comp_portsの各要素を"."で分割
comp0_name = comp_ports [0].split(".")[0]

["RTC0","port0"]

comp0_nameからコンポーネント、ポートオブジェクトを取得
comp0 = self.getComponent(comp0_name)
port0_var = OpenRTM_aist.CORBA_RTCUtil.get_port_by_name(comp0.getObjRef(), comp_ports [0])

conn_prop [1]を"&"で分割
opt_props = conn_prop [1].split("&")

["interface_type=corba_cdr","dataport.dataflow_type=pull"]

opt_propsの各要素を"="で分割
temp = o.split("=")

["interface_type","corba_cdr"]

プロパティに追加
prop.setProperty("dataport."+temp [0],temp [1])

ポートを接続
OpenRTM_aist.CORBA_RTCUtil.connect(c, prop, port0_var, port1_var)

そしてinitPreConnection関数をactivateManager関数内で呼び出すことでrtc.confに記述した接続が自動的に行われる。
ただし、manager.components.precreateに指定したRTCを生成後に呼び出す必要がある。

テスト

添付したテスト用コードを使用してテストを行った。
テスト用コードは以下の動作を行う。

setUp関数

マネージャ初期化の引数追加
self.dataPortConnectorName = "TestComp20.in:TestComp10.out(interface_type=direct)"
self.servicePortConnectorName = "TestComp10.service:TestComp20.service()"
sys.argv.extend(['-o', 'manager.components.preconnect:'+self.dataPortConnectorName+","+self.servicePortConnectorName])

マネージャ初期化
self.manager = OpenRTM_aist.Manager.init(sys.argv)
self.manager.setModuleInitProc(MyModuleInit)
self.manager.activateManager()

→MyModuleInitではTestComp10、TestComp20を起動する。どちらもインポートin、アウトポートout、サービスポートserviceを保持している

test_PreConnection関数

データポートが接続済みかを確認
ans = OpenRTM_aist.already_connected(inport, outport)
self.assertTrue(ans)

括弧内の設定が反映されたか確認
self.assertEqual(prop.getProperty("dataport.interface_type"),"direct")

サービスポートが接続済みかを確認
ans = OpenRTM_aist.already_connected(provided, required)
self.assertTrue(ans)

#3 Updated by miyamoto over 5 years ago

#3404の実装のために、ポート名の間の記号を":"から"^"に変更した。

manager.components.preconnect: RTC0.port0^RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull),RTC2.port2^RTC3.port3()

#4 Updated by miyamoto over 5 years ago

  • % Done changed from 90 to 100

#5 Updated by n-ando about 4 years ago

  • Status changed from 新規 to 終了

Also available in: Atom PDF