ソフトウェア関連 >> 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コンポーネントで使用したデータポートの一例です。
''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)となります。
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ファイルも自動生成するようになっています。''decls''と''operations''がサービスポートで実装する関数になります。Providerに対してのみサービス関数の実装が必要ですので、''impl''タグで実装クラスを定義します。
下記にOpenRTM-aistをインストールした時に同時にインストールされるMyServiceProviderとMyServiceConsumerのサービスポートの設定を示します。
''name''は、IDLファイルの interface、 ''module_name''は、module に対応してます。また、''if_name''と''if_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の場合''
''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の実装コードの生成を行うことができます。