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 | コンフィグレーションセットをactivateします。 |
Component.set_conf_set_value | コンフィグレーションセットの変数を設定します。 |
Component.active_conf_set | 現在のactiveコンフィグレーションセットです。 |
Component.active_conf_set_name | 現在のactiveコンフィグレーションセットの名前です。 |
Component.conf_sets | コンフィグレーションセットのリストです。 |
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に参照してください。
最も重要な点は、プライベートな内部API関数はアンダースコア(「_」)で始まることです。アンダースコアで始まる関数はクラス外から証すべきではありません。もし使用した場合には、未定義の振る舞いを引き起こす可能性があります。アンダースコアで始まらず、docstringがある関数だけを使ってください。
最新版のソースはgithubでGitのリポジトリにあります。「Download source」をクリックしてダウンロードをすることができます。「git clone」を使うこともできます。パッチを送りたがったら、この方法がおすすめします。
$ git clone git://github.com/gbiggs/rtctree.git
より詳細なドキュメンテーションはDoxygenで記述されたドキュメンテーションを参照してください。
サンプルはrtshellのソースを参照してください。これらはRTSystemEditorで実現可能なことをrtctreeで行う方法のほぼ全てを示しています。