セック ロボットサイト - コンフィギュレーションの利用

コンフィギュレーションの利用

RTコンポーネントは、パラメータを管理するための機能としてコンフィギュレーションを持っています。

コンフィギュレーションパラメータ

コンフィギュレーションを使用する場合は、RTコンポーネントの実装クラスのメンバ変数、もしくはプロパティとして宣言し、 Configurationカスタム属性を付与します。 Configurationカスタム属性の“DefaultValue”には、パラメータのデフォルトの値を、 “Name”にはパラメータの名前を指定します。Nameを省略した場合は、変数の名前が自動的に割り当てられます。

コンフィギュレーションパラメータ(メンバ変数)

[Configuration(DefaultValue = "0", Name = "int_value")]
int int_value = 0;

コンフィギュレーションパラメータ(プロパティ)

[Configuration(DefaultValue = "0", Name = "int_value")]
public int IntValue{ get; set;}

コンフィギュレーションパラメータは、通常のメンバ変数と同じように利用することができます。

コンフィギュレーションパラメータの利用

protected override ReturnCode_t OnExecute(int exec_handle)
{
    Console.WriteLine("int_value: {0}", int_value);
    return ReturnCode_t.RTC_OK;
}

バリデータ

OpenRTM.NETのコンフィギュレーションでは、入力されたパラメータの検証チェックを行う機能としてバリデータが用意されています。 バリデータには以下に示すものがあります。

バリデータの種類
バリデーション属性 説明
RangeValidator 値の範囲チェック
StringLengthValidator 文字列の長さチェック
MatchValidator 文字列の正規表現チェック
SelectionValidator 指定された値のチェック
CustomValidator 独自バリデータ

バリデータを利用するには、コンフィギュレーションパラメータにカスタム属性として指定します。 なお、バリデータは1つのコンフィギュレーションパラメータに複数設定することができます。

バリデータの利用

[Configuration(DefaultValue = "0", Name = "int_value")]
[RangeValidator(0, 100)]
int int_value = 0;

[Configuration(DefaultValue = "test", Name = "str_value")]
[StringLengthValidator(10)]
string str_value = string.Empty;

[Configuration(DefaultValue = "hoge@hoge.com", Name = "mail_address")]
[MatchValidator(@"[a-zA-Z0-9_-]+\@[a-zA-Z0-9_-]+\.\w+")]
string mail_address = string.Empty;

[Configuration(DefaultValue = "19200", Name = "baud_rate")]
[SelectionValidator(9600, 19200, 38400, 57600, 115200, 250000)]
int baud_rate = 19200;

また、標準的に用意されたバリデータ以外にも、ユーザーが独自に実装したカスタムバリデータを利用することができます。 カスタムバリデータを実装するためには、IValidatorインタフェースを実装します。 以下の例では、リストに含まれる値が0から100までの間であるかどうかをチェックしています。

カスタムバリデータの実装

public class MyValidator : IValidator
{
  public bool IsValid(object target)
  {
    if(target is List<int>)
    {
        List<int> list = (List<int>) target;
        if(list.Max() > 100) return false;
        if(list.Min() < 0) return false;
       return true;
    }
    return false;
  }
}

カスタムバリデータを利用するには、CustomValidatorカスタム属性を利用します。

カスタムバリデータの利用

[Configuration(DefaultValue = "1,2,3,4,5", Name = "int_list")]
[CustomValidator(typeof(MyValidator))]
List<int> int_list = new List<int>();

データコンバータ

コンフィギュレーションパラメータは、標準でプリミティブ型とstring型とそのListを利用することができます。 独自のデータ型をコンフィギュレーションパラメータとして利用するには、.NET Frameworkに用意されているTypeConverterクラスを利用します。 TypeConverterクラスを継承し、CanCoverterFromやCanConvertTo、CoverterFrom、ConvertToなどのメソッドをオーバーライドし、 変換したいデータ型と文字列を相互に変換する処理を実装してください。変換できない場合には、NotSupportedException例外を投げるようにします。

データコンバータの実装

public  class MyDataConverter : TypeConverter
{
    public override bool CanConvertFrom(
        ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string)) return true;
        else return false;
    }

    public override bool CanConvertTo(
        ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(string)) return true;
        else return false;
    }

    public override object ConvertFrom(
        ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string)
        {
            string[] values = ((string)value).Split(new char[] { ',' });

            if (values.Length != 3) throw new NotSupportedException();
            int x, y, z;
            if (!int.TryParse(values[0], out x))
            {
                throw new NotSupportedException();
            }
            if (!int.TryParse(values[1], out y))
            {
                throw new NotSupportedException();
            }
            if (!int.TryParse(values[2], out z))
            {
                throw new NotSupportedException();
            }

            return new MyData() { X = x, Y = y, Z = z };
        }
        throw new NotSupportedException();
    }

    public override object ConvertTo(
        ITypeDescriptorContext context, CultureInfo culture,
        object value, Type destinationType)
    {
        if (value.GetType() == typeof(MyData))
        {
            MyData myData = (MyData) value;
            return myData.X + "," + myData.Y + "," + myData.Z;
        }
        throw new NotSupportedException();
    }
}

独自のデータコンバータを利用するためには、データ型の定義にTypeConverterカスタム属性を付与します。

データコンバータの利用

[TypeConverter(typeof(MyDataConverter))]
public class MyData
{
  public int X { get; set; }
  public int Y { get; set; }
  public int Z { get; set; }
}

バインディングモード

OpenRTM.NETのコンフィギュレーションパラメータは、RTミドルウェア(RTObject)と、ユーザー定義コンポーネントの2カ所で管理されています。 RTObjectで管理されているパラメータは、RTSystemEditorなどのツールから取得や変更が可能なパラメータです。 ユーザー定義コンポーネントで管理するパラメータは、アクティビティから取得や変更が可能なパラメータです。

../_images/configuration.png

コンフィギュレーションパラメータの流れ

OpenRTM.NETのコンフィギュレーションでは、バインティングモードが設定可能であり、パラメータの流れを制御することができます。 バインディングモードには以下に示す3種類があります。

バインディングモードの種類
モード 説明
OneWay(順単方向) ツールなどによって書き換えられたパラメータの値がユーザー定義コンポーネントのパラメータの値に反映されます。ユーザーロジック内でのパラメータの書き換えは無効になります。OnExecuteアクティビティの実行前に値が反映されます。
OneWayToSource(逆単方向) ユーザー定義ロジック内で書き換えられたパラメータの値が、ミドルウェアで管理するパラメータへと反映されます。ツールからのパラメータの書き換えは無効となります。OnExecuteアクティビティの実行後に値が反映されます。
TwoWay(双方向) 順単方向と逆単方向の両方の特性を併せ持ちます。

バインディングモードを指定するためには、Configurationカスタム属性の“BindingMode”を利用します。 BindingModeを省略した場合は、OneWayが指定されたことになります。

バインディングモードの指定

[Configuration(DefaultValue = "10", Name = "val1",
    BindingMode = BindingMode.OneWay)]
public int OnewayVal { get; set; }

[Configuration(DefaultValue = "20", Name = "val2",
    BindingMode = BindingMode.TwoWay)]
public int TwowayVal { get; set; }

[Configuration(DefaultValue = "30", Name = "val3",
    BindingMode = BindingMode.OneWayToSource)]
public int OnewaytosourceVal { get; set; }

コンフィギュレーションセット

OpenRTM.NETでは、コンフィギュレーションのパラメータを1つのクラスにまとめることができます。 コンフィギュレーションパラメータをまとめたクラスを実装し、RTコンポーネントの実装では、 ConfigurationSetカスタム属性を付与することで、パラメータをまとめて管理することが可能になります。

コンフィギュレーションパラメータをまとめたクラス

public class MyConfiguration
{
    public MyConfiguration()
    {
        StringParam0 = string.Empty;
    }
    [Configuration(DefaultValue = "0")]
    public int IntParam0{ get; set;}

    [Configuration(DefaultValue = "hoge")]
    public string StringParam0{ get; set;}
}

ConfigurationSetの指定

[ConfigurationSet]
MyConfiguration myconfig = new MyConfiguration();

コンフィギュレーションファイル

コンフィギュレーションの情報は、コンポーネントの起動時にファイルから読み込んだり、ファイルに保存したりすることができます。 コンフィギュレーションファイルの記述例を以下に示します。

コンフィギュレーションファイルの記述例

<?xml version="1.0"?>
<ConfigurationSets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ActiveID="default">
  <ConfigurationSet ID="default" Description="">
    <Configuration Name="int_param0">0</Configuration>
    <Configuration Name="int_param1">1</Configuration>
    <Configuration Name="double_param0">0.11</Configuration>
    <Configuration Name="double_param1">9.9</Configuration>
    <Configuration Name="string_param0"></Configuration>
    <Configuration Name="string_param1">dara</Configuration>
    <Configuration Name="vector_param0">0.0,1.0,2.0,3.0,4.0</Configuration>
  </ConfigurationSet>
</ConfigurationSets>

コンフィギュレーションファイル名はrtc.configで指定します。