Presentation is loading. Please wait.

Presentation is loading. Please wait.

ROBOMEC2007チュートリアル RTミドルウエア講習会

Similar presentations


Presentation on theme: "ROBOMEC2007チュートリアル RTミドルウエア講習会"— Presentation transcript:

1 ROBOMEC2007チュートリアル RTミドルウエア講習会
日時:2007年5月10日 13:30~17:30 場所:ホテル メトロポリタン秋田 4F きりの間

2 RTミドルウエア講習会 第1部:OMG標準準拠ミドルウェアOpenRTM-aist-0.4.0について
13:30-13:50  第1部:OMG標準準拠ミドルウェアOpenRTM-aist-0.4.0について 担当:安藤慶昭 (産総研) 概要:2006年11月にOMG (Object Management Group) で採択された RTコンポーネント標準仕様のおよび、 これに準拠したRTミドルウエアの 新しいリリース OpenRTM-aist-0.4.0の概要を解説します。 14:00-15:00  第2部:OpenRTM-aist-0.4.0の環境構築 担当:安藤慶昭(産総研) 概要:OpenRTM-aist の環境構築方法や、 サンプルコンポーネントの実行操作ツールRtcLinkによる 基本的な操作方法について実習形式で解説します。 15:15-16:15  第3部:RTミドルウェアの各種ツール群について 担当:坂本武志(テクノロジックアート) 概要:OpenRTM-aist に付属するテンプレートコードジェネレータ rtc-template を拡張した統合開発環境のインストール方法、基本的操作方法、 および、UMLモデリングツールPatternWeaverを使った、新しいコンポーネント 開発方法について解説します。 16:30-17:30  第4部:OpenRTM-aist-0.4.0の使い方 概要:実際に簡単なコンポーネントを参加者に作成していただき、 OpenRTM-aistによるコンポーネント開発を体験していただきます。

3 独立行政法人 産業技術総合研究所 知能システム研究部門 タスク・インテリジェンス研究グループ 安藤 慶昭
第2部 OpenRTM-aist-0.4.0の     使い方 独立行政法人 産業技術総合研究所 知能システム研究部門 タスク・インテリジェンス研究グループ 安藤 慶昭 3

4 概要 設定ファイル rtc.conf について コンポーネントの実装 データポート サービスポート Configuration
Activity データポート サービスポート Configuration

5 Rtc.confについて 詳細は etc/rtc.conf.sample を参照 ネームサービス(corba.nameservers)
名前のフォーマット(naming.formats) ネーミング自動update(naming.update.*) ログファイル名(logger.file_name) ログレベル(logger.log_level) CORBAエンドポイント指定(corba.endpoint) ORB固有の引数(corba.args)

6 ネーミングサービス設定 corba.nameservers
host_name:port_numberで指定、デフォルトポートは2809(omniORBのデフォルト)、複数指定可能 naming.formats %h.host_cxt/%n.rtc →host.host_cxt/MyComp.rtc 複数指定可能、0.2.0互換にしたければ、 %h.host_cxt/%M.mgr_cxt/%c.cat_cxt/%m.mod_cxt/%n.rtc naming.update.enable “YES” or “NO”: ネーミングサービスへの登録の自動アップデート。コンポーネント起動後にネームサービスが起動したときに、再度名前を登録する。 naming.update.interval アップデートの周期[s]。デフォルトは10秒。 timer.enable “YES” or “NO”: マネージャタイマ有効・無効。naming.updateを使用するには有効でなければならない timer.tick タイマの分解能[s]。デフォルトは100ms。

7 ログ設定 logger.enable “YES” or “NO”: ログ出力を有効・無効 logger.file_name ログファイル名。
%h:ホスト名、%M:マネージャ名,%p:プロセスID 使用可 logger.date_format 日付フォーマット。strftime(3)の表記法に準拠。 デフォルト:%b %d %H:%M:%S → Apr 24 01:02:04 logger.log_level ログレベル: SILENT, ERROR, WARN, NORMAL, INFO, DEBUG, TRACE, VERBOSE, PARANOID SILENT:何も出力しない PARANOID:全て出力する ※以前はRTC内で使えましたが、現在はまだ使えません。

8 その他 corba.endpoint IP_Addr:Port で指定:NICが複数あるとき、ORBをどちらでlistenさせるかを指定。Portを指定しない場合でも”:”が必要。 例 “corba.endpoint: :” NICが2つある場合必ず指定。 (指定しなくても偶然正常に動作することもあるが念のため。) corba.args CORBAに対する引数。詳細はomniORBのマニュアル参照。 [カテゴリ名]. [コンポーネント名]. config_file または [インスタンス名]. config_file コンポーネントの設定ファイル カテゴリ名:manipulator, コンポーネント名:myarm, インスタンス名myarm0,1,2,… の場合 manipulator.myarm.config_file: arm.conf manipulator.myarm0.config.file: arm0.conf のように指定可能

9 コーディング例 ヘッダ部分 基底クラス DataFlowComponentBase をpublic継承 各状態の挙動を定義(オーバーライド)
デフォルトではonInitialize以外コメントアウトされている 必要の無い状態のメソッドは定義しなくともよい InPort OutPort宣言は自動生成 ServiceProvider・Consumerは自動生成 Configuration宣言は自動生成 class MyManipulator : public RTM::RtcBase { public: MyManipulator(RTC::Manager* manager); virtual ReturnCode_t onInitialize(); : // InPort/OutPortの宣言 TimedFloatSeq m_posin; InPort<TimedFloatSeq> m_posinIn; TimedFloatSeq m_posout; OutPort<TimedFloatSeq> m_posoutOut; };

10 コーディング例 実装部分 状態 戻り値: により、状態遷移する onXXXX が各状態および遷移において実行される。 RTC::RTC_OK
RTC::RTC_ERROR   により、状態遷移する virtual ReturnCode_t MyComponent::onExecute() { m_posinIn.read(); // InPort からデータ読み込み if (m_posin.data.length() == 6) // チェック double pos[6]; for (int i = 0; i < 6; i++) pos[i] = m_posin.data[i]; } m_arm.setPos(pos); // pos をセット m_arm.getPos(pos); // pos を取得 m_posout.data.length(6); // データ長をセット m_posout.data[i] = pos[i]; // データをセット m_posoutOut.write(); // OutPortへ書き出し return RTM_OK;

11 新しい状態遷移

12 Activity: 0.2.0と0.4.0の対応 0.2.0 0.4.0 処理 rtc_init_entry() onInitialize
初期化処理 rtc_ready_xxx() なし rtc_starting_entry onActivated アクティブ化されるとき1度だけ呼ばれる rtc_active_entry rtc_active_do onExecute アクティブ状態時に周期的に呼ばれる rtc_active_exit rtc_stopping_entry onDeactivated 非アクティブ化されるとき1度だけ呼ばれる rtc_aborting_entry onAborting ERROR状態に入る前に1度だけ呼ばれる onReset resetされる時に1度だけ呼ばれる rtc_error_entry rtc_error_do onError ERROR状態のときに周期的に呼ばれる rtc_error_exit rtc_fatal_error_xxx rtc_exiting_entry onFinalize 終了時に1度だけ呼ばれる

13 Activity:その他 onStateUpdate onExecuteの後毎回呼ばれる onRateChanged
ExecutionContextのrateが変更されたとき1度だけ呼ばれる onStartup ExecutionContextが実行を開始するとき1度だけ呼ばれる onShutdown ExecutionContextが実行を停止するとき1度だけ呼ばれる

14 InPort InPortのテンプレート第2引数:バッファ InPortのメソッド ユーザ定義のバッファが利用可能
read(): InPort バッファからバインドされた変数へ最新値を読み込む >> : ある変数へ最新値を読み込む

15 OutPort OutPortのテンプレート第2引数:バッファ OutPortのメソッド ユーザ定義のバッファが利用可能
write(): OutPort バッファへバインドされた変数の最新値として書き込む >> : ある変数の内容を最新値としてリングバッファに書き込む

16 データ変数 シーケンス型 基本型 data[i]: 添え字によるアクセス tm:時刻 data.length(i): 長さiを確保
struct TimedShort { Time tm; short data; }; struct TimedShort { Time tm; sequence<short> data; }; シーケンス型 data[i]: 添え字によるアクセス data.length(i): 長さiを確保 data.length(): 長さを取得 データを入れるときにはあらかじめ長さをセットしなければならない。 CORBAのシーケンス型そのもの 今後変更される可能性あり 基本型 tm:時刻 data: データそのもの

17 データポートコールバック ファンクタ基底クラス セット関数 意味 OnWrite setOnWrite() バッファに書き込む前に呼ばれる
OnWriteConvert setOnWriteConvert() バッファに書き込む前に変換 OnOverflow set OnOverflow() オーバーフロー時に呼ばれる OnRead setOnRead() バッファから読み出す前に呼ばれる OnReadConvert setOnReadConvert() バッファから読み出すときに変換 OnUnderflow setOnUnderflow() バッファがアンダーフロー時に呼ばれる コールバック定義 バッファに書き込まれるとき2乗するファンクタ class OnWritePow : public RTC::OnWriteConvert<double> { double operator()(const double& value) return value * value; }; コールバック設定 InPortにOnWriteを設定 <ヘッダ> class MyComp { OnWirePow m_powf }; <実装> ReturnCode_t MyComp::onInitialize() { m_InPort.setOnWriteConvert(m_powf); InPortに書き込まれるとき自動的に2乗される。

18 サービス用のインターフェース(IDL)を定義する
サービスポート サービス用のインターフェース(IDL)を定義する プロバイダ インターフェースの実装 コンポーネントに組み込む(宣言) Portへのバインド コンシューマ スタブを組み込む コンシューマを宣言 Portへのバインド

19 IDLと実装 IDL(CORBA)定義 サービス実装(雛形はrtc-templateによる自動生成) interface MyRobot {
// ゲインをセットする void setPosCtrlGain(in int axis, in double gain); // ゲインを取得する double getPosCtrlGain(in int axis); }; サービス実装(雛形はrtc-templateによる自動生成) class MyRobot_impl { /* この例ではm_robo はロボットを実際に制御する * クラスのインスタンスであると仮定する. */ void setPosCtrlGain(const int axis, const double gain) // 位置制御ゲインを設定 m_robo.set_pos_ctrl_gain(axis, gain); } /* 中略*/ };

20 サービスプロバイダ・コンシューマ class MyRoboComponent { private:
// MyRobot サービスのポートを宣言 RTC::CorbaPort m_port; // MyRobot サービスのインスタンスを宣言 MyRobot_impl m_robot; public: ManipulatorComponent(Manager manager) // ポートにサービスを登録 m_port.registerProvider("Robo0", "MyRobot", m_robot); // ポートをコンポーネントに登録 registerPort(m_port); } class MyRobotUser { private: // マニピュレータサービスのポートを宣言 RTC::CorbaPort m_port; // サービスコンシューマのインスタンスを宣言 RTC::CorbaConsumer<MyRobot> m_robot; public: any_functions() {// サービスの利用例 // ゲインをセット m_robot->set_pos_ctrl_gain(0, 1.0); // ゲインを表示 std::cout << m_robot->get_pos_ctrl_gain(i) << std::endl; } MyRobot Service Provider Consumer Port

21 Configuration Rtc-template 引数 (--config=[名前]:[型]:[デフォルト値]) で指定 例
--config=int_param0:int:0 --config=double_param0:double:1.1 ※これらは”default”という名前のConfigurationSetとしてソースに埋め込まれる ヘッダ 変数宣言 int m_int_param0; double m_double_param0; 実装ファイル 先頭部分:spec定義にて static const char* configsample_spec[] = { :中略 "conf.default.int_param0", “0", "conf.default.double_param0", “1.1", :中略}; onInitialize()にて bindParameter(“int_param0”, m_int_param0, “0”); bindParameter(“double_param0”, m_double_param0, “1.1”); istream operator>>が定義されている型であればどんな型でも可能 example/ConfigSample を参照

22 Configuration rtc-templateで自動的に生成され埋め込まれる rtc.confにて : 略
category.component.config_file: comp.conf :略 名前 default 名前 mode0 comp.confにて 名前 mode1 conf.mode0.int_param0: 2 conf.mode0.double_param0: 3.14 conf.mode1.int_param0:3 conf.mode1.double_param0: 6.28 conf.mode2.int_param0:4 conf.mode2.double_param0: 12.56 名前 mode2 コンポーネントのconfigファイルで追加することもできる。 (defaultセット同様ソースに埋め込むことも可能)

23 まとめ 設定ファイル rtc.conf について コンポーネントの実装 データポート サービスポート Configuration
詳細はWebかクラスリファレンスを参照のこと

24 corba.nameservers:localhost:9876, 192.168.11.70
naming.formats: [ご自分のお名前]/%n.rtc


Download ppt "ROBOMEC2007チュートリアル RTミドルウエア講習会"

Similar presentations


Ads by Google