RTCをActivate,Deactivateするプログラムの作り方


ここではコンポーネントをアクティブ化するためのプログラムについて紹介します.

まずは小手調べで,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を実行すると,自動的にアクティベートされてコンソールに文字列が出力されます.

まとめ

いかがでしたか?簡単?難しい??

コンポーネントだけではプログラムは成立しませんから,コンポーネントをアクティブ化するプログラムは必要不可欠です.

RTCActivate_cpp

RTCActivate_java

RTCActivate_py