コンフィグ機能とは,実行中のRTコンポーネントに数値などのパラメータを設定し,コンポーネントの動作を調整するための機能です.
たとえばモータ制御をするRTCの場合は,比例ゲインなどの制御パラメータを,また画像処理のRTCならば2値化するときの閾値などをコンフィグレーションにすると便利です.
RTコンポーネントに数値を設定する場合は,コンフィグだけでなく,データポートを使うこともできますが,コンフィグ機能はデータポートよりももっと低い頻度でのデータのやり取りを前提としており,またrtc.confなどの設定ファイルからのインポート機能も持っています.
第1回のRTC Builderの設定をインポートする
第1回のRTC Builderの設定がRTC.xmlというファイルに残っています.これをインポートして手間を省きましょう.
EclipseからRTC Builderを開き,RTC Builder Editorを開きます.
基本タブからプロファイル情報のインポート・エクスポートを選び,インポートボタンをクリック!
PeriodicConsoleOutのプロジェクトフォルダからRTC.xmlファイルを選択してインポートします.
これで前回の設定が復活です.
コンフィグレーション変数の設定
「コンフィギュレーション」タグを選択し,「RT Component Configuration Parameter
Definitions」という欄の右にある「Add」ボタンをクリックして項目を追加.表を編集します.
- Name ・・・ コンフィグ変数の名前です.コード上の変数名とは違い,RT System
Editor上などで使う名前です.わかりやすいものを使います.「value」 - Type ・・・ コンフィグのタイプ.std::stringなどが選べますが,今回は「int」
- Default Value ・・・ 初期値.「0」とします.
次に下にスクロールし,Detail(詳細)のメニューにデータを打ち込んでいきます.
- 変数名・・・ソースコード上での変数名です.ここで設定した名前に「m_」の接頭辞が付きます.ここでは「param_value」としますので,変数名は「m_param_value」になります.
- 単位・・・単位を設定できます.代表的なところで「m (メートル)」とか「Hz (ヘルツ)」などです.ここでは空欄で.
- 制約条件・・・最大値や取りうる値などの設定ができるようです.ここでは変更不要です.
- Widget・・・パラメータ変更につかうウィジェット(インターフェース)の設定です.スピンボタンやスライダーを選択できます.ここではtextで.
コード生成・・・だけど
ここでコードを生成しようとすると,このEclipse上にあるコードを上書きしようとします.
でも大丈夫.ここで一応,上書き確認&バージョン変更のチェックダイアログが入ります.
ダイアログは図のように比較エディターになっており,Original「元のファイルを保持」,Merge「RTC Builderが生成した部分のみ最新に」,Generate「最新のファイルで上書き」を選びますが,基本的にGenerateを使います.Mergeは一見うまくいくようで,まだバグが残っていて,コンフィグレーションなど新しい機能をRTC Builderで追加したときにウマく動きません.
新しいファイルを生成しても,古いファイルには○○.cpp20090724などファイル名を書きかえられて残っていますから,こちらからデータをコピーしてくることにします.
*基本的にRTCのコード上にはロジックを書かずに,機能を持ったクラスを作成して,それの初期化等のみで済むようにコードを記述します.
コードの記述
新しくコンフィグレーションを追加したことで,onInitialize関数が追加されています.
ただ,このonInitialize部分はあまり弄る必要はありません.
次のようにイベント・ハンドラを記述します.
RTC::ReturnCode_t PeriodicConsoleOut::onExecute(RTC::UniqueId ec_id) { std::cout << "Value = " << m_param_value << std::endl; return RTC::RTC_OK; } |
RTC Builderで設定したコード上のコンフィグレーション変数名を使えます.今回はこれだけ.
protected ReturnCode_t onExecute(int ec_id) { System.out.println("Value = " + m_param_value.value); return super.onExecute(ec_id); } |
Javaの場合はIntegerHolderというクラス変数を使うので,valueというメンバにデータの本体が入っています.
hogeというコンフィグレーションを設定すれば,m_hoge.valueでアクセスできるというわけです.
onExecuteをこのように書き換えてみましょう.
def onExecute(self, ec_id): print "Param is %d" % (self._param_value[0]) return RTC.RTC_OK |
変数名を”param_value”と設定しましたが,実際は_param_valueという変数名になっています.これはリストになっているので,ゼロ番目の要素を選択すると,所望のデータを取り出すことが出来ます.
rtc.conf
前回の変更でrtc.confが変更されていたのですが,再度確認する方がいいです.まずは「corba.nameservers:
localhost」が設定されているでしょうか.
またrtc.confには,コンフィギュレーションを保存するためのファイルを指定するオプションが付きました.この例では,「Test.PeriodicConsoleOut.config_file:PeriodicConsoleOut.conf」という記述が追加されています.
この設定により,PeriodicConsoleOutというRTCのコンフィグは,PeriodicConsoleOut.confに保存される,と設定されています.
構文は
「カテゴリ名」.「コンポーネント名(もしくはインスタンス名)」.config_file:
コンフィグファイル名
となっております.カテゴリ名とは,RTCBuilderでスケルトンを作成したときに指定したカテゴリ名で,この例では「Test」です.
PeriodicConsoleOut.confに,
conf.default.param : 12
のように設定すれば,デフォルトの設定値がかわります.これは知っておくと便利です.
RTCの実行
RTCの実行はこれまで通りです.ネームサーバーの起動,Eclipseの起動,RT System Editorを起動してネームサーバを登録,RTCを実行.RT System Editorの下方にある「Configuration View」を使います.
まずは変更したいRTコンポーネントをSystem Editor上で選択して,下図のような選択状態にします.すると,Configuration
Viewに現在のRTCのコンフィグレーションが表示されます.
「編集」ボタンをクリックしてダイアログを開き,「value」の値を変更します.
右下の「Apply」を選択すると,ダイアログでOKした後に即座にコンフィグレーションが変更されます.コンポーネントがアクティブ状態の場合は,アクティブなコンフィグレーションセットが変更されました,とのダイアログが表示されます.OKすると変更されます.
またあとで元の画面で適用(Apply)をクリックしても新しいコンフィグレーションが適用されます.
下図のように表示されるValueが変更されているのが分かります.
まとめ
コンフィグには後述するポートのように,読み込む作業などが要らない手軽さがあります.基本的にRT System Editorなどのツールから変更することを前提にしている機能で,頻繁な書き換えには不便ですが,実装が手軽でわかりやすくなるので,モータコントローラのゲイン設定や,ファイルアクセスするコンポーネントのファイル名などに使うと良いでしょう.
コンフィグ機能を使いこなせば,コンパイルすることなしにRTCの振る舞いを制御できます.またアプリケーションごとに再利用したRTCの設定を変更することで,RTCの適用範囲を大幅に向上できます.
今回のファイル:
PeriodicConsoleOutR_v10
PeriodicConsoleOutJavaR
PeriodicConsoleOutPyR