マネージャはRTCを管理する仕組みです。 1つのプロセスに1つのマネージャが起動します。
マネージャにはマスターマネージャとスレーブマネージャの2種類あります。 マスターマネージャはスレーブマネージャを管理する上位のマネージャであり、スレーブマネージャはRTCの生成、実行するためのマネージャです。
RTSystemEditor等の外部のツールからマスターマネージャのAPIを呼び出すことでRTCの生成、削除などが実行できます。 RTCはマスターマネージャ上では直接起動せずに、マスターマネージャがスレーブマネージャのAPIを呼び出してRTCを起動するように指令します。
以下はPythonでマスターマネージャにRTCの生成を指令するプログラムの例です。
import sys from omniORB import CORBA import RTM orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID) obj = orb.string_to_object("corbaloc:iiop:localhost:2810/manager") mgr = obj._narrow(RTM.Manager) rtc = mgr.create_component("ConsoleIn&manager_name=samplemaneger")
マスターマネージャを起動する場合はrtcdを-dオプションを付けて実行します。
rtcd -d -f rtc.conf
rtc.confでモジュール探索パスを設定しておく必要があります。
manager.modules.load_path: C:/Program Files/OpenRTM-aist/1.2.2/Components/C++/OpenCV/vc14
スレーブマネージャを起動する場合は特にオプションは必要ありませんが、rtc.confでマネージャ名、モジュール探索パスを設定してください。 またデフォルトの設定ではRTCが1つも実行してない場合にマネージャを自動終了する機能があるためそれをオフにしてください。
manager.instance_name: samplemaneger manager.modules.load_path: C:/Program Files/OpenRTM-aist/1.2.2/Components/C++/OpenCV/vc14 manager.shutdown_auto:NO
create_componentはRTCを生成するためのAPIです。 以下のように引数に起動するRTCのベンダ名、カテゴリ名、コンポーネント名、言語名、バージョン番号を入力することでRTCを生成します。
mgr.create_component("RTC:AIST:Example:ConsoleIn:C++:1.0.0")
引数の文字列は以下のような内容で入力します。
RTC:[vendor]:[category]:[implementation_id]:[version]
ただし、implementation_id以外は省略できるため、以下のようにRTC名だけを入力しても生成できます。
mgr.create_component("ConsoleIn")
RTCはスレーブマネージャ上で起動しますが、RTCを起動するスレーブマネージャを指定する場合は以下のようにmanager_nameのオプションで指定します。
mgr.create_component("ConsoleIn&manager_name=samplemaneger")
起動するスレーブマネージャをアドレスとポート番号を指定してRTCを起動する場合はmanager_addressのオプションで指定します。
mgr.create_component("Flip&manager_address=localhost:2811")
manager_nameオプションでスレーブマネージャ名を指定した場合に指定のスレーブマネージャが起動していない場合、マスターマネージャは指定の名前のスレーブマネージャを起動します。 例えば、以下のsamplemanegerという名前のスレーブマネージャが起動していない場合、新たにsamplemanegerという名前のスレーブマネージャを起動します。
mgr.create_component("ConsoleIn&manager_name=samplemaneger")
以下のようにmanager_nameオプションを指定しない場合、manager_[プロセスID]の名前のスレーブマネージャを新たに起動します。
mgr.create_component("ConsoleIn")
例えばOpenRTM-aistのサンプルコンポーネントにはC++、Python、Javaで実装したConsoleInコンポーネントの3種類が使用できます。 同一コンポーネント名のRTCを区別して起動する場合、以下のように言語名で区別することができます。
mgr.create_component("RTC:AIST:Example:ConsoleIn:Python:1.0.0")
言語名でも区別できない場合は、予めRTCを起動するスレーブマネージャを起動しておいて、create_componentでマネージャ名を指定することで対応できます。
スレーブマネージャのAPIを直接呼び出す場合はget_slave_managersでマスターマネージャからスレーブマネージャを取得して実行します。 以下は指定の名前のスレーブマネージャでモジュールをロードしてRTCを起動する例です。
import sys from omniORB import CORBA import RTM import OpenRTM_aist orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID) obj = orb.string_to_object("corbaloc:iiop:localhost:2810/manager") mgr = obj._narrow(RTM.Manager) print(mgr.create_component("Flip&manager_name=samplemaneger")) def getSlaveManager(master, slavename): slavemgrs = master.get_slave_managers() for slavemgr in slavemgrs: prof = slavemgr.get_configuration() prop = OpenRTM_aist.Properties() OpenRTM_aist.NVUtil.copyToProperties(prop, prof) name = prop.getProperty("manager.instance_name") if name == slavename: return slavemgr return None samplemaneger = getSlaveManager(mgr, "samplemaneger") samplemaneger.load_module( "C:\\Program Files\\OpenRTM-aist\\1.2.2\\Components\\C++\\Examples\\vc14\\ConsoleIn.dll", "ConsoleInInit") samplemaneger.create_component("ConsoleIn")