ここではコンポーネントをアクティブ化するためのプログラムについて紹介します.
まずは小手調べで,PeriodicConsoleOutコンポーネントのアクティブ化を行ってみましょう.
RTCActivateとします.
localhost:2809のネームサーバーが立ち上がっており,siva.local.host_cxt/ConsoleOutput0.rtcというRTCが見えているとします.
コード生成
簡単なのはRTC Builderでコードを作ることです.
プロジェクト名をRTCActivateとして,Module NameのみRTCActivateとしてコード生成します.
言語はどれでもオーケーです.
生成されるコードの中から,
includeフォルダ前部
src/RTCActivate.cpp
を削除します.
さらに,
src/CMakeLists.txtを変更します.
1行目削除
39-45行目のあたりを削除
46行目からを修正.
「修正前」
add_executable(${PROJECT_NAME}Comp ${standalone_srcs}
${comp_srcs} ${comp_headers} ${ALL_IDL_SRCS})
「修正後」
add_executable(${PROJECT_NAME}Comp ${standalone_srcs})
50行目以降を削除
さらに,トップディレクトリのCMakeLists.txtを編集.
74行目のadd_sub_directory(include)を削除
こんな感じです.
RTCActivateComp.cppをこのように変更します.
#include<rtm/Manager.h> #include<rtm/CorbaNaming.h> #include<rtm/CorbaConsumer.h> using namespace RTC; int main (int argc, char** argv) { //CORBA ORBオブジェクトを生成 CORBA::ORB_var corbaORB = CORBA::ORB_init(argc, (char**)argv); //ネームサービスオブジェクト生成 CorbaNaming corbaNaming(corbaORB, "localhost:2809"); //ネームサーバーからPeriodicConsoleOutコンポーネントのインスタンスを検索 CorbaConsumer<RTC::RTObject> periodicConsoleOut0; CORBA::Object_ptr object = corbaNaming.resolve("siva.local.host_cxt/ConsoleOutput0.rtc"); periodicConsoleOut0.setObject(object); //PeriodicConsoleOutコンポーネントのインスタンスをアクティブ化 ExecutionContextList_var ExecutionContextList = periodicConsoleOut0->get_owned_contexts(); ExecutionContextList[0]->activate_component(RTObject::_duplicate(periodicConsoleOut0._ptr())); //CORBA ORBオブジェクトの破壊 corbaORB->destroy(); return 0; } |
src/RTCActivate.java
src/RTCActivateImpl.java
を削除します.
// -*- Java -*- /*! * @file RTCActivateComp.java * @brief Standalone component * @date $Date$ * * $Id$ */ import jp.go.aist.rtm.RTC.CorbaNaming; import jp.go.aist.rtm.RTC.port.CorbaConsumer; import jp.go.aist.rtm.RTC.util.ORBUtil; import RTC.RTObject; /*! * @class RTCActivateComp * @brief Standalone component Class * */ public class RTCActivateComp { public static void main(String[] args) { try { //CORBA ORBオブジェクトを生成 org.omg.CORBA.ORB corbaORB = ORBUtil.getOrb(args); CorbaNaming corbaNaming = new CorbaNaming(corbaORB, "localhost:2809"); org.omg.CORBA.Object object = corbaNaming.resolve("siva.local.host_cxt/ConsoleOutput0.rtc"); CorbaConsumer<RTObject> periodicConsoleOut0 = new CorbaConsumer<RTObject>(RTObject.class); periodicConsoleOut0.setObject(object); RTC.ExecutionContext[] executionContextList = periodicConsoleOut0._ptr().get_owned_contexts(); executionContextList[0].activate_component(periodicConsoleOut0._ptr()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Pythonの場合は,生成されたプロジェクトをそのまま使えます.
RTCActivate.pyを以下のように書き換えます.
#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Python -*- """ @file RTCActivate.py @brief ModuleDescription @date $Date$ """ import sys import time sys.path.append(".") # Import RTM module import RTC import OpenRTM_aist import omniORB def main(): orb = omniORB.CORBA.ORB_init() corbaNaming = OpenRTM_aist.CorbaNaming(orb, "localhost:2809") obj = corbaNaming.resolve("siva.local.host_cxt/ConsoleOutput0.rtc") periodicConsoleOut0 = OpenRTM_aist.CorbaConsumer() periodicConsoleOut0.setObject(obj) executionContextList = periodicConsoleOut0._ptr().get_owned_contexts(); executionContextList[0].activate_component(periodicConsoleOut0._ptr()); if __name__ == "__main__": main() |
ポイントは数か所ありますが,ネームサーバーのIPアドレスもしくはURLは当たり前ですね.
山場はCorbaConsumerオブジェクトのresolveメソッドです.このCorbaConsumerオブジェクト生成時に指定したIPアドレス,もしくはURLのネームサーバ上の名前を検索して,目的のRTCを見つけます.RTCの名前の付け方は結構複雑です.
デフォルトでは,
○○.host_cxt/××0.rtc
となっており,○○にはRTCを実行しているホストPCの名前,××にはRTCの名前が入ります.僕の場合,実行しているノートPCの名前がagniなので,上図のような指定になっています.
名前の付け方・・・の変え方.rtc.conf
RTCの名前の付け方は,デフォルトではそのRTCが読み込むrtc.confで決まります.またバージョン1.0ではManagerがCORBAオブジェクトになったので,名前の付け方の自由度が格段に上がりましたが,これについては後述で.
とにかくrtc.confに次のように書くと名前つけルールが変わります.
naming.formats: %h.host_cxt/%n.rtc
%hはPCのホスト名,%nはRTC名です.
PC一台でやっている時は,
%n.rtc
くらいシンプルでもOKです.こうなると,○○0.rtcのような名前になります.複数のPCでRTCを実行している場合は,%hを付けてホストごとに名前がわかれるようにします.%pを入れるとプロセスIDが入ります.あまりお勧めしませんが.
コンパイル
通常のRTCと同じ感じでコンパイルできるはずです.
実行
ネームサーバーを起動してから,PeriodicConsoleOutコンポーネントを起動してください.RT
System Editorを使っているなら,ネームサーバーにPeriodicConsoleOut0.rtcというコンポーネントが登録されていることがわかるでしょう.
次に,RTCActivateを実行すると,自動的にアクティベートされてコンソールに文字列が出力されます.
まとめ
いかがでしたか?簡単?難しい??
コンポーネントだけではプログラムは成立しませんから,コンポーネントをアクティブ化するプログラムは必要不可欠です.
Pingback: RTCのコンフィグを変更するソフトウエア | ysuga.net