データポートでユーザ定義型を利用する

PyRTSeamでは、データポートで送受信するデータの型に、 RTC開発者が独自にIDLで定義した構造体(ユーザ定義型)を利用できます。

IDLで定義された型をPythonから利用するためには、IDLコンパイラを使ってIDLファイルを Pythonのソースコードに変換します。 PyRTSeamが提供するrtseam.openrtm.compile_idl関数を呼び出すことで、IDLファイルが コンパイルされ、Pythonから利用できるようになります。

例えば、次のIDLファイル(example.idl)があるとします:

#include <BasicDataType.idl>

module my_type
{
struct DeviceInfo
{
    long serial_number;
    string type_name;
    string vendor;
    string version;
};

struct TimedDeviceInfo
{
    RTC::Time tm;
    DeviceInfo data;
};
};

このIDLファイルがカレントディレクトリにある場合、Pythonで次の処理を実行すると、 IDLコンパイルが行われます:

import rtseam.openrtm
rtseam.openrtm.compile_idl("example.idl")

IDLコンパイルを行うと、カレントディレクトリにPythonモジュールが生成されます。

IDLにおける”module”は、Pythonにおけるモジュールに対応するので、 my_typeモジュールをインポートすれば、my_type.TimedDeviceInfoが利用できるようになります。

IDLで定義された型がPythonから利用できるようになれば、プロファイルやロジックの書き方は これまでと同様です。例えば、my_type.TimedDeviceInfo型のデータを データ出力ポートで送信するRTCは次のようになります:

import rtseam.openrtm

rtseam.openrtm.compile_idl("example.idl")
import my_type

PROFILE = rtseam.Profile(name="Sensor",
                         outports={"Info": my_type.TimedDeviceInfo})

def send_device_info():
    current_time = rtseam.openrtm.current_time()
    info = my_type.DeviceInfo(serial_number=123456,
                              type_name="SENSOR-01",
                              vendor="sensor_maker",
                              version="2.3.4")
    return {"Info": my_type.TimedDeviceInfo(tm=current_time,
                                            data=info)}

rtseam.openrtm.run(PROFILE, send_device_info)