セック ロボットサイト - OpenRTM-aistとの互換性

OpenRTM-aistとの互換性

バージョンの互換性

OpenRTM.NETはOpenRTM-aistと接続することが可能ですが、バージョンによる互換性の有無があります。

対応するバージョンはそれぞれ下記のようになっています。

OpenRTM.NETとOpenRTM-aistのバージョン互換性
OpenRTM.NETのバージョン OpenRTM-aistのバージョン
OpenRTM.NET-1.0.x OpenRTM-aist-1.0β
OpenRTM.NET-1.1.x OpenRTM-aist-1.0.x
OpenRTM.NET-1.2.x OpenRTM-aist-1.0.x
OpenRTM.NET-1.3.x OpenRTM-aist-1.1.x

型の互換性

OpenRTM.NETでは、IDLを記述しなくても独自データ型やサービスポートの型をC#のコードで記述することができます。

一方、独自データ型やサービスポートを使ったOpenRTM-aisのコンポーネントと接続するためには、IDLファイルが必要となります。

ここでは、OpenRTM.NETで既存のIDLファイルを利用する方法と、C#のコードで独自型を定義したコンポーネントから IDLファイルを生成する方法について説明します。


既存のIDLファイルを利用する場合

既存のIDLファイルを利用してOpenRTM.NETのコンポーネントを作成したい場合は、IDLコンパイルを行う必要があります。

my.idlファイルをIDLコンパイルしたい場合は、下記のようにコマンドを実行してください。MY_IDLで出力ファイル名を指定しています。

"C:\Program Files\SEC\OpenRTM.NET 1.3\bin\IDLToCLSCompiler.exe" MY_IDL my.idl

BasicDataType.idlなどで定義されている型を利用したい場合は、下記のコマンドでIDLコンパイルを実行します。 また、複数のIDLファイルをコンパイルしたい場合は、ファイル名を並べて記述します。 (下記のコマンドは1行で入力して下さい)

"C:\Program Files\SEC\OpenRTM.NET 1.3\bin\IDLToCLSCompiler.exe" -r OpenRTM.IDL.dll -lib:"C:\Program Files\SEC\OpenRTM.NET 1.3\bin" -idir "C:\Program Files\SEC\OpenRTM.NET 1.3\idl" MY_IDL my1.idl my2.idl

IDLコンパイルに成功すると、MY_IDL.dllというファイルが生成されていますので、Visual Studioの参照設定から、プロジェクトにMY_IDL.dllを追加して下さい。 併せて OpenRTM.IDL.dll と IIOPChannel.dll を追加して下さい。


IDLから生成された型を利用するためには、下記のようにInPort/OutPort/Consumer/Providerの型パラメータに利用したい型を指定します。 このとき、各属性のTypeKindにTypeKind.DependentTypeを指定する必要があります。

[InPort(TypeKind = TypeKind.DependentType)]
InPort<MyData> inport = new InPort<MyData>();

[OutPort(TypeKind = TypeKind.DependentType)]
OutPort<MyData> outport = new OutPort<MyData>();

[Consumer(TypeKind = TypeKind.DependentType)]
Consumer<MyService> myservice = new Consumer<MyService>();

[Provider(TypeKind = TypeKind.DependentType)]
Provider<MyService> myservice = new Provider<MyService>(new MyServiceImple());

サービスポートのプロバイダを実装する際には、MarshalByRefObjectを継承し、 IDLから生成されたinterface(MyService)を実装します。 また、InitializeLifetimeServiceをオーバーライドしnullを返すことで、サービスのライフタイムを無制限に設定することができます。

public class MyServiceImple : MarshalByRefObject, MyService
{
    public override object InitializeLifetimeService() {
        return null;
    }
    public string echo(string message)
    {
        Console.WriteLine(message);
        return message;
    }
}

なお、IDLから生成された型を利用した場合はCORBAに依存したコンポーネントになってしまうため、 SOAPやLocal通信は利用できなくなります。

OpenRTM.NETのコンポーネントからIDLを生成する場合

OpenRTM.NETで独自データ型やサービスポートを持ったRTコンポーネントを作成した場合、IDLファイルが自動生成されます。

RTコンポーネントを実行すると、実行ファイルと同じ場所に .autgen というフォルダが生成されているのを確認して下さい。 (隠しファイルを表示しない設定の場合は表示されません。)

この .autgen の下にIDLファイルが生成されていますので、コピーして利用して下さい。