rtctree는 Python으로 RT컴포넌트를 관리하기 위한 라이브러리입니다.
rtctree는 간단한 API로 RT컴포넌트의 관리를하기 위한 Python용 라이브러리입니다. 개발자는 CORBA의 API를 몰라도 다른 프로그램으로부터, RT컴포넌트의 시스템을 관리할 수 있습니다. 컴포넌트를 activate 하거나 deactivate 하거나 컴포넌트의 사이의 접속을 실시하는 것 등이 가능합니다.
이 소프트웨어는 NEDO (독립 행정법인 신 에너지·산업기술 종합 개발 기구)의 차세대 로봇 지능화 기술개발 프로젝트의 지원에 의해, 독립 행정법인 산업기술 종합 연구소에 의해서 개발되고 있습니다.
인스톨은 몇가지의 방법이 있습니다.
$ cd /home/blurgle/src/ $ tar -xvzf rtctree-2.0.0.tar.gz
$ python setup.py install
이하의 환경 변수가 사용됩니다.
| 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 트리입니다.
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']
이하는 RTCTree 클래스 및 다양한 노드 클래스를 위한 헬퍼 함수입니다. 여기서 설명하는 것이 모든 API를 나타내고 있는 것은 아닙니다. Doxygen로 기술된 API의 문서를 참조해 주십시오. 예는 rtcshell의 소스를 참조해 주십시오.
| RTCTree.has_path | 트리의 패스가 있는지를 체크합니다. 컴포넌트의 존재를 체크하려면 이 함수를 사용하면 편리합니다. |
| RTCTree.get_node | 트리로부터 노드를 취득합니다. 컴포넌트, 디렉토리 등을 취득하기 위해서는 이 함수를 사용해 주십시오. |
| RTCTree.is_component | 패스가 컴포넌트를 가리키고 있는지를 조사합니다. 노드 클래스는 is_component라고 하는 같은 기능의 프로퍼티를 갖고 있습니다. is_directory, is_manager 및 is_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,DataOutPort및CorbaPort). |
| 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로 변경합니다. |
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로 실시하는 방법의 거의 모두를 보이고 있습니다.