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

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

1 C++ における OOP を用いた 書き方講座 H 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
RT ミドルウエア講習会 実習に参加される方へ ネットワークは外部にも接続できます。 有線・無線とも利用可能ですが、有線接続推奨です。 ホスト PC の Firewall は OFF にしておいてください。 OpenRTM のページを開いておいてください –
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
ROBOMEC2007チュートリアル RTミドルウエア講習会
Visual Studio 2005による XML Web サービス入門
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
S2Container.NET, S2Dao.NET コミッタ 藤井 宏明
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
第13回構造体.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
RTミドルウェアによるシステムの構築 現在,RTミドルウェアの利用が進んでいる ⇒機能要素のRTコンポーネント化を行うことで
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとデータ構造 2011年6月13日
アルゴリズムとプログラミング (Algorithms and Programming)
社会人学習講座 「Javaプログラミング概論」
JSFによるWebアプリケーション開発 第6回
第20章 Flyweight ~同じものを共有して無駄をなくす~
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
DAQ-Middleware の新機能 コンポーネント制御機能
チーム FSEL 立命館大学情報理工学部 ソフトウェア基礎技術研究室
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
関数の定義.
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Java Bytecode Modification and Applet Security
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
ソフトウェア制作論 平成30年11月21日.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
フロントエンドとバックエンドのインターフェース
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
アルゴリズムとデータ構造 2012年6月11日
高度プログラミング演習 (11).
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラム分散化のための アスペクト指向言語
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
KEK素核研 エレクトロニクスシステムGr. 仲吉一男
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
マルチメディア向けグラフィカル統合開発環境「Max」と RTC を繋ぐブリッジプラグインの開発 佐々木一磨(早大)
ソフトウェア工学 知能情報学部 新田直也.
フレンド関数とフレンド演算子.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
Presentation transcript:

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

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-0.4.0 の環境構築方法や、 サンプルコンポーネントの実行操作ツールRtcLinkによる 基本的な操作方法について実習形式で解説します。 15:15-16:15  第3部:RTミドルウェアの各種ツール群について 担当:坂本武志(テクノロジックアート) 概要:OpenRTM-aist-0.4.0 に付属するテンプレートコードジェネレータ rtc-template を拡張した統合開発環境のインストール方法、基本的操作方法、 および、UMLモデリングツールPatternWeaverを使った、新しいコンポーネント 開発方法について解説します。 16:30-17:30  第4部:OpenRTM-aist-0.4.0の使い方 概要:実際に簡単なコンポーネントを参加者に作成していただき、 OpenRTM-aistによるコンポーネント開発を体験していただきます。

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

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

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)

ネーミングサービス設定 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。

ログ設定 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内で使えましたが、現在はまだ使えません。

その他 corba.endpoint IP_Addr:Port で指定:NICが複数あるとき、ORBをどちらでlistenさせるかを指定。Portを指定しない場合でも”:”が必要。 例 “corba.endpoint: 192.168.0.12:” 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 のように指定可能

コーディング例 ヘッダ部分 基底クラス 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; 略 };

コーディング例 実装部分 状態 戻り値: により、状態遷移する 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;

新しい状態遷移

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度だけ呼ばれる

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

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

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

データ変数 シーケンス型 基本型 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: データそのもの

データポートコールバック ファンクタ基底クラス セット関数 意味 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乗される。

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

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); } /* 中略*/ };

サービスプロバイダ・コンシューマ 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

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 を参照

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セット同様ソースに埋め込むことも可能)

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

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