忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[27]  [28]  [29]  [30]  [31]  [32]  [33]  [34]  [35]  [36]  [37
×

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

どうもお久しぶりです。
なぜか書く気がしなくて放置してしまいました。

OpenRTM-aistのML

ECに関しては、リアルタイムなものだけでなく、並列実行されたり、実行順序を条件
によって変えたり、一部並列化するなど、用途に応じていろいろなモノが考えられるので、
そういったものがいろいろ出てくるといい

という意見があったようなのでそれらしきものを作ってみました。



この実行コンテキストでできることは、
  • 関連付けした各RTCのロジックを順序通りに実行
  • 各RTCの状態で実行順序を動的に変更
です。

今回作成した実行コンテキストのマニュアルはここか読めます。
実行コンテキストのダウンロードもマニュアルのリンクから行ってください。

使用方法ですが、rtc.confで
exec_cxt.periodic.type: MultipleOrderedEC
manager.modules.preload: MultipleOrderedEC.dll

のように記述してMultipleOrderedECを実行コンテキストに設定します。
詳しいことはマニュアルを読んでください。

さらに、使用したいRTCと実行コンテキストを関連付けします。

RT System EditorからRTCを関連付けるか、Pythonなどでadd_component()と記述してRTCを関連付けるか、またはMPExecutionContextを実行コンテキストに指定したマネージャを立ち上げて複合コンポーネントを作成するなどの方法があると思います。

あとはGUIから順序を設定します。

 

上の例ではTest10とTest30を直列に実行して、さらにTest20を並列に実行しています。

灰色、緑、紫のブロックを追加ボタンで追加できます。
さらに一番下の追加ボタンで他のパターンの順序を増やせます。

どのパターンを実行するかは隣のタブから設定できます。



各コンポーネントの状態で設定できます。


実行順序の編集はGUIからだけではなくテキストからでも出来ます。
軽量版は基本的にテキストから編集することになると思います。
{
    {
       Test10 INACTIVE
       Test20 ACTIVE
    }
    {
        {
            Test20 Test10 Test30 ;
            Test10 Test20 ;
         }
        {
               Test30 ;
               Test10 Test20 ;
        }
    }
}
この例ではまずの括弧で実行条件を設定しています。
CREATED、ACTIVE、INACTIVE、ERRORが設定できます。

さらにの括弧はGUIの紫のブロック、さらにの行は緑のブロックに該当します。



今日はこのぐらいにしておきます。



追記
2日ぐらいたったのですが1回もダウンロードされてないみたいですね・・・
MLで言うのも図々しいし※、OpenRTM-aistの公式サイトでプロジェクトを作成するのも手順がややこしいし、どうしようかな。


※誤解のないように言っておきますが、別に質問とかするのを図々しいとか言ってるわけではないです。ただ宣伝はどうなんですかね?




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

人気ブログランキングへ 
PR
以前の記事にコメントがあったようなので補足しておきます。

コメントのやりとりのなかで、1つのECで複数のRTCを駆動させるには複合コンポーネントを使うのが手っ取り早いと書きましたが、手っ取り早くない方法をやっておきます。


今回のサンプルはここからダウンロードできます。


今回のサンプルではtest1(DebugのTest1Comp.exe)とtest2(DebugのTest2Comp.exe)を立ち上げて、TestECandComponent.exeを立ち上げるとtest1の実行コンテキストからtest1を解除してtest2の実行コンテキストに関連付けます。

test1、test2はともにonExecuteが呼び出されると"test1"、"test2"と表示します。

test1とtest2は同じ実行周期に設定していますが、test1の方が処理が重く、test1は実行周期を大幅にオーバーするようになっています。

普通にアクティブにすればtest1とtest2は完全に非同期になります。


しかし、TestECandComponent.exeを実行後にアクティブにすると同期になることが試していただければわかると思います。


今回のプログラムを見てみます。

ポイントは、


ExecutionContextList1[0]->remove_component(test1._ptr());  //test1をECから解除
ExecutionContextList2[0]->add_component(test1._ptr());  //test1をtest2のECに関連付け


です。



今回の方法だと自分でプログラムを書かないといけないので面倒くさいですが、RTSEでいちいち操作しなくて良いので一旦作ってしまえば楽かもしれないです。


では、今度こそ2週間ほど休みます。





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

人気ブログランキングへ 
今回でこのコーナーは終了です.

どうせ名前だけ変えて似たようなことをやると思いますけど.




さて今回は実践編としてインポートに入力された値からD/Aボードの電圧の出力をするRTCを作りました.

サンプルはここからダウンロード出来ます.

・・・・ただ,今回はCONTEC社製のDA12-16(PCI)というD/Aボードを使ったのですが,付属のライブラリのライセンスがわからないので今回は自分でビルドしてください.


僕がD/Aボードを買ったのではないので定かではないですが,多分ドライバ等をインストールするCDがついてくるはずです.

それでインストールすると,サンプルプログラムがC:\Program Files\CONTEC\API-PAC(W32)\AIOWDM\Sampleあたりに作成されるはずなので,Console\Ao\SingleAoあたりからCaio.hとCAIO.LIBを今回のRTCのVC++のプロジェクトと同じフォルダにコピーすればいけると思います.

自分でプロジェクトを作る場合は,プロパティのリンカ→入力→追加の依存ファイルでCAIO.LIBを追加するだけです.



今回のRTCを作る上で難しそうなのは,全てのチャネルを使うとは限らないところですかね.

既に定義されてるデータ型にも適当なのがないですし.

・・・・・見逃してるだけかもしれないですけど.



そこで今回はコンフィギュレーションでOnを選択したチャネルのデータポートを作成,Offを選択するとデータポートを消すようにしました.

・・・・・正直,僕はあまりデータポートが増えたり減ったりするのは好きではないのですが,このコーナーでは実用性より面白さで作るようにしているので,不満がある人は自分で作り直してください.

配列でやった方が良かったかもしれないです.


あと,コンフィギュレーションで入力電圧の範囲を選択できます.



今回の実験の動画です.




今回は超個人的な事情によりA/Dボードが使えないため,SH7144マイコンでA/D変換してRS-232CでPCに計測結果を送信しています.

・・・RS-232CはRTCを使わずにハイパーターミナルで表示してますが,RTCから出力できた方が良いかもしれません.

動画では,最初にチャネル2のインポートのみがOnになってて,その後チャネル3もOnにしてます.

そして,アクティブにした瞬間チャネル3のデータポートが生成されます.

増えた後にチャネル3のデータポートとテスト出力用のRTCのアウトポートを接続しています.

今回ハイパーターミナルに表示しているのはチャネル3の電圧の計測値です.

アクティブ,非アクティブになった瞬間に0Vにするようにしてるので最初は0Vです.

次に1V,0.5V,1.5V,最後に非アクティブになって0Vに戻ります.


・・・本当は完全に遊びで,SHマイコンが計測した電圧値でモーターの回転速度を変えたりしてるのですが,動画撮るのが面倒くさいので撮ってません.





これで終わりです.

次は何の企画やるかは考え中です.

とりあえず,少なくとも2週間ぐらいは休む予定です.

では,さようなら.




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

人気ブログランキングへ
このコーナーは次回で終了です.

ネタがないのと,毎日更新ができないのと,コメントが全くつかないほど不人気なのが理由です.

とりあえず,次更新したらしばらく休むことにします.



それはさておき,今回はcoilでまた遊んでみようと思います.

サンプルはここからダウンロード出来ます.


まずは,Guardを使ってみます.

m_worker._mutex.lock()の替わりに


coil::Guard<coil::Mutex> guard_(m_worker.mutex_)


を記述することできるみたいです.

後でm_worker._mutex.unlock()で解放しなくても良いみたいですね.




次に,TimeMeasureを使ってみます.


coil::TimeMeasure TM;

TM.tick();

・・・

TM.tack();
printf("%lf\n",TM.getStatistics().max_interval);
printf("%lf\n",TM.getStatistics().mean_interval);
printf("%lf\n",TM.getStatistics().min_interval);
printf("%lf\n",TM.getStatistics().std_deviation);
if(count == 3)TM.reset();


こんな感じで使いました.
tickからtackまでの時間を計測して,最大,平均,最小,標準偏差が出せるようですね.

今回のプログラムでは,3回whileループが回るとリセットするようにしました.

ちなみに実行すると,

task1の回数    1
最大値   0
平均値   0
最小値   0
標準偏差 0

task1の回数    2
最大値   0.203125
平均値   0.101563
最小値   0
標準偏差 0.101563

task1の回数    3
最大値   0.390625
平均値   0.197917
最小値   0
標準偏差 0.159515
リセットしました

task1の回数    4
最大値   0.609375
平均値   0.609375
最小値   0.609375
標準偏差 0

task1の回数    5
最大値   0.796875
平均値   0.703125
最小値   0.609375
標準偏差 0.09375

task1の回数    6
最大値   2
平均値   1.13542
最小値   0.609375
標準偏差 0.616126




みたいな感じになりますね.

リセット直後の4回目では最大,平均,最小値が全て同じになりますね.

最後だけ,2秒間待つようにしてるので標準偏差が大きくなってます.



Asyncも使ってみましたけど・・・・まあ,Async.hに書いてるのとあまり変わらないし別に良いか.





今日はこのぐらいにしときます.














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

人気ブログランキングへ
RTMコンテストの準備が何もできてない・・・・

と言うより,アイデアがない.

ちょっと前にやったRTMとxPC-Targetを組み合わせるのは,あんまり需要なさそうだしなぁ.
それに,ターゲット側のPCでRTM動かしてるわけじゃないし.

全然アイデアがないものだから,ニンテンドー3DSでRTMが動かないかとかよく分からんこと考えてみたりしてるところです.





それはさておき,今回はコンフィギュレーションパラメータのコールバックをやります.

サンプルはここからダウンロード出来ます.
C++版,Python版を同梱してます.
僕はJavaではHello Worldレベルのことしかできないので知りません.



まず,コンフィギュレーションのコールバックに何があるかというと,


OnUpdateCallback
OnUpdateParamCallback
OnSetConfigurationSetCallback
OnAddConfigurationAddCallback
OnRemoveConfigurationSetCallback
OnActivateSetCallback


があります.

サンプルプログラムを省略して,コールバックを実装するのに最低限のコードだけ抜き出すと,


class MyOnUpdate
    : public RTC::OnUpdateCallback
{
public:
    MyOnUpdate()
    {

    }
    virtual void operator()(const char* config_set)
    {

    }

};

・・・・

this->m_configsets.setOnUpdate(new MyOnUpdate(this));


のようにしてコールバックを設定します.
OnUpdate以外も同様です.

データポートのコールバックとほぼ同じです.

ちなみに,m_configsetsはコンフィギュレーション情報管理オブジェクト(ConfigAdminクラス)で,ConfigAdmin.hにコールバックの定義があります.



では,今回のサンプルで動作を確認します.

コールバックは全て実装していて,コールバックが呼ばれると実行周期がコンフィギュレーションパラメータIntervalに設定されます.

・・・本当はonXXX()関数以外でコンフィギュレーションパラメータを使うのは良くないらしいのですが,別に今回のサンプルに実用性は求めてないのでスルーします.

また,アクティブ,非アクティブに遷移したときにコンフィギュレーションパラメータを勝手に変更します.

まず,RTCを起動すると,
  • OnUpdateCallback    default
  • OnUpdateCallback    default
2回アップデートされてるのは単純にコンフィギュレーションパラメータが2つだからです.
defaultはコンフィギュレーションセットで,RTSEのコンフィギュレーションのスペースの左側に出てるやつです.

rtse1.PNG





続いて,RTCをアクティブにしてみます.
  • OnSetConfiguration  default
  • OnSetActivateSet  default
  • Interval: 1000
  • OnUpdateParamCallback  dafault  Test
  • Interval: 1000
  • OnUpdateCallback    default
  • OnUpdateCallback    default
  • Interval: 1
  • Test:  0
  • Interval: 1
  • Test:  0
  • ・・・・
まず,m_configsets.setConfigurationSetValues(properties)でプロパティをコンフィギュレーションセットに追加した際にOnSetConfigurationが呼ばれます.
この時のプロパティはsetProperty("Interval", "1")で,Intervalは1000から1に設定されるはずです.
そして,m_configsets.activateConfigurationSet("default")でコンフィギュレーションセットがアクティブ化された時にOnSetActivateSetが呼ばれます.
見ても分かるとおり,この瞬間はまだコンフィギュレーションパラメータは変更されてません.
さらに,m_configsets.update("default","Test")とすることで,もう一つのコンフィギュレーションパラメータTestのみをアップデートします.
案の定,Intervalの方は1000のままです.
しかし,ここでm_configsets.update("default")としてコンフィギュレーションセットごと更新することで,Intervalが1に設定されました.
ちなみに,このコンフィギュレーションセットごと更新は別にm_configsets.update("default")が無くても実行されます.コンフィギュレーションセットがアクティブ化された状態でRTCのアクティビティが呼び出されると更新される・・・とは思うのですが定かではありません.

次にアクティブ化したままRTSEでIntervalを変更してみます.
  • ・・・・
  • Interval: 1
  • Test:  0
  • Interval: 1
  • OnSetConfiguration  default
  • OnSetActivateSet  default
  • Test:  0
  • Interval: 1
  • OnUpdateCallback    default
  • OnUpdateCallback    default
  • Test:  0
  • Interval: 2
  • ・・・・・
まず,コンフィギュレーションセットへの更新パラメータの追加,アクティブ化が行われます.
そして,次のonExecuteの後に更新が行われる・・・・かどうかは定かではありません.自分で調べてください.


続いて,非アクティブにしてみます.

  • ・・・
  • Test:  0
  • Interval: 2
  • OnSetConfiguration  default
  • OnSetActivateSet  default
  • Interval: 2
  • OnUpdateParamCallback  dafault  Interval
  • Interval: 800
  • OnUpdateCallback    default
  • OnUpdateCallback    default
  • Interval: 800
アクティブにしたときと違うのは,Intervalを800にしたところと,m_configsets.update("default","Interval")として,Intervalのみ更新しているところです.
今回は,m_configsets.update("default","Interval")で値が更新されてることが確認出来ます.


続いて,RTSEでコンフィギュレーションセットを追加します.
上の方で出てきた図の赤枠で追加を押した後,右の適用を押すと,
  • OnAddConfigurationAdd  (追加したセットの名前)
  • OnSetActivateSet  default
となるはずです.
さらに,追加下セットを削除すると,
  • OnRemoveConfigurationSet  (追加したセットの名前)
  • OnSetActivateSet  default
となってOnAddConfigurationAdd,OnRemoveConfigurationSetをコールバックすることができます.

最後にコンフィギュレーションパラメータを追加して適用を押すと,
  • OnSetConfiguration  default
  • OnSetActivateSet  default
となります.



基本的に,パラメータの変更はRTCのアクティビティが呼び出されるまではコンフィギュレーションパラメータが外で変更されても反映されませんが,コールバックを使う事でいろいろできるんではないでしょうか?




今日はこの辺にしといてあげます.
次回はcoilでもう一回遊んでみます.







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

カレンダー
12 2025/01 02
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 31
フリーエリア
最新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]