コンポーネント開発実習 - OpenRTM-aist

Download Report

Transcript コンポーネント開発実習 - OpenRTM-aist

ロボティクス・メカトロニクス講演会2008
RTミドルウェア
OpenRTM-aist-0.4講習会
日時: 6月5日(木) 10:00-16:00
場所: メルパルク 3F 瑞鳳
2008.06.05 RTミドルウエア講習会
RTミドルウエア講習会
第1部:OMG標準準拠ミドルウェアOpenRTM-aistについて
10:0010:30
担当:安藤慶昭 (産総研)
概要:RTミドルウエアの 新しいリリース OpenRTM-aist-0.4.2の概要について解説します。
第2部:UMLを利用したRTコンポーネントの開発について
10:4512:00
担当:坂本武志(テクノロジックアート)
概要:オブジェクト指向の基本的な考え方,UML2の基本について解説するとともに、UMLモデ
リングツール PatternWeaver for RT-Middlewareを用いたRTコンポーネントの開発方法に
ついて解説します。
第3部:コンポーネント開発実習
13:0016:00
担当:安藤慶昭 (産総研)
概要:OpenRTM-aistでのコンポーネント作成方法を実際に体験していただきます。
2008.06.05 RTミドルウエア講習会
第3部:コンポーネント開発実習
独立行政法人 産業技術総合研究所
知能システム研究部門
タスク・インテリジェンス研究グループ
安藤 慶昭
2008.06.05 RTミドルウエア講習会
概要
•
•
•
•
•
•
•
RTC実装のながれ
コンポーネントの実装
データポート
サービスポート
Configuration
設定ファイル rtc.conf について
WindowsでのRTC作成について
2008.06.05 RTミドルウエア講習会
OpenRTMを使った開発の流れ
ユーザが作った
ライブラリ・クラス
OpenRTM
開発環境
この部分がきちんと
できていることが
非常に大事
RTコンポーネント
分散システム
で利用
2008.06.05 RTミドルウエア講習会
他のシステムで
再利用
OpenRTMを使えば
簡単に分散オブジェ
クトになる。
フレームワークとコアロジック
RT コンポーネント
標 準 インター フェー ス
RT コンポーネント
標 準 インター フェー ス
ス テレオ ビジ ョン
アルゴリズム
左目画像
中身は空
+
右目画像
=
デ プス マップ
RT コンポーネント
フレームワーク
左目画像
右目画像
コアロジック
デ プス マップ
ステ レオ ビジ ョン
RT コンポーネント
RTCフレームワーク+コアロジック=RTコンポーネント
2008.06.05 RTミドルウエア講習会
OpenRTMを使った開発の流れ
どのようなコンポーネントか?
・名前
・データポート
・サービスポート
・コンフィギュレーション
コンポーネント
の仕様
コードの雛型
(C++のクラス)
RtcTemplate
コード生成
コアロジック
RTC開発者が
開発したプログ
ラム資産
コンパイル
.so or DLL
雛型にコアロジック
を埋め込む
マネージャ
(ミドルウエア)
実行
2008.06.05 RTミドルウエア講習会
7
コンポーネント内の状態遷移
0.2.0の状態遷移から変更
ユーザがあまり
意識しなくてよい部分
コンポーネント開発時に
必要な部分
ActiveDo/RTC::onExecuteはここに入る
(DataFlow型のコンポーネントのとき)
2008.06.05 RTミドルウエア講習会
Activity: 0.2.0と0.4.0の対応
0.2.0
0.4.0
処理
rtc_init_entry()
onInitialize
初期化処理
rtc_ready_xxx()
なし
rtc_starting_entry
onActivated
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
rtc_error_exit
なし
rtc_fatal_error_xxx
なし
rtc_exiting_entry
onFinalize
2008.06.05 RTミドルウエア講習会
アクティブ化されるとき1度だけ呼ばれる
アクティブ状態時に周期的に呼ばれる
ERROR状態のときに周期的に呼ばれる
終了時に1度だけ呼ばれる
Activity:その他
onStateUpdate
onExecuteの後毎回呼ばれる
onRateChanged
ExecutionContextのrateが変更されたとき1度だけ呼ばれる
onStartup
ExecutionContextが実行を開始するとき1度だけ呼ばれる
onShutdown
ExecutionContextが実行を停止するとき1度だけ呼ばれる
2008.06.05 RTミドルウエア講習会
InPort
• InPortのテンプレート第2引数:バ
ッファ
– ユーザ定義のバッファが利用
可能
• InPortのメソッド
– read(): InPort バッファから
バインドされた変数へ最新値
を読み込む
– >> : ある変数へ最新値を読
み込む
基本的にOutPortと対になる
データポートの型を
同じにする必要あり
2008.06.05 RTミドルウエア講習会
In P o rt
re a d ()
o p e r at o r >>
最新値
バインドされた変数
リングバ ッファ
例
Sensor Data
Robot
Component
OutPort
• OutPortのテンプレート第2引数:
バッファ
– ユーザ定義のバッファが利用
可能
• OutPortのメソッド
– write(): OutPort バッファへ
バインドされた変数の最新値
として書き込む
– >> : ある変数の内容を最新
値としてリングバッファに書き
込む
基本的にInPortと対になる
データポートの型を
同じにする必要あり
2008.06.05 RTミドルウエア講習会
OutPort
write()
operator<<
最新値
バインドされた変数
リングバッファ
例
Sensor
Component
Sensor Data
データ変数
struct TimedShort
{
Time tm;
short data;
};
struct TimedShortSeq
{
Time tm;
sequence<short> data;
};
• 基本型
• シーケンス型
– data[i]: 添え字によるアクセス
– data.length(i): 長さiを確保
– data.length(): 長さを取得
– tm:時刻
– data: データそのもの
0.2.0では自動で現在時刻を
セットしていたが、0.4.0では
必要に応じて、手動でセット
する必要あり
2008.06.05 RTミドルウエア講習会
•
•
•
データを入れるときにはあらかじめ
長さをセットしなければならない。
CORBAのシーケンス型そのもの
今後変更される可能性あり
データポートコールバック
ファンクタ基底クラス
セット関数
意味
OnWrite
setOnWrite()
バッファに書き込む前に呼ばれる
OnWriteConvert
setOnWriteConvert()
バッファに書き込む前に変換
OnOverflow
set OnOverflow()
オーバーフロー時に呼ばれる
OnRead
setOnRead()
バッファから読み出す前に呼ばれる
OnReadConvert
setOnReadConvert() バッファから読み出すときに変換
OnUnderflow
setOnUnderflow()
バッファがアンダーフロー時に呼ばれる
データポートに入力/出力段階での座標変換などに
利用できる
2008.06.05 RTミドルウエア講習会
データポートコールバックの例
コールバック定義
バッファに書き込まれるとき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乗される。
コンポーネント起動後、初期段階で
データポートコールバックをセット
2008.06.05 RTミドルウエア講習会
サービスポート
用途:他のコンポーネントの提供するサービスを必要なときだけ利用したい時
例:カメラからの画像の取得
サービス用のインターフェース(IDL)を定義する
プロバイダ
• インターフェースの実装
• コンポーネントに組み込む(
宣言)
• Portへのバインド
コンシューマ
• スタブを組み込む
• コンシューマを宣言
• Portへのバインド
rtc-templateでコンポーネントを作れば上記のこ
とをほとんど気にしないで作れる
2008.06.05 RTミドルウエア講習会
Rtc-template実行時の
サービスポートの設定
--service= ポート名:ネーム:type(Interface)
--consumer=ポート名:ネーム:type(Interface)
• ポート名:rtc-linkなどに表示されるポートの名前
• ネーム:コンポーネント内部で用いるオブジェクト名
• Type(Interface名):IDLファイルで定義したInterface名
注意:
Consumer(サービスを利用する方)では、Serviceとネームとtype
を合わせる必要あり。
2008.06.05 RTミドルウエア講習会
サービスポートを使うためのステップ
サービス用のインタフェースを記述した
IDLファイルの作成
使用したいサービスを持つ
IDLファイルを取得
rtc-templateを実行
Rtc-templateを実行
Xxx_impl.cppにサービスの実体を記述
実際にサービスを呼びだしたい部分に
サービスの利用について記述
コンパイル
コンパイル
Provider側
2008.06.05 RTミドルウエア講習会
Consumer側
IDLと実装
IDL(CORBA)定義
interface MyRobot
{
// ゲインをセットする
void setPosCtrlGain(in short 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);
}
/* 中略*/
};
2008.06.05 RTミドルウエア講習会
サービスプロバイダ・コンシューマ
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);
}
MyRobot
Service
Provider
MyRobot
Service
Consumer
Port
2008.06.05 RTミドルウエア講習会
class MyRobotUser
{
private:
// マニピュレータサービスのポートを宣言
RTC::CorbaPort m_port;
// サービスコンシューマのインスタンスを宣言
RTC::CorbaConsumer<MyRobot> m_robot;
public:
any_functions()
{// サービスの利用例
// ゲインをセット
m_robot->setPosCtrlGain(0, 1.0);
// ゲインを表示
std::cout << m_robot->get_pos_ctrl_gain(i) <<
std::endl;
}
}
より詳細な実装については、
サンプルのSimpleServiceを参照
Configuration
• 複数のパラメータを持つ可能性のあるコンポ
ーネントで、動的にパラメータ変更を行うこと
ができる機能
Rtc-template 引数 (--config=[名前]:[型]:[デフォルト値]) で指定
例
--config=int_param0:int:0 --config=double_param0:double:1.1
※これらは”default”という名前のConfigurationSetとしてソースに埋め込まれる
• rtc-link上でConfiguration Setを変更可能
• 詳しくはConfigSampleを参照
2008.06.05 RTミドルウエア講習会
Configurationの実装例
ヘッダ
変数宣言
実装ファイル
先頭部分:spec定義にて
int m_int_param0;
double m_double_param0;
static const char* configsample_spec[] = {
:中略
"conf.default.int_param0", “0",
"conf.default.double_param0", “1.1",
:中略};
istream operator>>が定
義されている型であれば
どんな型でも可能
2008.06.05 RTミドルウエア講習会
onInitialize()にて
bindParameter(“int_param0”, m_int_param0, “0”);
bindParameter(“double_param0”, m_double_param0, “1.1”);
Configuration
rtc-templateで自動的に生
成され埋め込まれる
rtc.confにて
:略
category.component.config_file: comp.conf
:略
comp.confにて
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
2008.06.05 RTミドルウエア講習会
default
名前
値
mode0
名前
値
mode1
名前
値
mode2
名前
値
コンポーネントのconfigファイルで
追加することもできる。
(defaultセット同様ソースに埋め込
むことも可能)
Rtc.confについて
RT Component起動時の登録先NamingServiceや、登録
情報などについて記述するファイル
記述例:
corba.nameservers:localhost:9876
naming.formats:SimpleComponent/%n.rtc
(詳細な記述方法は etc/rtc.conf.sample を参照)
以下のようにすると、コンポーネント起動時に読み込まれ
る
./ConsoleInComp –f rtc.conf
2008.06.05 RTミドルウエア講習会
ネーミングサービス設定
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。
必須の項目
2008.06.05 RTミドルウエア講習会
必須でないOption設定
ログ設定
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内で使えましたが、現在はまだ使えません
。
必須の項目
2008.06.05 RTミドルウエア講習会
必須でないOption設定
その他
corba.endpoint
IP_Addr:Port で指定:NICが複数あるとき、ORBをどちらで
listenさせるかを指定。Portを指定しない場合でも”:”が必要。
例 “corba.endpoint: 192.168.0.12:”
使いたいNICに割り当てら
れているIPアドレス
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
のように指定可能
必須の項目
2008.06.05 RTミドルウエア講習会
必須でないOption設定
Windows用RTCの作成手順
•
対応コンパイラ
– VC2005Express以上
•
rtc-templateでソースを生成
Rtc-templateで
ひな型を作成
(UNIX、Windows共通)
– 共通ソース
•
中身を実装
– RTCのコアロジックを実装する
•
Configurationの取得
中身を実装
– インストールされているRTCのコンフィギ
ュレーション情報
–
rtm_config.vsprops
– ソースと一緒に生成される
copyprops.batを実行すると
%RTM_ROOT%\etc から自動でコピー
される
•
copyprops.bat を実行してもよい
ビルド
– ソリューションを開きビルドする
•
システムのconfigurationを取得
(rtm_config.vsprops)
生成物
– スタンドアロンRTC (???Comp.exe)
– ローダブルモジュール(???.dll)
2008.06.05 RTミドルウエア講習会
RTコンポーネント
スタンドアロンRTC(EXE)
ローダブルモジュール(DLL)
ができる
再配布可能なコンポーネント
作成のために
• 環境依存の情報をプロジェクトファイルに埋め込まない
• プロパティシートを使用する
– rtc-templateがuser_config.vspropsとして生成する
– 環境依存の情報はプロパティシートにくくりだす
– USBCameraのサンプルを参照
• プロパティシート:user_config.vsprops
• 環境変数
–
–
–
–
必要最小限にすべきだが、以下のものは前提としてもよい
RTM_ROOT
ACE_ROOT
OMNI_ROOT
2008.06.05 RTミドルウエア講習会
まとめ
•
•
•
•
•
•
•
RTC実装のながれ
コンポーネントの実装
データポート
サービスポート
Configuration
設定ファイル rtc.conf について
WindowsでのRTC作成について
2008.06.05 RTミドルウエア講習会