このページではRT-Componentは以下RTCと呼ぶことにします.
RTMの使用方法はOpenRTM-aist Official Web Siteを参照してください.
アナタのはてな『?』をここへ書いてください
onInitialize | 初期化処理 (一度だけ実行される) |
onActivated | アクティブ化されるとき1度だけ呼ばれる |
onExecute | アクティブ状態時に周期的に呼ばれる |
onDeactivated | 非アクティブ化の時に1度だけ呼ばれる |
onAborting | ERROR状態に入る前に1度だけ呼ばれる |
onReset | エラー状態からリセットされ,非アクティブ状態に移行する時に1度だけ呼ばれる |
onError | ERROR状態のときに周期的に呼ばれる |
onFinalize | 終了時に1度だけ呼ばれる |
OpenRTM-aist-0.2.0のときのデータポートについて記載しておく.
OpenRTM-aist-0.4.*ではデータポートについての詳細情報がないため同様と思われる.
(よく読んでないだけかもしれない・・・)
OpenRTM-aist-0.2.0のデータポート
TimedShort? | タイムスタンプつき符号付Short Int 型 |
TimedLong? | タイムスタンプつき符号付Long Int 型 |
TimedUShort | タイムスタンプつき符号なしShort Int 型 |
TimedULong | タイムスタンプつき符号なしLong Int 型 |
TimedFloat? | タイムスタンプつきFloat 型 |
TimedDouble? | タイムスタンプつきDouble 型 |
TimedChar? | タイムスタンプつきChar 型 |
TimedBoolean? | タイムスタンプつきBoolean 型 |
TimedOctet? | タイムスタンプつきOctet 型 |
TimedString? | タイムスタンプつきString 型 |
TimedShortSeq? | タイムスタンプつき符号付Short Int シーケンス型 |
TimedLongSeq? | タイムスタンプつき符号付Long Int シーケンス型 |
TimedUShortSeq? | タイムスタンプつき符号なしShort Int シーケンス型 |
TimedULongSeq? | タイムスタンプつき符号なしLong Int シーケンス型 |
TimedFloatSeq? | タイムスタンプつきFloat シーケンス型 |
TimedDoubleSeq? | タイムスタンプつきDouble シーケンス型 |
TimedCharSeq? | タイムスタンプつきChar シーケンス型 |
TimedBooleanSeq? | タイムスタンプつきBoolean シーケンス型 |
TimedOctetSeq? | タイムスタンプつきOctet シーケンス型 |
TimedStringSeq? | タイムスタンプつきString シーケンス型 |
問題内容:OpenRTM0.4.2をソースからインストールした場合に、公式サイトに載っている「コンポーネントのスケルトンの作成」ができない。
CUIを用いてコンポーネントの雛形が作成されない場合,OpenRTMのインストールが失敗している可能性があります.
特に,ソースコードからインストールされたとのことなので,OpenRTMを使用するために必要なパッケージはインストール済みでしょうか?
buildのディレクトリの中にあるシェルスクリプトからもう一度必要なパッケージを入れて,再度コンパイルをしてみてください.
サンプルが実行できる状態でこの問題に当たっているということであれば別途対処が必要になりますが...
質問内容:データポートってのは、RTMにおける変数の型みたいなものと解釈してよいのでしょうか?
OpenRTM-aistはCORBAで実装されており,CORBA経由で変換可能な型として上記のものを定義しているそうです.
データポートの型としては上記のものを使用することができると思います.
ソースコードを記述する際には一般的な変数型を使用することができますが,データポートに値を格納する際には型の一致を意識する必要はあると思います.
rtc-templateではデータポートに必要な宣言は既に記述された状態で雛形を生成します.
データポートは複数持つことができ,各々名前をつけることができます.
外部のコンポーネントはその名前によりデータポートを特定します.
一応ユーザ独自の型も作ることは可能だそうです.
質問内容:データポートはみんなタイムスタンプが付いているようですが、
タイムスタンプが付いている意味はなにかあるんですか?
現在のOpenRTMではリアルタイム性が保証されていないと聞いています.
タイムスタンプはデータの生成時刻が記述されるそうで,データの鮮度を見ることができるようです.
明確な使用方法は記載されていないので,わかり次第お伝えしていきたいと思います.
※リアルタイム性:定められた時間要件を満たして動作する性質
スケルトン作成スクリプトgen.sh
#!/bin/sh rtc-template -bcxx \ --module-name=SamplePD --module-desc='SamplePD component' \ --module-version=0.1 --module-vendor=AIST --module-category=Generic \ --module-comp-type=DataFlowComponent --module-act-type=SPORADIC \ --module-max-inst=1 \ --inport=angle:TimedDoubleSeq --outport=torque:TimedDoubleSeq
を実行するとエラーが出る。
解決策1
rtc-templateの中でrtc-configを呼んでいる部分があるので、
そこの部分でrtc-configのパスを書いて追加してあげればよい。
例えばこのように書く。rtm_path_root="OPENRTMのホームディレクトリ" libdir_path = os.popen(rtm_path_root + "/bin/" + "rtm-config --libdir", "r").read()
解決策2
rtc-templateの存在するディレクトリにパスを通す
そうすればrtc-templateを書き換える必要は無い
buildディレクトリの下のfedora用スクリプトでインストールすれば問題ない。
Fedora6用のRTMのパッケージを落としてインストールしようとしたら、
aceの依存関係ではじかれた。
その上aceのFedora用パッケージが見つからない。
1, ubuntuのaceパッケージlibace.devを落とす
2, ubuntuのrtmパッケージをおとす
3, alienコマンドでrpmパッケージに変換する
4, インストール
# rpm -ivh パッケージ名
5, 理由は不明だが~
シンボリックリンクlibace.soのリンク先が見当たらないので
Ubuntuの入っているPCからコピーする。
6, その他エラーがでる場合には、それぞれ潰していく
エラー文を読めばきっと分かる
やってみた感想:きっとソースでやる方がお利口、でも為せばなるんだなあ
RTCのPortにconnectをする際に,
そのポート自身のオブジェクトリファレンスのみ
をConnectorProfile?にセットしてconnectする.
そうすると、戻ってきたConnectorProfile?::propertiesの中に、
port.[Service Type].[Service Name]
というキーでCORBA::Any型でオブジェクトリファレンスが入っている.
それを、使用したいサービスの型にnarrowすればいいらしい.
サンプルの掲載はもうしばらくお待ちください.
OpenRTM 0.4.2をデフォルトの場所以外にインストールした場合の問題点
解決例
12月初め頃
TimedChar?型およびTimedCharSeq?型を廃止する方向で動いているらしい.
使用している場合は注意.
ちなみに,使用できなくなるわけではなく,自分で記述すれば使用可能.