セック ロボットサイト - PyRTSeamの基礎

PyRTSeamの基礎

PyRTSeamでRTCを作成するには、 プロファイルロジック という 2つの要素を用意します。

PyRTSeamを体験してみる で作成した、”HelloWorld”を表示するRTCでは、

プロファイル:

PROFILE = rtseam.Profile(name="HelloWorld")

ロジック:

def print_hello_world():
    print "Hello,world"

となります。

プロファイルとロジックをrtseam.openrtm.run関数の引数に渡すことでRTCが起動します:

rtseam.openrtm.run(PROFILE, print_hello_world)

以降では、プロファイルとロジックについて説明します。

プロファイル

プロファイルはRTCの情報を表す定数です。RTCの名前やバージョン、カテゴリ名、 コンフィギュレーションとポートの定義などを記述できます。 プロファイルはrtseam.Profileクラスのインスタンスとして作成します。 例えば次のように記述します:

PROFILE = rtseam.Profile(name="LRF",
                         category="Sensor",
                         version="0.1.0",
                         outports={"Ranges": RTC.RangeData})

これは、

  • RTC名は”LRF”
  • カテゴリ名は”Sensor”
  • バージョンは”0.1.0”
  • ポート名が”Ranges”、データ型がRTC.RangeDataのデータ出力ポートを持つ

という意味です。

ロジック

ロジックはRTCの動作を記述した関数またはクラスです。RTCのonExecuteで呼び出されます。 最も単純なものは次のようなものです:

def print_hello_world():
    print "Hello,world"

引数を受け取る関数や戻り値を返す関数をロジックにすると、 データポートを利用できるようになります。 手順は データポートを利用する で説明しています。

RTCのonActivatedとonDeactivatedで何らかの処理を行いたい場合や、 コンフィギュレーションを利用したい場合はロジックをクラスで作成します。

ロジックをクラスで作成すると、RTCのonActivatedでロジックのインスタンスが生成され、 RTCのonExecuteでロジックの__call__メソッドが呼び出されます。 そのため、RTCのonActivatedで行いたい処理は、__init__メソッドに記述できます:

class Vehicle(object):
    def __init__(self):
        self._vehicle_driver = VehicleDriver()
        self._vehicle_driver.start()

    def __call__(self, input_data):
        if "Velocity" in input_data:
            self._vehicle_driver.set_velocity(input_data["Velocity"])

RTCのonActivatedで生成されたロジックのインスタンスは、RTCのonDeactivated で破棄されます。インスタンスが破棄される直前に何らかの処理を行いたい場合は、 ロジックにcloseという名前のメソッドを定義してください:

class Arm(object):
    def __init__(self):
        self._arm_driver = ArmDriver()
        self._arm_driver.start()

    def __call__(self, input_data):
        if "Angles" in input_data:
            self._arm_driver.move(input_data["Angles"])

    def close(self):
        self._arm_driver.stop()

ロジックの__init__で引数を受け取ると、コンフィギュレーションを利用できるようになります。 手順は コンフィギュレーションを利用する で説明しています。