https://www.openrtm.org/redmine/
https://www.openrtm.org/redmine/redmine/favicon.ico
2016-01-14T07:16:04Z
Redmine for OpenRTM-aist
OpenRTM-aist (Python) - 機能 #3402: ③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)
https://www.openrtm.org/redmine/issues/3402?journal_id=8262
2016-01-14T07:16:04Z
miyamoto
nobu@nobu777.net
<ul><li><strong>期日</strong> を <i>2016/03/25</i> にセット</li><li><strong>担当者</strong> を <i>miyamoto</i> にセット</li><li><strong>対象バージョン</strong> を <i>RELEASE_1_2_0</i> にセット</li><li><strong>進捗率</strong> を <i>0</i> から <i>90</i> に変更</li><li><strong>予定工数</strong> を <i>30.00時間</i> にセット</li></ul>
OpenRTM-aist (Python) - 機能 #3402: ③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)
https://www.openrtm.org/redmine/issues/3402?journal_id=8279
2016-01-14T10:59:04Z
miyamoto
nobu@nobu777.net
<ul><li><strong>ファイル</strong> <a href="/redmine/attachments/1691/test_Manager_new.py">test_Manager_new.py</a> <a class="icon-only icon-download" title="ダウンロード" href="/redmine/attachments/download/1691/test_Manager_new.py">test_Manager_new.py</a> を追加</li></ul><a name="実装"></a>
<h2 >実装<a href="#実装" class="wiki-anchor">¶</a></h2>
<p>Manager.pyクラスにinitPreConnection関数を実装した。</p>
<p>rtc.confに以下のような形式で記述する事で自動的にポートが接続される。</p>
<p><code>manager.components.preconnect: RTC0.port0:RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull),RTC2.port2:RTC3.port3()</code></p>
<p>そのためinitPreConnection関数では以下の作業を行う事で接続するポート名、接続の設定を取得する。</p>
<p><strong>","で区切ることで接続のリストを取得</strong><br /><code>connectors = str(self._config.getProperty("manager.components.preconnect")).split(",")</code><br />→<br /><code>["RTC0.port0:RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull)", "RTC2.port2:RTC3.port3()"]</code></p>
<p><strong>connectorsの各要素を"("で区切ることで、ポート名と接続の設定に分割</strong><br /><code>conn_prop = c.split("(")</code><br />→<br /><code>["RTC0.port0:RTC0.port1","interface_type=corba_cdr&dataport.dataflow_type=pull)"]</code></p>
<p><strong>conn_prop [1]から")"を削除</strong><br /><code>conn_prop[1] = conn_prop[1].replace(")","")</code><br />→<br /><code>"interface_type=corba_cdr&dataport.dataflow_type=pull"</code></p>
<p><strong>conn_prop [0]を":"で分割</strong><br /><code>comp_ports = conn_prop [0].split(":")</code><br />→<br /><code>["RTC0.port0","RTC0.port1"]</code></p>
<p><strong>comp_portsの各要素を"."で分割</strong><br /><code>comp0_name = comp_ports [0].split(".")[0]</code><br />→<br /><code>["RTC0","port0"]</code></p>
<p><strong>comp0_nameからコンポーネント、ポートオブジェクトを取得</strong><br /><code>comp0 = self.getComponent(comp0_name)<br />port0_var = OpenRTM_aist.CORBA_RTCUtil.get_port_by_name(comp0.getObjRef(), comp_ports [0])<br /></code></p>
<p><strong>conn_prop [1]を"&"で分割</strong><br /><code>opt_props = conn_prop [1].split("&")</code><br />→<br /><code>["interface_type=corba_cdr","dataport.dataflow_type=pull"]</code></p>
<p><strong>opt_propsの各要素を"="で分割</strong><br /><code>temp = o.split("=")</code><br />→<br /><code>["interface_type","corba_cdr"]</code></p>
<p><strong>プロパティに追加</strong><br /><code>prop.setProperty("dataport."+temp [0],temp [1])</code></p>
<p><strong>ポートを接続</strong><br /><code>OpenRTM_aist.CORBA_RTCUtil.connect(c, prop, port0_var, port1_var)</code></p>
<p>そしてinitPreConnection関数をactivateManager関数内で呼び出すことでrtc.confに記述した接続が自動的に行われる。<br />ただし、manager.components.precreateに指定したRTCを生成後に呼び出す必要がある。</p>
<a name="テスト"></a>
<h2 >テスト<a href="#テスト" class="wiki-anchor">¶</a></h2>
<p>添付したテスト用コードを使用してテストを行った。<br />テスト用コードは以下の動作を行う。</p>
<p><strong>setUp関数</strong></p>
<p><strong>マネージャ初期化の引数追加</strong><br /><code>self.dataPortConnectorName = "TestComp20.in:TestComp10.out(interface_type=direct)" <br />self.servicePortConnectorName = "TestComp10.service:TestComp20.service()" <br />sys.argv.extend(['-o', 'manager.components.preconnect:'+self.dataPortConnectorName+","+self.servicePortConnectorName])</code></p>
<p><strong>マネージャ初期化</strong><br /><code>self.manager = OpenRTM_aist.Manager.init(sys.argv)<br />self.manager.setModuleInitProc(MyModuleInit)<br />self.manager.activateManager()</code></p>
<p>→MyModuleInitではTestComp10、TestComp20を起動する。どちらもインポートin、アウトポートout、サービスポートserviceを保持している</p>
<p><strong>test_PreConnection関数</strong></p>
<p><strong>データポートが接続済みかを確認</strong><br /><code>ans = OpenRTM_aist.already_connected(inport, outport)<br />self.assertTrue(ans)</code></p>
<p><strong>括弧内の設定が反映されたか確認</strong><br /><code>self.assertEqual(prop.getProperty("dataport.interface_type"),"direct")</code></p>
<p><strong>サービスポートが接続済みかを確認</strong><br /><code>ans = OpenRTM_aist.already_connected(provided, required)<br />self.assertTrue(ans)</code></p>
OpenRTM-aist (Python) - 機能 #3402: ③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)
https://www.openrtm.org/redmine/issues/3402?journal_id=8401
2016-02-26T09:41:49Z
miyamoto
nobu@nobu777.net
<ul><li><strong>ファイル</strong> <a href="/redmine/attachments/1741/test_Manager_new.py">test_Manager_new.py</a> <a class="icon-only icon-download" title="ダウンロード" href="/redmine/attachments/download/1741/test_Manager_new.py">test_Manager_new.py</a> を追加</li></ul><p><a class="wiki-page new" href="https://www.openrtm.org/redmine/projects/openrtm-aist-python/wiki/%233404">#3404</a>の実装のために、ポート名の間の記号を":"から"^"に変更した。</p>
<pre>
manager.components.preconnect: RTC0.port0^RTC0.port1(interface_type=corba_cdr&dataport.dataflow_type=pull),RTC2.port2^RTC3.port3()
</pre>
OpenRTM-aist (Python) - 機能 #3402: ③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)
https://www.openrtm.org/redmine/issues/3402?journal_id=8429
2016-03-17T01:58:32Z
miyamoto
nobu@nobu777.net
<ul><li><strong>進捗率</strong> を <i>90</i> から <i>100</i> に変更</li></ul>
OpenRTM-aist (Python) - 機能 #3402: ③ コンポーネント起動時に事前設定に従いポート同士を接続する機能(同一プロセス)
https://www.openrtm.org/redmine/issues/3402?journal_id=10430
2017-08-30T05:19:56Z
n-ando
Noriaki.Ando@gmail.com
<ul><li><strong>ステータス</strong> を <i>新規</i> から <i>終了</i> に変更</li></ul>