rtctree 모듈

rtctree는 Python으로 RT컴포넌트를 관리하기 위한 라이브러리입니다.

개요

rtctree는 간단한 API로 RT컴포넌트의 관리를하기 위한 Python용 라이브러리입니다. 개발자는 CORBA의 API를 몰라도 다른 프로그램으로부터, RT컴포넌트의 시스템을 관리할 수 있습니다. 컴포넌트를 activate 하거나 deactivate 하거나 컴포넌트의 사이의 접속을 실시하는 것 등이 가능합니다.

이 소프트웨어는 NEDO (독립 행정법인 신 에너지·산업기술 종합 개발 기구)의 차세대 로봇 지능화 기술개발 프로젝트의 지원에 의해, 독립 행정법인 산업기술 종합 연구소에 의해서 개발되고 있습니다.

필요 조건

  • ominorb-py 및 omniidl와 omniidl용의 Python 모듈이 필요합니다.
  • Python 2.5 이하에서는 존재하지 않는 기능을 사용하므로 Python 2.6 이상이 필요합니다.
  • Ubuntu 9.04를 사용하고 있으면, 수동으로 Python 2.6을 인스톨 하는 것이 필요합니다. Ubuntu 9.04이상을 추천합니다.

인스톨

인스톨은 몇가지의 방법이 있습니다.

  • 리포지터리(참조:이하의리포지터리) 또는 소스 어카이브(archive)로부터 다운로드 후, 적당한 디렉토리에서 압축을 해제하고 인스톨 합니다:
    1. 소스를 전개한다.
       $ cd /home/blurgle/src/
       $ tar -xvzf rtctree-2.0.0.tar.gz
    2. setup.py를 실행한다.
       $ python setup.py install
    3. 필요에 따라서, 환경 변수를 설정합니다. 이것은 디폴트로 설정되어 있습니다만, 설정되어 있지 않은 경우는 스스로 설정할 필요가 있습니다. Windows상에서는 Python의 site-packages디렉토리가 PYTHONPATH환경 변수에, Python 스크립트의 디렉토리가 PATH환경 변수로 설정되어 있는 것을 확인해 주십시오. 통상, 이것들은 C:Python26Libsite-packages\C:Python26Scripts\입니다(Python가C:Python26\에 인스톨 되었을 경우).
  • Windows에서는 인스톨러의 사용을 추천 합니다. setup.py를 이용하면 결과보다 용이하게 설정할 수 있습니다. 다만, 환경에 따라서는 한층 더 환경 변수의 설정이 필요한 경우가 있습니다.

환경 변수

이하의 환경 변수가 사용됩니다.

RTCTREE_ORB_ARGS ORB 작성시에게 입력하는 세미콜론으로 구분지어진 인수의 리스트. 설정은 필요하지 않습니다.
RTCTREE_NAMESERVERS 세미콜론으로 구분하는 RTC 트리를 위한 네임서버의 주소의 리스트. 이 변수에 쓴 서버는 트리에 추가합니다. 설정은 필요하지 않습니다.

보통의 경우 RTCTREE_ORB_ARGS를 설정하는 것은 필요하지 않습니다. RTCTREE_NAMESERVERS를 설정하면, rtctree를 사용할 때에 더 편리합니다. 예를 들면, Bash 셸이라면:

 $ export RTCTREE_NAMESERVERS=localhost;192.168.0.1:65346;example.com

RTC 트리

라이브러리의 주요 부분은 RTC 트리입니다.

 import rtctree.tree
 tree = rtctree.tree.RTCTree()
이것은 네이밍 컨텍스트, 컴포넌트 및 매니저를 취득하기 위해서 네임 서버를 검색해 작성한 파일 시스템과 같은 트리입니다. 통상의 파일 시스템을 취급하는 경우와 완전히 똑같이 취급할 수 있습니다. 트리는 모든 기존의 네임 서버에 등록된 네이밍 컨텍스트, 매니저 및 컴포넌트를 트리 구조로 나타냅니다.

  |-+localhost
 | |-+naming_context
 | | |--ConsoleIn0.rtc
 | | |--ConsoleOut0.rtc
 | |
 | |--another_naming_context
 | |--Sensor0.rtc
 |
 |-+192.168.0.5
   |--Motor0.rtc
   |--Controller0.rtc

트리내의 각 디렉토리는, 통상의 네이밍 컨텍스트 또는 네임 서버의 루트 컨텍스트입니다. 네임 서버의 루트 컨텍스트는 NameServer클래스에서 나타냅니다. 또, 네이밍 컨텍스트는 Directory클래스에서 매니저는Manager클래스에서 나타냅니다.

네임 서버는 루트 디렉토리로부터의 디렉토리로서 다루어집니다. 그 아래는 파일과 서브 디렉토리입니다. 서브 디렉토리는 루트 컨텍스트아래의 네이밍 컨텍스트 및 매니저를 나타냅니다.

파일은 컴포넌트와 매니저입니다. 컴포넌트는 Component클래스에서 보여집니다.

컴포넌트 오브젝트가 나타내고 있는 컴포넌트에 관한 다양한 정보를 저장합니다. 컴포넌트의 activate, deactivate 컴포넌트의 포트 관리, 연결, 구성을 설정할 수 있습니다.

매니저로 새로운 컴포넌트 인스턴스를 만들거나 컴포넌트를 지울 수 있습니다.

트리내의 모든 노드에도 그것들이 나타내는 오브젝트에는 CORBA 오브젝트의 참조를 저장합니다. 이 오브젝트에 액세스 하는 것으로 IDL의 메소드를 호출할 수 있습니다. 만약 현재 rtctree로 실현 불가능한 기능이 있었다 해도, 이 CORBA 오브젝트를 이용해 IDL 메소드를 직접적으로 호출할 수 있습니다.

트리의 구축

트리의 팩토리 함수의 인수(create_tree())는 트리를 구축하기 위한 해석 대상이 되는 네임 서버를 지정합니다. 자세한 것은 해당 함수의 문서를 참조해 주십시오. 일반적으로, 네임 서버의 주소 리스트 또는 패스의 리스트를 건네주어 트리를 구축할 수 있습니다. 환경 변수 RTCTREE_NAMESERVERS도 체크됩니다.

패스

트리내의 노드는 패스로 지정됩니다. 패스는 스트링의 리스트입니다. 하나 오른쪽의 레벨은 왼쪽의 것보다 1 레벨 깊어집니다. 절대 패스는 트리 오브젝트를 지정하기 위해서 필요합니다. 만약 패스가 노드 이하에 존재하는 경우, 노드로부터의 상대 패스 지정도 가능합니다.

이러한 패스 문자열은 파일 시스템 패스 지정과 비슷합니다. 트리의 루트는/로 나타냅니다.(Windows의 경우는\). 최초의 레벨은 네임 서버의 주소입니다. 그 아래의 레벨은 컴포넌트, 매니저 및 네이밍 컨텍스트(디렉토리로서 나타냄)입니다.parse_path라고 하는 함수는 문자열의 패스를 RTC 트리용의 패스로 변경합니다.

예를 들면, 이하의 패스:

 /localhost/naming_context/ConsoleIn0.rtc
localhost위에서 기동하고 있는 네임 서버의naming_context의 아래에 등록된ConsoleIn0.rtc라고 하는 컴포넌트를 나타냅니다.트리로부터 그 컴포넌트의 오브젝트를 취득하고 싶을 때, 패스를parse_path로 Python의 리스트로 변경할 필요가 있습니다.
 ['/', 'localhost', 'naming_context', 'ConsoleIn0.rtc']

헬퍼 함수

이하는 RTCTree 클래스 및 다양한 노드 클래스를 위한 헬퍼 함수입니다. 여기서 설명하는 것이 모든 API를 나타내고 있는 것은 아닙니다. Doxygen로 기술된 API의 문서를 참조해 주십시오. 예는 rtcshell의 소스를 참조해 주십시오.

RTCTree.has_path 트리의 패스가 있는지를 체크합니다. 컴포넌트의 존재를 체크하려면 이 함수를 사용하면 편리합니다.
RTCTree.get_node 트리로부터 노드를 취득합니다. 컴포넌트, 디렉토리 등을 취득하기 위해서는 이 함수를 사용해 주십시오.
RTCTree.is_component 패스가 컴포넌트를 가리키고 있는지를 조사합니다. 노드 클래스는 is_component라고 하는 같은 기능의 프로퍼티를 갖고 있습니다. is_directory, is_manageris_nameserver라고 하는 함수 및 프로퍼티도 있습니다.
RTCTree.iterate() 트리의 모든 노드에 같은 함수를 실행합니다 .모든 결과는 리스트로서 반환됩니다. 예는 rtcshell의rtls를 참조해 주십시오.
Node.children 노드의 모든 자식(子) 노드. 예:디렉토리 아래의 컴포넌트의 리스트를 취득하기 위해서 이용할 수 있습니다.
Node.full_path 트리의 루트로부터 이 노드까지의 패스.
Node.name 노드의 이름. 예:디렉토리의 이름.
Node.parent_name 노드의 부모의 이름.
Node.root 이 노드의 트리의 루트 노드. 반환된 오브젝트로 트리의 거의 모든 기능을 할 수 있습니다.
Component.activate_in_ec() 컴포넌트를 activate 합니다. 통상은 ec_index는 0으로 상관없습니다.
Component.deactivate_in_ec() 컴포넌트를 deactivate 합니다.
Component.reset_in_ec() 컴포넌트를 reset 합니다.
Component.state_in_ec() 어떤 execution context로 컴포넌트의 스테이트를 얻습니다.
Component.alive 컴포넌트가 alive인지를 체크합니다.
Component.owned_ecs 컴포넌트가 가지고 있는 execution context의 리스트입니다.
Component.participating_ecs 컴포넌트가 사용하고 있는 execution context의 리스트입니다.
Component.state 컴포넌트의 스테이트입니다.
Component.state_string 문자열로 한 컴포넌트의 스테이트입니다.
Component.disconnect_all() 컴포넌트의 모든 포트의 접속을 끊습니다.
Component.get_port_by_name() 컴포넌트의 포트를 이름으로 찾는다.
Component.ports 컴포넌트 포트의 리스트입니다. 입력 포트, 출력 포트 및 서비스 포트의 리스트가 포함된 한편 현재 접속 상태의 포트의 리스트도 취득할 수 있습니다.
Component.object 컴포넌트의 CORBA의 LightweightRTObject 오브젝트입니다.
Component.activate_conf_set configuration 세트를 activate 합니다.
Component.set_conf_set_value configuration 세트의 변수를 설정합니다.
Component.active_conf_set 현재의 active configuration 세트입니다.
Component.active_conf_set_name 현재의 active configuration 세트의 이름입니다.
Component.conf_sets configuration 세트의 리스트입니다.
Port.connect() 이 포트를 다른 포트에 접속합니다.
Port.disconnect_all() 이 포트의 모든 연결을 끊습니다.
Port.get_connection_by_dest() 이 포트의 연결을 다른 포트로 찾습니다.
Port.get_connection_by_name() 이 포트의 연결을 이름으로 찾습니다.
Port.connections 이 포트의 연결 리스트입니다.
Port.is_connected 이 포트가 연결 상태인지 어떤지를 체크합니다.
Port.name 포트의 이름입니다.
Port.object 이 포트의 CORBA의 PortService 오브젝트입니다.
Port.name 포트의 오너(통상은Component오브젝트)입니다.
Port.porttype 포트의 종류(DataInPort,DataOutPortCorbaPort).
Connection.disconnect() 이 연결을 끊습니다.
Connection.ports 이 연결의 소스나 목적 포트의 리스트입니다.
ConfigurationSet.has_param() 이 세트에 변수가 있는가를 체크합니다.
ConfigurationSet.set_param() 이 세트의 변수를 설정합니다.
ExecutionContext.activate_component() 이 execution context로 컴포넌트를 activate 합니다.
ExecutionContext.deactivate_component() 이 execution context로 컴포넌트를 deactivate 합니다.
ExecutionContext.reset_component() 이 execution context로 컴포넌트를 reset 합니다.
ExecutionContext.get_component_state() 이 execution context안의 컴포넌트의 스테이트를 가져옵니다.
ExecutionContext.running 이 execution context가 기동하고 있는지를 체크합니다.
Manager.create_component() 새로운 컴포넌트 인스턴스를 만듭니다.
Manager.delete_component() 컴포넌트 인스턴스를 삭제합니다.
dict_to_nvlist() Python의 dict를 CORBA의 namevalue 리스트로 변경합니다.
nvlist_to_dict() CORBA의 namevalue 리스트를 Python의 dict로 변경합니다.

API의 스타일

rtctree는 Python의 표준 스타일에 따릅니다. PEP8을 참조해 주세요.

가장 중요한 점은 Private한 내부 API 함수는 언더 바(「_」)로 시작되는 것입니다. 언더 바로 시작되는 함수는 클래스 외부로부터 증명해야 하는 것이 아닙니다. 만약 사용했을 경우에는 미정의된 행동을 일으킬 가능성이 있습니다. 언더 바로 시작되지 않고 docstring가 있는 함수만을 사용해 주십시오.

리포지터리

최신판의 소스는github로 Git의 리포지터리(repository)에 있습니다.「Download source」를 클릭해 다운로드 할 수 있습니다.「git clone」를 사용할 수도 있습니다. 패치를 보내고 싶다면, 이 방법을 추천합니다.

 $ git clone git://github.com/gbiggs/rtctree.git

보다 상세한 문서와 샘플

보다 상세한 문서는 Doxygen로 기술된 문서를 참조해 주십시오.

샘플은rtcshell의 소스를 참조해 주십시오. 이것들은 RTSystemEditor로 실현 가능한 것을 rtctree로 실시하는 방법의 거의 모두를 보이고 있습니다.

Changelog

3.0

  • 예외를 경고로 하였습니다.
  • 좀비의 취급을 개선하였습니다.
  • 좀비 검출 매니저
  • 컴포지트 컴포넌트의 정보를 얻는 API를 추가하였습니다.
  • 포트에서 ID에의해 커넥션을 얻는 API를 추가하였습니다.
  • ORB를 건네는 API를 추가하였습니다.
  • 패스 포매터를 추가하였습니다.
  • 예외를 읽기 쉽게 표시하도록 하였습니다.
  • 퍼포먼스의 향상
  • 해석하는 경로를 제한하는 기능을 추가하였습니다.
  • 좀비 노드를 추가하였습니다.
  • 컴포넌트를 종료하는 API를 추가하였습니다.
  • create_rtctree()함수를 삭제했습니다. RTCTree()를 사용해주십시오.
  • remove_node()API를 추가하였습니다.
  • node.full_path 를 리스트로 변경하고, node.full_path_str을 추가하였습니다.

2.0

  • 실행 컨텍스트에 관해서보다 많은 정보를 해석하도록 했습니다.
  • ORB오브젝트를 외부로부터 주어지도록 했습니다.
  • reparse_connections() 함수를 public으로 했습니다.
  • 노드로 사용되고 있는 ORB를 취득하기 위한 새로운 API를 추가했습니다.
  • 컨텍스트에서 이름을 언바인드하기 위한 새로운 API를 추가했습니다.
  • 보다 많은 CORBA 오브젝트에의 액세스를 가능하게 했습니다.
  • 좀비 컴포넌트의 인식 효율이 향상되었습니다.
  • 알수 없는 CORBA 오브젝트의 취급 방법을 수정했습니다.
  • 오너가 알수 없는 포트의 취급 방법을 수정했습니다.
  • rtctree오브젝트를 Thread-safe하기 위한 락을 추가했습니다.
  • 트리의 오브젝트를 재로드하기 위한 API를 추가했습니다.
  • 적절한 inheritence 취급을 위해서init함수를 수정했습니다.
  • 특정의 EC안의 컴포넌트 상태를 얻기 위한 새로운 API를 추가했습니다.
  • 특정의 EC안의 컴포넌트 상태를 갱신하기 위한 새로운 API를 추가했습니다.