忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[395]  [394]  [393]  [392]  [391]  [390]  [389]  [388]  [387]  [386]  [385
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

今回も書くことなし。
ひょっとしたら10月中旬ぐらいまで誰も投稿しないのではないかと思い始めました。
そもそも10月31日締め切りが早いですし。



今回はコンポーネントオブザーバについて書いておきます。
コンポーネントオブザーバは外部からRTCの状態を監視する際に使用します。
別に周期的に外部ツールでRTCの状態を取得する方法を取ることもできますが、コンポーネントオブザーバを使用した場合RTC側から状態が変化したときにオブザーバに通知します。


コンポーネントオブザーバに関してはほとんど情報がなく、このサイトで取り上げているぐらいしか見つかりませんでした。


とりあえずPython版のサンプルで実験してみようかと思いますが、

C:\Python26\Lib\site-packages\OpenRTM_aist\ext\sdo\observer

にサンプルがあるはずなのですがComponentObserverConsumer.pyはあるのに何故かComponentObserverProvider.pyは存在しません。皆さんの環境ではどうなっているでしょうか?

とりあえずOpenRTM-aistのサイトからダウンロードできるソースコードには含まれていますのでそれをダウンロードしてください。

そして解凍したフォルダの、

OpenRTM-aist-Python-1.1.0\OpenRTM_aist\ext\sdo\observer
OpenRTM-aist-Python-1.1.0\OpenRTM_aist\ext\sdo\observer\test

のsetup.batを実行してください。



次にCOCTestRTC.pyを実行します。
するとCOCTestRTCというRTCが起動するのでこのRTCの監視を行います。


次にtestフォルダのComponentObserverProvider.pyを起動するわけですがConsoleIn0という名前のRTCを監視するようになっているので、43行目のConsoleIn0をCOCTestRTC0に変更してください。変更後ComponentObserverProvider.pyを実行してください。


その後COCTestRTCをActiveにしてみたりDeactiveにしてみたり、あるいは数値を入力せずにエンターキーを押す等してError状態にしてみたりいろいろやってみてください。



heartbeatはRTCが生存していると周期的に送信されるようです。

次にどのように使用するかを見てみます。
まずはrtc.confを見てみます。


manager.modules.load_path:  .
manager.modules.preload: ComponentObserverConsumer



ComponentObserverConsumer.pyをあらかじめ読み込んでおきます。
するとComponentObserverConsumer.pyのComponentObserverConsumerInitが実行されます。ComponentObserverConsumerのinit関数でself._rtobjにRTCオブジェクトを入力して、self._rtobj.addPostComponentActionListenerで状態変化のリスナを設定していると思いますがよくわかりません。
多分、ComponentObserverConsumerのupdateStatus関数で

self._observer._ptr().update_status(statuskind, msg)

とすることでComponentObserverProviderのComponentObserver_iのupdate_status関数の処理が実行されて状態を取得できるのだとは思います。
とりあえずインターフェースComponentObserverを使って状態を通知しているみたいです。

次にComponentObserverProvider.pyを見てみます。
ComponentObserver_iのupdate_status関数で状態変化時の処理を行っています。

以下でheartbeatの通知の有無、heartbeatの周期、監視する状態の指定は以下のコードで記述しているようです。

properties = [OpenRTM_aist.NVUtil.newNV("heartbeat.enable","YES"),
                OpenRTM_aist.NVUtil.newNV("heartbeat.interval","10"),
                OpenRTM_aist.NVUtil.newNV("observed_status","ALL")]





とりあえず、どのように使用するかをまとめると、
  1. rtc.confの変更する
  2. ComponentObserverProvider.pyのComponentObserver_iのように状態変化時の処理を実装する
  3. 必要な数だけComponentObserver_iを生成して各RTCと接続する
という感じなのかなあ?
詳しい資料が見つからないので詳しい人は教えてください。




RTCのプログラミングに関してもあまり書くことがなくなってきたなあ。
今回のサンプルプログラムを見ていてそういえば実行コンテキストのコールバックに関してまだ書いたことなかったなと思ったので明日はそれを書きます。
その次からは、
  • manager
  • サービスポート
  • omniORB
に関する事で埋めたいとは思いますがネタ切れが近いです。







にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フリーエリア
最新CM
[08/31 ysuga]
[08/31 Nobu]
[08/31 ysuga]
[12/11 Nobu]
[12/11 Kanamura]
最新TB
プロフィール
HN:
Nobu
年齢:
36
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]