セック ロボットサイト - データポートの利用

データポートの利用

RTコンポーネントは、他のRTコンポーネントやアプリケーションとデータ交換を行うための手段として、入力ポートと出力ポートを利用することができます。

InPortの利用

InPortを利用する場合は、以下のようにInPortクラスを利用します。 InPortクラスは型パラメータを2つ持ち、データ型とバッファ型を指定することが出来ます。バッファ型を省略すると、自動的にRingBufferが利用されます。 また、InPortカスタム属性を利用することで、このメンバフィールドが入力ポートであることを表します。 “PortName”には、入力ポートのポート名を設定します。なお、PortNameを省略した場合は、自動的に変数名(こでは“inport”)が割り当てられます。

InPortの宣言と初期化

using System;
using OpenRTM.Core;

namespace Examples
{
    [Component(Category = "Examples", Name = "ExampleComponent")]
    public class ExampleComponent : DataFlowComponent
    {
        [InPort(PortName = "in")]
        InPort<TimedLong> inport = new InPort<TimedLong>();
    }
}

InPortからデータを読み込むには、以下のようにReadメソッドを利用します。 この例では、Readメソッドの戻り値としてTimedLong型のデータを取得し、それをコンソールに表示しています。 また、IsNewメソッドを利用すると、InPortにデータが書き込まれたかどうかをチェックすることができます。 ただし、IsNewは拡張メソッドであり、利用する場合は、OpenRTM.Extensionを参照する必要があります。 (拡張メソッドを利用しない場合は、inport.Buffer.IsNew()と記述します。)

InPortからデータの読み込み

protected override ReturnCode_t OnExecute(int ec_id)
{
    if (inport.IsNew())
    {
        TimedLong data = inport.Read();
        Console.WriteLine("time = {0}", data.Time.ToDateTime());
        Console.WriteLine("data = {0}", data.Data);
    }
    return ReturnCode_t.RTC_OK;
}

OutPortの利用

OutPortを利用する場合は、以下のようにOutPortクラスを利用します。 OutPortクラスは型パラメータを2つ持ち、データ型とバッファ型を指定することが出来ます。バッファ型を省略すると、自動的にNullBufferが利用されます。 また、OutPortカスタム属性を利用することで、このメンバフィールドが出力ポートであることを表します。 “PortName”には、入力ポートのポート名を設定します。なお、PortNameを省略した場合は、自動的に変数名(こでは“outport”)が割り当てられます。

OutPortの宣言と初期化

using System;
using OpenRTM.Core;

namespace Examples
{
    [Component(Category = "Examples", Name = "ExampleComponent")]
    public class ExampleComponent : DataFlowComponent
    {
        [OutPort(PortName = "out")]
        OutPort<TimedLong> outport = new OutPort<TimedLong>();
    }
}

OutPortにデータを書き込むには、Writeメソッドを利用します。

OutPortへのデータの書き込み

protected override ReturnCode_t OnExecute(int ec_id)
{
    TimedLong data = new TimedLong();
    data.Time.SetCurrentTime();
    data.Data = 1234;
    outport.Write(data);
    return ReturnCode_t.RTC_OK;
}

コールバックイベント

OpenRTM.NETにおけるデータポートでは、データポートにデータが書き込まれた時や読み込まれた時に、コールバックイベントを受け取ることができます。 コールバックイベントには以下に示すものがあります。

InPortのコールバックイベント
コールバックメソッド 説明
void OnWrite(TDataType value) データが書き込まれた時のコールバック
TDataType OnWriteConvert(TDataType value) 書き込まれたデータを変換するためのコールバック
void OnOverflow(TDataType value) バッファオーバーフロー時のコールバック
void OnUnderflow() バッファアンダーフロー時のコールバック
void OnReadTimeout() データ読み込みタイムアウト発生時のコールバック
void OnConnect(ConnectorProfile prof) データポートが接続された時のコールバック
void OnDisconnect(ConnectorProfile prof) データポートが切断された時のコールバック
OutPortのコールバックイベント
コールバックメソッド 説明
void OnRead() データが読み込まれた時のコールバック
TDataType OnReadConvert(TDataType value) 読み込み時のデータを変換するためのコールバック
void OnOverflow(TDataType value) バッファオーバーフロー時のコールバック
TDataType OnUnderflow() バッファアンダーフロー時のコールバック
void OnWriteTimeout(TDataType value) データ書き込みタイムアウト発生時のコールバック
void OnConnect(ConnectorProfile prof) データポートが接続された時のコールバック
void OnDisconnect(ConnectorProfile prof) データポートが切断された時のコールバック

コールバックイベントを利用するためには、コールバックメソッドを用意し、 データポートにコールバックメソッドをセットする必要があります。

コールバックメソッドの定義

void OnWriteTest(TimedLong value)
{
    // OnWriteが呼び出されたときの処理を書く
}

コールバックメソッドのセット

inport.OnWrite += OnWriteTest;

また、C#の匿名デリゲートの機能を利用することにより、簡便に記述することもできます。

匿名デリゲートを利用したコールバックの記述

inport.OnWrite += (delegate (TimedLong value)
{
    /* OnWriteが呼び出されたときの処理を書く */
});

C#3.0(Visual Studio 2008)以降であれば、ラムダ式を利用してシンプルに記述することができます。

ラムダ式を利用したコールバックの記述

inport.OnWrite += value => { /* OnWriteが呼び出されたときの処理を書く*/ };

標準で利用できるデータ型

基本データ型一覧を以下に示します。

基本データ型一覧
型名 内容
TimedState RTコンポーネントの状態を表現するデータ型
TimedShort 符号あり2バイト整数
TimedLong 符号あり4バイト整数
TimedUShort 符号なし2バイト整数
TimedULong 符号なし4バイト整数
TimedFloat 単精度浮動小数点
TimedDouble 倍精度浮動小数点
TimedChar 符号あり1バイト整数
TimedWChar ワイド文字
TimedBoolean ブール
TimedOctet 符号なし1バイト整数
TimedString 文字列
TimedWString ワイド文字列
TimedShortSeq 符号あり2バイト整数配列
TimedUShortSeq 符号なし2バイト整数配列
TimedLongSeq 符号あり4バイト整数配列
TimedULongSeq 符号なし4バイト整数配列
TimedFloatSeq 単精度浮動小数点配列
TimedDoubleSeq 倍精度浮動小数点配列
TimedCharSeq 符号あり1バイト整数配列
TimedWCharSeq ワイド文字配列
TimedBooleanSeq ブール配列
TimedOctetSeq 符号なし1バイト整数配列
TimedStringSeq 文字列配列
TimedWStringSeq ワイド文字列配列

ロボットアプリケーション向け拡張データ型一覧を以下に示します。

ロボットアプリケーション向け拡張データ型一覧
型名 内容
TimedRGBColour RGB
TimedPoint2D 2次元の点
TimedVector2D 2次元のベクトル
TimedPose2D 2次元の位置
TimedVelocity2D 2次元の速度
TimedAcceleration2D 2次元の加速度
TimedPoseVel2D 2次元の位置と速度
TimedSize2D 2次元のサイズ
TimedGeometry2D 2次元の幾何情報
TimedCovariance2D 2次元位置の共分散
TimedPointCovariance2D 2次元点の共分散
TimedCarlike 自動車のようなロボットの位置
TimedSpeedHeading2D 2次元の速度と方向
TimedPoint3D 3次元の点
TimedVector3D 3次元のベクトル
TimedOrientation3D 3次元の方向
TimedPose3D 3次元の位置
TimedVelocity3D 3次元の速度
TimedAngularVelocity3D 3次元の方向と速度
TimedAcceleration3D 3次元の加速度
TimedAngularAcceleration3D 3次元の無機と加速度
TimedPoseVel3D 3次元の位置と速度
TimedSize3D 3次元のサイズ
TimedGeometry3D 3次元の幾何情報
TimedCovariance3D 3次元の共分散
TimedSpeedHeading3D 3次元の速度と方向
TimedOAP 方向、接近方向、位置

ロボットデバイスのインタフェース向けデータ型一覧を以下に示します。

ロボットデバイスのインタフェース向けデータ型一覧
型名 内容
ActArrayActuatorPos アクチュエータ群の位置
ActArrayActuatorSpeed アクチュエータ群の速度
ActArrayActuatorCurrent アクチュエータ群の電流
Actuator 単一のアクチュエータ
ActuatorList アクチュエータの配列
ActArrayState アクチュエータ群の状態
ActArrayActuatorGeometry アクチュエータ群の幾何情報
ActArrayActuatorGeometryList アクチュエータ群の幾何情報の配列
ActArrayGeometry アクチュエータ群の幾何情報
BumperGeometry 衝突センサの幾何情報
BumperGeometryList 衝突センサの幾何情報の配列
BumperArrayGeometry 衝突センサ群の幾何情報
CameraImage カメラ画像
CameraInfo カメラ情報
FiducialInfo 基準マーカーの情報
FiducialInfoList 基準マーカー情報の配列
Fiducials タイムスタンプ付き基準マーカー情報の配列
FiducialFOV 基準マーカーの視野角
GPSTime GPSの時刻情報
GPSData GPSのデータ
GripperState 把持機構の状態
GripperGeometry 把持機構の幾何情報
INSData INS(慣性航法装置)のデータ
LimbState ロボットの手足の情報
Hypothesis2D 2次元の位置推定
Hypothesis2DList 2次元の位置推定情報の配列
Hypotheses2D タイムスタンプ付き2次元の位置推定情報の配列
Hypothesis3D 3次元の位置推定
Hypothesis3DList 3次元の位置推定情報の配列
Hypotheses3D タイムスタンプ付き3次元の位置推定情報の配列
OGMapConfig 環境地図の設定情報
OGMapCells 環境地図のセル
OGMapTile 環境地図のタイル
PointFeature 特徴点
PointFeatureList 特徴点の配列
PoseFeature 特徴点と方向
PoseFeatureList 特徴点と方向の配列
LineFeature 特徴線
LineFeatureList 特徴線の配列
Features 地図の特徴情報のセット
MulticameraImageList 複数カメラの画像データ
MultiCameraImages タイムスタンプ付き複数カメラの画像データ
MulticameraInfoList 複数カメラの情報の配列
MulticameraGeometryList 複数カメラの幾何情報の配列
MulticameraGeometry タイムスタンプ付き複数カメラの幾何情報の配列
Waypoint2D 2次元の経路情報
Waypoint2DList 2次元の経路情報の配列
Path2D タイムスタンプ付き2次元の経路情報の配列
Waypoint3D 3次元の経路情報
Waypoint3DList 3次元の経路情報の配列
Path3D タイムスタンプ付き3次元の経路情報の配列
PointCloudPoint 点群データ用の点
PointCloudPointList 点群データ用の点の配列
PointCloud 点群データ
PanTiltAngles パンチルトデバイスの向き
PanTiltState パンチルトデバイスの状態
ElementGeometryList 幾何情報の配列
RangerGeometry 距離計測センサの幾何情報
RangerConfig 距離計測センサの設定情報
RangeList 距離データ
RangeData 距離計測センサのデータ
IntensityList 強度レーザの計測データ
IntensityData 強度レーザセンサのデータ
RFIDTagData RFIDタグのデータ

ユーザー定義型の利用

データポートでは、前述したデータ型以外にも、コンポーネント開発者が独自にデータ型を利用することができます。 独自のデータ型を定義する場合は、OpenRTM.Core.DataContractAttribute、OpenRTM.Core.DataMemberAttribute、 OpenRTM.Core.EnumMemberAttributeなどのカスタム属性を利用します。 例えば、int型の変数とstring型の変数を持つデータ構造であれば、以下のように定義することができます。

独自のデータ型の宣言

[DataContract]
public class MyData
{
    public MyData()
    {
        StringValue = string.Empty;
    }

    [DataMember]
    public int IntValue { get; set; }

    [DataMember]
    public string StringValue { get; set; }
}

これらの型は、他のデータ型と同様に利用することができます。

独自のデータ型の利用

[OutPort(PortName = "out")]
OutPort<MyData> outport = new OutPort<MyData>();

protected override ReturnCode_t OnExecute(int ec_id)
{
    MyData data = new MyData();

    data.IntValue = 1234;
    data.StringValue = "test";
    outport.Write(data);

    return ReturnCode_t.RTC_OK;
}