RTCの仕様設計
Simple Wiki Based Contents Management System
ソフトウェア関連 >> OpenRTM-aist のRTC開発システム(Yarbs) >> RTCの仕様設計

RTCの仕様設計

ビルドシステム Yarbsのインストールの終了後は、開発するRTCの設計をします。従来は、RtcBuilderを起動して、eclipseのGUIで記述していくのですが、YarbsではYAML形式のテキストファイルを使います。
従って、YAMLファイルには、通常のテキストエディタで大丈夫です。ただし、YarbsではYAMLファイルから実装のひな形を自動生成しますので、いくつか必須のタグが存在します。
ここで取り扱うYAMLファイルのタグは、RtcBuilderで取り扱うものとほぼ同じですので、RtcBuilderと対応させて基本情報、アクティビティ、データポート、サービスポート、コンフィグレーションの順に説明していきます。

基本情報

基本情報は、開発するRTCの名称や実行コンテキストのタイプ等のRTコンポーネントの基本情報と言われているものです。RtcBuilderでは、
  • モジュール名(*)
  • モジュール概要
  • バージョン(*)
  • ベンダ名(*)
  • モジュールカテゴリ(*)
  • コンポーネントの型
  • アクティビティ型
  • コンポーネントの種類
  • 最大インタンス数
  • 実行型
  • 実行周期
  • 概要
  • RTC Type
がありました。(上記で(*)の印は、必須項目)
Yarbsでもほぼ同じ情報を入力することを推奨しています。厳密にいえば、Yarbsでは、モジュール名のみでもひな形の生成はできるのですが、C++のテンプレートのspecとして implementation_id, type_name, description, version, vendor, category, component_type, activity_type, kind, max_instanceを記載していますので、記述した方がいい項目です。
YAMLファイルでは、下記のようになります。
name: ConsoleIn            # モジュール名 (RTC名になります)
version: 2.0.0             # バージョン番号 x.y.zの形式
vendor: AIST              # ベンダ名(String)
max_instance: 1             # インスタンス化の最大数
executionType: PeriodicExecutionContext # 実行コンテキスト (PeriodicExecutionContext or ExtTrigExecutionContext)
executionRate: 1.0                      # 実行周期 [Hz}
description: ConsoleIn         # RTCの説明(String)
category: example                       # カテゴリ名 (String)
component_type: STATIC                 # コンポーネント型 (STATIC, UNIQUE, COMMUTATIVE)
activity_type: PERIODIC                # アクティビティ型(PERIODIC, SPORADIC, EVENTDRIVEN)
kind: DataFlowComponent                 # コンポーネント種類(DataFlowComponentのみサポート)
maintainer: Isao Hara                   # メンテナー名(任意)
author: Isao Hara(isao-hara@aist.go.jp) # 開発者名(任意)
name, max_instance, executionType, category, component_type, activity_type, kindの7項目は最低限記載してください。

アクティビティ

アクティビティは、アクションコールバックの設定です。すべての項目をOFFの場合には、省略可能です。また、設定可能なアクティビティは下記のようにactionキーに連想配列の形式で記載します。設定可能な項目は、RtcBuilderと同様です。
actions:
  - OnInitialize: true
  - OnFinalize: true
  - OnStartup: false
  - OnShutdown: false
  - OnActivated: true
  - OnDeactivated: true
  - OnAborting: false
  - OnError: false
  - OnReset: false
  - OnExecute: true
  - OnStateUpdate: false
  - OnRateChanged: false
  - OnAction: false
  - OnModeChanged: false
通常は、省略して下のようにtureの項目のみの記述で問題ありません。
actions:
  - OnInitialize: true
  - OnFinalize: true
  - OnActivated: true
  - OnDeactivated: true

データポート

RTCのデータポートを付けたい場合には、この項目を設定します。データポートの設定では、name, flow, typeを設定します。
flowは、"in"または"out"の文字列でポートの入出力を指定し、typeでデータ型を指定します。
nameは、識別子でもありますが、ここで設定した名前に従ってYarbsでは、変数名を自動設定します。
下の示したのは、SimpleIOコンポーネントで使用したデータポートの一例です。
dataport: 
  - name: out
    flow: out
    type: RTC::TimedLong
    description: String...
  - name: in
    flow: in
    type: RTC::TimedLong
    description: DataIn
    datalistener: DataIn
C++のコードでは、データ変数名をは、 m_+name となり、データポート名は m_+name+Out(またはIn)のようになります。
Pthonのコードでは、データ変数名は、self._d+name となり、データポート名は、self._+name+Out(またはIn)となります。
上の例では、C++で実装する場合には、
  RTC::TimedLong m_out;
  OutPort<RTC::TimedLong> m_outOut;

  RTC::TimedLong m_in;
  InPort<RTC::TimedLong> m_inIn;
となり、Pythonでは、
  self._d_out  # データ変数
  self._outOut # データポート

  self._d_in   # データ変数
  self._inIn  # データポート
のように変換されます。この例でもわかると思いますが、descriptionは、コード生成には使われていませんが、ドキュメント付きのポートを利用する場合には、この項目が使用されます。(以前は、OpenHRIのRTCではドキュメント付きのポートを使用していました)
OpenRTMのデータポートには、DataListenerを設定することができます。このデータリスナーは、データの送受信、コネクタの生成、削除などのタイミングでコールバック関数を設定して、即時処理できる機能です。OpenRTMの知能モジュールの一つであるコミュニケーション機能OpenHRIでは、データポートのデータ受信時にデータリスナーを設定することで、即時的な音声データ処理を実現しています。
現在のYarbsでは、データリスナーのうちデータ受信の受信バッファへの書き込み時のデータリスナーの設定にのみ対応しています。(datalistenerタグ)
詳細は、後述のサンプルにて説明したいと思います。

サービスポート

RTCにおけるもう一つの入出力としてサービスポートがあります。Yarbsでもサービスポートの自動生成に対応しています。
YAML形式のRTC仕様としては、name, flow, module_name, if_name, if_type_name を必須の項目としています。
通常は、IDLファイルは別に定義するのですが、YarbsではIDLファイルも自動生成するようになっています。declsoperationsがサービスポートで実装する関数になります。Providerに対してのみサービス関数の実装が必要ですので、implタグで実装クラスを定義します。
下記にOpenRTM-aistをインストールした時に同時にインストールされるMyServiceProviderとMyServiceConsumerのサービスポートの設定を示します。
nameは、IDLファイルの interface、 module_nameは、module に対応してます。また、if_nameif_type_nameは、registerProvider関数またはregisterConsumer関数の第1引数、第2引数に対応しています。
serviceport: 
  - name: MyService
    flow: consumer
    module_name: SimpleService
    if_name: myservice0
    if_type_name: MyService
    description: Simple Service Consumer
    decls:
      - typedef sequence<string> EchoList
      - typedef sequence<float> ValueList
    operations:
      - string echo(in string msg)
      - EchoList get_echo_history()
      - void set_value(in float value)
      - float get_value()
      - ValueList get_value_history()
    impl: MyService_impl

上記の例の設定では、C++のソースコードで、
Providerの場合
 RTC::CorbaPort m_MyServicePPort;
 MyService_impl m_MyService_provider;
Consumerの場合
  RTC::CorbaPort m_MyServiceCPort;
  RTC::CorbaConsumer<SimpleService::MyService> m_MyService_consumer;
のように展開されます。
ここで定義した内容のC++、Pythonへの展開は、後述する実装例で説明していきます。

コンフィグレーション

RTCの定義での最後としてコンフィグレーションパラメータの定義を行います。コンフィグレーションパラメータの設定は必須ではありませんが、RTCの振舞いを後から設定するための変数定義の機能です。
コンフィグレーションパラメータの必須項目は、name, default, __type__の3項目です。この他にパラメータの設定を制限する __constraints__、RT SystemEditorのGUIを設定する__widget__があります。Yarbsでは、RTシステムの操作でrtcmdコマンドを使いますので、__widget__は設定しても特に操作等には反映されません。
configuration:
  - name: audio_dir
    default: sounds
    __type__: string
    __widget__: text
    __description__:  Directory for audio_player
  - name: reverse
    default: 0 
    __type__: int
    __widget__: radio
    __constraints__: (0,1)
    __description__:  Reverse flag
以上で、RTCの仕様設計は終了です。ここで定義した文字列に従って、C++またはPythonの実装コードの生成を行うことができます。