I’ll introduce how to make a program that activate/deactivate your rtc.
まずは小手調べで,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
#include
#include
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 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/RTCActivateImpl.java
を削除します.
#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; } |
RTCActivate.pyを以下のように書き換えます.
// -*- 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(); } } } |
ポイントは数か所ありますが,ネームサーバーの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