プロジェクト

全般

プロフィール

機能 #3412

⑬ 名前付けポリシー機能の拡張

n-ando8年以上前に追加. 5年以上前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2015/12/22
期日:
2016/03/25
進捗率:

100%

予定工数:
30.00時間

説明

「名前ベースのコンポーネント」機能を実現するために、異なるプロセスで起動した同一コンポーネントでも、マスターの配下にある他のコンポーネントの名前を見て、インスタンス番号を付ける機能を実装する。また、コンポーネント自身も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

関係しているリビジョン

リビジョン 658 (差分)
miyamoto約8年前に追加

[incompat,new_func,new_file,->RELENG_1_2] add NumberingPolicyBase.py, NodeNumberingPolicy.py, and NamingServiceNumberingPolicy.py. refs #3412

リビジョン 693 (差分)
miyamoto約8年前に追加

[compat,->RELENG_1_2] refs #3412

履歴

#1 miyamoto8年以上前に更新

  • 期日2016/03/25 にセット
  • 担当者miyamoto にセット
  • 対象バージョンRELEASE_1_2_0 にセット
  • 予定工数30.00時間 にセット

#2 n-ando約8年前に更新

  • 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 に渡す。

#3 miyamoto約8年前に更新

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)

#4 miyamoto約8年前に更新

  • 進捗率30 から 100 に変更

#5 n-ando約7年前に更新

  • 進捗率100 から 90 に変更

これちゃんと動いてる?>NodeUniquePolicy

#6 n-miyamoto6年以上前に更新

  • ステータス新規 から 解決 に変更
  • 進捗率90 から 100 に変更

#7 n-miyamoto5年以上前に更新

  • ステータス解決 から 終了 に変更

他の形式にエクスポート: Atom PDF