機能 #3402
完了③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)
100%
説明
コンポーネントコンフィギュレーションファイル(rtc.conf)に設定することで、起動時に同一プロセス内コンポーネントのポート同士を接続する機能を実装すること。
ファイル
miyamoto さんがほぼ9年前に更新
- ファイル test_Manager_new.py test_Manager_new.py を追加
実装¶
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)
miyamoto さんがほぼ9年前に更新
- ファイル test_Manager_new.py test_Manager_new.py を追加
#3404の実装のために、ポート名の間の記号を":"から"^"に変更した。
manager.components.preconnect: RTC0.port0^RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull),RTC2.port2^RTC3.port3()