セック ロボットサイト - コンポーネント開発の流れ

コンポーネント開発の流れ

本章では、OpenRTM.NETを利用してRTコンポーネントを開発する方法について紹介します。

開発環境の構築

OpenRTM.NETでRTコンポーネントを開発するためには、以下のいずれかの開発環境が必要になります。

  1. Visual Studio 2008/2010
  2. Visual C# Express Edition 2008/2010
  3. MonoDevelop2.0以上

本章では、Visual C# 2010 Express Editionがインストールされているものとして、説明を行います。

なお、コンポーネントの開発にVisual BasicやC++/CLIを利用する場合は、Visual Basic2008 Express Edition、Visual C++2008 Express Editionを選択することもできます。 機能を限定すれば、Visual Studio 2005でも開発できます。

コンポーネントのプロジェクトの作成

プロジェクトの作成

まず、RTコンポーネントを開発するためのプロジェクトを作成します。

Visual C#2010 Express Editionを起動し、メニューより「ファイル」→「新しいプロジェクト」 を選択すると、下図のようなダイアログが表示されます。

“OpenRTM.NET RTCテンプレート”を選択し、プロジェクト名には「RTコンポーネントの名前(ExampleComponentなど)」 を入力し、「OK」をクリックします。

../_images/create_project.png

プロジェクトの作成

成功すると、下図のように、プロジェクトが作成されます。

../_images/created_project.png

作成されたプロジェクト

OpenRTM.NETの参照設定

作成されたテンプレートでは、以下のアセンブリへの参照が設定されています。

RTコンポーネント開発に必要なアセンブリ
コンポーネント名 機能 .NET Frameworkのバージョン
OpenRTM.Core OpenRTM.NETの基本機能を提供します。 RTコンポーネントを開発する際には必ず参照してください。 .NET Framework2.0
OpenRTM.Extension OpenRTM.NETの拡張機能を提供します。 .NET Framework3.5
OpenRTM.IIOP CORBAプロトコルの機能を提供します。 .NET Framework2.0
OpenRTM.WCF WCFプロトコルの機能を提供します。 .NET Framework3.5

メインメソッドの実装

生成されたプロジェクトのメインメソッドには、以下のようなコードが記述されています。

Mainメソッドの実装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenRTM.Core;
using OpenRTM.IIOP;

namespace ExampleComponent
{
    class Program
    {
        static void Main(string[] args)
        {
            var manager = new Manager(args);
            manager.AddTypes(typeof(CorbaProtocolManager));
            manager.Activate();
            var comp = manager.CreateComponent<ExampleComponent>();
            manager.Run();
        }
    }
}
  • RTコンポーネントの管理クラス(Manager)のインスタンスを生成します。
  • プロトコルとしてCORBAを利用するような設定を行います。
  • Activateメソッドにより、RTコンポーネントの実行に必要な機能のローディングなどの処理を行います。
  • CreateComponentメソッドを利用し、RTコンポーネントを生成します。
  • Runメソッドを利用し無限ループに入ります。

コンポーネントの実装

生成されたプロジェクトには、RTコンポーネントのひな型も生成されています。

必要に応じて、InPort/OutPort/Configuration、アクティビティの実装を追加・削除することになります。

コンポーネントの実装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenRTM.Core;


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

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

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

        //        protected override ReturnCode_t OnAborting(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnActivated(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnDeactivated(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnError(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnExecute(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnFinalize()
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnInitialize()
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnRateChanged(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnReset(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnShutdown(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnStartup(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }

        //        protected override ReturnCode_t OnStateUpdate(int exec_handle)
        //        {
        //            return ReturnCode_t.RTC_OK;
        //        }
    }
}