機能 #3412
完了⑬ 名前付けポリシー機能の拡張
100%
説明
「名前ベースのコンポーネント」機能を実現するために、異なるプロセスで起動した同一コンポーネントでも、マスターの配下にある他のコンポーネントの名前を見て、インスタンス番号を付ける機能を実装する。また、コンポーネント自身もINS機能を利用して、カテゴリ名、インスタンスIDをObjectIdとして起動するように、新たなPOA上でのアクティブ化、名前付けなどを実装すること。
ファイル
test_NumberingPolicy_node.py (2.58 KB) test_NumberingPolicy_node.py | miyamoto, 2016/02/25 14:25 | ||
test_NumberingPolicy_ns.py (2.57 KB) test_NumberingPolicy_ns.py | miyamoto, 2016/02/25 14:25 |
n-ando さんがほぼ9年前に更新
- NamingPolicyBase基底クラスを用意する
- Policyのファクトリを用意する
typedef ::coil::GlobalFactory<NamingPolicyBase> NamingPolicyFactory;
- いくつかのNamingPolicyを作る
- プロセス間でインスタンス番号をシーケンシャルに振るポリシー
- ネームサービス上でユニークになるようにシーケンシャルに番号を振るポリシー
- rtc.conf に manager.components.naming_policy:
- ex: process_unique: プロセス内でユニークになるようにインスタンス名にシーケンシャルに番号をふる (現在のデフォルト)
- ex: node_unique: ノード内でユニークになるようにインスタンス名にシーケンシャルに番号をふる
- ex: ns_unique: ネーミングサービス上でユニークになるようにry
- Manager:registerFactory() 内で、コンポーネントのファクトリを登録する際に、rtc.confで指定されたポリシーをインスタンス化し、FactoryCXX に渡す。
miyamoto さんがほぼ9年前に更新
- ファイル test_NumberingPolicy_node.py test_NumberingPolicy_node.py を追加
- ファイル test_NumberingPolicy_ns.py test_NumberingPolicy_ns.py を追加
- 進捗率 を 0 から 30 に変更
NumberingPolicyBase.py、NodeNumberingPolicy.py、NamingServiceNumberingPolicy.pyを追加した。
NumberingPolicyBase.pyにはNumberingPolicyBaseクラス、NumberingPolicyFactoryクラスを定義している。
これに伴いNumberingPolicyクラスはNumberingPolicyBaseクラスを継承するように変更した。
ManagerクラスのregisterFactory関数でFactoryPythonクラスの初期化時にmanager.components.naming_policyで指定したポリシーを渡すように変更した。
manager.components.naming_policyはprocess_unique、node_unique、ns_uniqueから選択可能であり、デフォルトではprocess_uniqueを設定してある。
NodeNumberingPolicyクラスではmanager.components.naming_policyをnode_uniqueに指定したときのポリシーを定義してある。
マスターマネージャ、スレーブマネージャからRTCを検索して、名前がユニークになるように番号を振る。
起動したマネージャがスレーブマネージャの場合は登録されているマスターマネージャからスレーブマネージャのリストを取得してRTCの検索を行う。登録されているマスターマネージャが存在しない場合はプロセス内で起動したマネージャでのみ検索を行う。
RTCの存在確認には#3411で実装したManager.idlのget_components_by_nameを使用する。
以下のコードでテストを行った。
このテスト用コードでは2つのプロセスでRTCを起動し、それぞれマスターマネージャ、スレーブマネージャが起動するようにしている。
self.queue = multiprocessing.Queue()
self.outport_process = multiprocessing.Process(target=runTestComp2, args=(self.queue,))
self.outport_process.start()
time.sleep(1)
sys.argv.extend(['-o','manager.components.naming_policy:node_unique'])
self.manager = OpenRTM_aist.Manager.init(sys.argv)
self.manager.setModuleInitProc(TestComp1ModuleInit)
self.manager.activateManager()
comp = self.manager.getComponent("TestComp11")
self.assertTrue(comp is not None)
NamingServiceNumberingPolicyクラスではmanager.components.naming_policyをns_uniqueに指定したときのポリシーを定義してある。
ネーミングサービスから一致するインスタンス名のRTCを検索して、ユニークな名前を付けるように番号を振る。
以下のコードでテストを行った。
self.queue = multiprocessing.Queue()
self.outport_process = multiprocessing.Process(target=runTestComp2, args=(self.queue,))
self.outport_process.start()
time.sleep(1)
sys.argv.extend(['-o','manager.components.naming_policy:ns_unique'])
self.manager = OpenRTM_aist.Manager.init(sys.argv)
self.manager.setModuleInitProc(TestComp1ModuleInit)
self.manager.activateManager()
comp = self.manager.getComponent("TestComp11")
self.assertTrue(comp is not None)