ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今日2回目の更新じゃないかって?
よく見てくださいよ.
この記事の日付は15日ですよ.
どうせ飽きると思うので書きため中です.
それはさておき,今回はExtTrigExecutionContextの外部トリガを入力するRTCを作成します.
平たく言うと,今回は完全に遊びと言うことです.
本来,何でExtTrigExecutionContextみたいな機能が必要かって言うと,OpenHRP3でシミュレータ時間で動作させるためですからね.
今回作成したRTCはここからダウンロード出来ます.
今回RTCを作成してて気づいたんですけど,アクティブになるにも外部トリガが必要みたいですね.
外部トリガを入力するのは,
void TestExtrigger2::Tick()
{
CorbaConsumer<OpenRTM::ExtTrigExecutionContextService> ec0;
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ec0.setObject(ecs[(CORBA::ULong)0]);
ec0->tick();
}
という関数を作ってやってます.
今日はここまでにしておきます.
明後日明日はrtctreeをいぢくってみます.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
よく見てくださいよ.
この記事の日付は15日ですよ.
どうせ飽きると思うので書きため中です.
それはさておき,今回はExtTrigExecutionContextの外部トリガを入力するRTCを作成します.
平たく言うと,今回は完全に遊びと言うことです.
本来,何でExtTrigExecutionContextみたいな機能が必要かって言うと,OpenHRP3でシミュレータ時間で動作させるためですからね.
今回作成したRTCはここからダウンロード出来ます.
今回RTCを作成してて気づいたんですけど,アクティブになるにも外部トリガが必要みたいですね.
外部トリガを入力するのは,
void TestExtrigger2::Tick()
{
CorbaConsumer<OpenRTM::ExtTrigExecutionContextService> ec0;
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ec0.setObject(ecs[(CORBA::ULong)0]);
ec0->tick();
}
という関数を作ってやってます.
今日はここまでにしておきます.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
バレンタインデーって,単純にチョコ食べたいときに買いづらいから,僕にはデメリットしかないOTZ.
自分が貰えないのはもはや気にならないのでどうでも良いですが.
それはさておき,今回は自分でRTCの状態を変更するRTCを作成します.
今回作成したサンプルのC++版はここ,Python版はここからダウンロード出来ます.
サンプルを起ち上げると,自動的にアクティブになります.
そして,1を入力すると非アクティブ,2を入力すると実行周期の変更ができるようになり,3を入力するとエラー状態になります.
エラー状態で1を入力するとリセットします.
最初にアクティブにしているのは,TestActiveComp.cppのMyModuleInit関数の,
RTC::RTObject_var rtobj;
rtobj = RTC::RTObject::_narrow(manager->getPOA()->servant_to_reference(comp));
RTC::ExecutionContextList_var ecs;
ecs = rtobj->get_owned_contexts();
ecs[(CORBA::ULong)0]->activate_component(rtobj);
の部分です.
TestActive.cppのonExcute関数で非アクテイブにするのも似たような感じで,
RTC::RTObject_var rtobj;
rtobj = this->getObjRef();
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ecs[(CORBA::ULong)0]->deactivate_component(rtobj);
と記述できます.
リセットするのも同じです.
RTC::RTObject_var rtobj;
rtobj = this->getObjRef();
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ecs[(CORBA::ULong)0]->reset_component(rtobj);
実行周期の変更は,
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ecs[(CORBA::ULong)0]->set_rate(rate);
と,実行コンテキストのリストを取得してから,いつぞやかの記事と同じくset_rate関数を使います.
これ書いてて気づいたんですが,上のrateをコンフィギュレーションパラメータに設定すればRTSEから実行周期が変更できますね.
今日の記事は手抜きな感が漂ってますがこのぐらいにしときます.
明日は自分で勝手にExtTrigExecutionContextの外部トリガ入力するRTCを作成します.
・・・もはや外部じゃないような感じもしますが.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
自分が貰えないのはもはや気にならないのでどうでも良いですが.
それはさておき,今回は自分でRTCの状態を変更するRTCを作成します.
今回作成したサンプルのC++版はここ,Python版はここからダウンロード出来ます.
サンプルを起ち上げると,自動的にアクティブになります.
そして,1を入力すると非アクティブ,2を入力すると実行周期の変更ができるようになり,3を入力するとエラー状態になります.
エラー状態で1を入力するとリセットします.
最初にアクティブにしているのは,TestActiveComp.cppのMyModuleInit関数の,
RTC::RTObject_var rtobj;
rtobj = RTC::RTObject::_narrow(manager->getPOA()->servant_to_reference(comp));
RTC::ExecutionContextList_var ecs;
ecs = rtobj->get_owned_contexts();
ecs[(CORBA::ULong)0]->activate_component(rtobj);
の部分です.
TestActive.cppのonExcute関数で非アクテイブにするのも似たような感じで,
RTC::RTObject_var rtobj;
rtobj = this->getObjRef();
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ecs[(CORBA::ULong)0]->deactivate_component(rtobj);
と記述できます.
リセットするのも同じです.
RTC::RTObject_var rtobj;
rtobj = this->getObjRef();
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ecs[(CORBA::ULong)0]->reset_component(rtobj);
実行周期の変更は,
RTC::ExecutionContextList_var ecs;
ecs = this->get_owned_contexts();
ecs[(CORBA::ULong)0]->set_rate(rate);
と,実行コンテキストのリストを取得してから,いつぞやかの記事と同じくset_rate関数を使います.
これ書いてて気づいたんですが,上のrateをコンフィギュレーションパラメータに設定すればRTSEから実行周期が変更できますね.
今日の記事は手抜きな感が漂ってますがこのぐらいにしときます.
明日は自分で勝手にExtTrigExecutionContextの外部トリガ入力するRTCを作成します.
・・・もはや外部じゃないような感じもしますが.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
OpenRTM-aistのHPのマニュアルが丁寧なので若干ネタ切れ気味です・
それはさておき,ここから下が今回の記事の内容です.
RTC Builderのコンフィギュレーション・パラメータにWidgetの設定があります.
設定できるのは,テキストボックス,スピンボックス,スライダー,ラジオボタンです.
スライダーを設定する場合はStepの項目に最小ステップ数を入力してから作成する必要があります.
別にOpenRTM-aist-1.0.0にサンプルがついてるのでいらないとは思いますけど,今回も簡単に作ってみました.
今回はC++とPythonで作成しました.
C++版はここ,Python版はここからダウンロードしてください.
実際にRTCを起動して,RTSEのConfiguration Viewを見てみると,
上からラジオボタン,スライダー,スピンボックス,テキストボックスが表示されます.
ラジオボタンとかスライダーとかの設定は(RTCの名前).confというファイルの中で設定してます.
今回作成したRTCのrtc.confを見てみると,
TEST.ConfigTest.config_file: ConfigTest.conf
となっており,コンポーネントの設定ファイルにConfigTest.confを指定しているのがわかります.
しかし、ConfigTest.confには何も書いてないと思います。
RTCBの古いバージョンだとConfigTest.confに記述されるようです。
新しいバージョンではConfigTest..cppに直接書いてるみたいですが、どちらでも良いと思います。
ConfigTest.confでは,
conf.__widget__.spinInt: spin
で,widgetの種類を指定し.
conf._default.spinInt: 0 <= x <= 5
で制約条件を指定しています.
なお、ConfigTest..cppに書く場合は
"conf.__widget__.spinInt", "spin"
となるはずです。
Sliderの場合は,
conf.__widget__.sliderDouble: slider.40
のように最小ステップ数も指定します.
今回はこのぐらいにしときます.
次回は自分で勝手にアクティブになるRTCを作成します.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
それはさておき,ここから下が今回の記事の内容です.
RTC Builderのコンフィギュレーション・パラメータにWidgetの設定があります.
設定できるのは,テキストボックス,スピンボックス,スライダー,ラジオボタンです.
スライダーを設定する場合はStepの項目に最小ステップ数を入力してから作成する必要があります.
別にOpenRTM-aist-1.0.0にサンプルがついてるのでいらないとは思いますけど,今回も簡単に作ってみました.
今回はC++とPythonで作成しました.
C++版はここ,Python版はここからダウンロードしてください.
実際にRTCを起動して,RTSEのConfiguration Viewを見てみると,
上からラジオボタン,スライダー,スピンボックス,テキストボックスが表示されます.
ラジオボタンとかスライダーとかの設定は(RTCの名前).confというファイルの中で設定してます.
今回作成したRTCのrtc.confを見てみると,
TEST.ConfigTest.config_file: ConfigTest.conf
となっており,コンポーネントの設定ファイルにConfigTest.confを指定しているのがわかります.
しかし、ConfigTest.confには何も書いてないと思います。
RTCBの古いバージョンだとConfigTest.confに記述されるようです。
新しいバージョンではConfigTest..cppに直接書いてるみたいですが、どちらでも良いと思います。
ConfigTest.confでは,
conf.__widget__.spinInt: spin
で,widgetの種類を指定し.
conf._default.spinInt: 0 <= x <= 5
で制約条件を指定しています.
なお、ConfigTest..cppに書く場合は
"conf.__widget__.spinInt", "spin"
となるはずです。
Sliderの場合は,
conf.__widget__.sliderDouble: slider.40
のように最小ステップ数も指定します.
今回はこのぐらいにしときます.
次回は自分で勝手にアクティブになるRTCを作成します.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
なんだかんだでこの企画も4回目です.
ちなみに僕は「地道」という言葉が大嫌いです.
僕の座右の銘は「運で努力を踏みにじる」です.
それはさておき,この記事の本題に入ります.
今回はデータポートの動的な生成,削除をやります.
今回のサンプルはここからダウンロードできます.
inportを作成する関数としては,
void registerInPort(const char* name,PortBase& port);
void registerPort(PortBase& port);
bool addPort(PortBase& port);
bool addOutPort(const char* name, OutPortBase& outport);
があり,outportを作成する関数としては,
void registerOutPort(const char* name,PortBase& port);
void registerPort(PortBase& port);
bool addPort(PortBase& port);
bool addOutPort(const char* name, OutPortBase& outport);
があるようです.
・・・ただ,registerPortとaddPortを使うとポートプロパティにunknownとか出てくるので他を使った方が良いかも.
インポートを削除する関数は,
bool removePort(PortBase& port);
bool removeInPort(InPortBase& port);
void deletePort(PortBase& port);
があり,アウトポートを削除する関数は,
bool removePort(PortBase& port);
bool removeOutPort(OutPortBase& port);
void deletePort(PortBase& port);
があるようです.
削除する前に,
m_inIn->disconnect_all();
m_outOut->disconnect_all();
として接続を切断してください.
今回作成したサンプルはアクティブにしたときにインポート,アウトポートが作成され,非アクティブにしたときに削除するようになってます.
ポートの生成,削除をするRTCは去年のRTMコンテストにもありましたね[1][2].
次回はRTCBuilderの機能を見ていこうかと思います.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
ちなみに僕は「地道」という言葉が大嫌いです.
僕の座右の銘は「運で努力を踏みにじる」です.
それはさておき,この記事の本題に入ります.
今回はデータポートの動的な生成,削除をやります.
今回のサンプルはここからダウンロードできます.
inportを作成する関数としては,
void registerInPort(const char* name,PortBase& port);
void registerPort(PortBase& port);
bool addPort(PortBase& port);
bool addOutPort(const char* name, OutPortBase& outport);
があり,outportを作成する関数としては,
void registerOutPort(const char* name,PortBase& port);
void registerPort(PortBase& port);
bool addPort(PortBase& port);
bool addOutPort(const char* name, OutPortBase& outport);
があるようです.
・・・ただ,registerPortとaddPortを使うとポートプロパティにunknownとか出てくるので他を使った方が良いかも.
インポートを削除する関数は,
bool removePort(PortBase& port);
bool removeInPort(InPortBase& port);
void deletePort(PortBase& port);
があり,アウトポートを削除する関数は,
bool removePort(PortBase& port);
bool removeOutPort(OutPortBase& port);
void deletePort(PortBase& port);
があるようです.
削除する前に,
m_inIn->disconnect_all();
m_outOut->disconnect_all();
として接続を切断してください.
今回作成したサンプルはアクティブにしたときにインポート,アウトポートが作成され,非アクティブにしたときに削除するようになってます.
ポートの生成,削除をするRTCは去年のRTMコンテストにもありましたね[1][2].
次回はRTCBuilderの機能を見ていこうかと思います.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
一日一回更新すると宣言してしまった記事は削除して無かったことにしようかと思ったりもしている本企画の第3回です.
rtc.confの設定項目にデフォルトの実行コンテキストのタイプを変更する項目があります.
rtc.confに書かなかった場合は
exec_cxt.periodic.type: PeriodicExecutionContext と設定されます. デフォルトと言うことは何らかの方法で動的に変更できそうですね. PeriodicExecutionContextは周期実行できます. 対してExtTrigExecutionContextを設定すると外部トリガによる実行になります. OpenRTM-aistのPython版にサンプルがあります. C++で簡単にをつくってみました. ここからダウンロードできます. 実行する前に,
corba.nameservers: localhost
naming.formats: %n.rtc
exec_cxt.periodic.type: ExtTrigExecutionContext
exec_cxt.periodic.rate: 1000
という内容のrtc.confを作成して,適当なフォルダに入れた後,OpenRTM-aist-1.0.0-RELEASE付属のConsoleInCompとConsoleOutCompをそのフォルダにコピーして起ち上げてください.
その後,今回作成したプログラムを起動すれば,0を押したときはConsoleInComp,1を押したときはConsoleOutComp,2を押したときは両方を実行します.
・・・Python版のサンプルと同じになるはずですが,僕の環境が悪いのかどうかはわかりませんがPython版のサンプルが入力に関係なく周期実行になってしまいますね.これを読んでる皆さんの環境ではどうなってますかね?
※OpenRTM-aistのメーリスで質問してくれた人がいて,どうやらバグだったみたいです.
と言うかサンプルプログラムなのに誰も動作確認しようとしなかったのか,僕みたいに自分の使い方が間違ってると思い込んで報告しなかったのかどっちなんでしょうね?
これなら,WubiでOpenRTM-aistが使えないのもバグかも.
とりあえず,今回のプログラムとC++版のConsoleInCompとConsoleOutCompを使うと,0を入力した後しかConsoleInCompの数字の入力が受け付けなくなり,1を入力した時しかConsoleOutCompのInportから入力された値が表示されなくなります.
今回作成したプログラムのポイントは
CorbaConsumer<OpenRTM::ExtTrigExecutionContextService> ec0;
CorbaConsumer<OpenRTM::ExtTrigExecutionContextService> ec1;
ec0.setObject(ExecutionContextListIn[0]);
ec1.setObject(ExecutionContextListOut[0]);
ec0->tick();
ec1->tick();
です.
tick()で実行できるみたいです.
PeriodicExecutionContext,ExtTrigExecutionContex以外では,OpenHRP3のコントーラーに使う SynchExtTriggerEC,ARTLinux用実行コンテキストARTExecutionContextがあるみたいですね.
rtc.confは他にも設定できる項目はありますが,だいたいOpenRTM-aistの公式HPの通りなので別にここでやらなくても・・・・という感じですね.
強いて言うなら,managerに関する設定と,corba.endpointとかはやってもいいかもしれないけど,managerは後でやりたい気分だし,corba.endpointは他のサイトで解説があるようなので別に触れなくても良いかなと思ったりですね.
次回はポートの動的な追加,削除をやりたいと思います.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
rtc.confの設定項目にデフォルトの実行コンテキストのタイプを変更する項目があります.
rtc.confに書かなかった場合は
exec_cxt.periodic.type: PeriodicExecutionContext と設定されます. デフォルトと言うことは何らかの方法で動的に変更できそうですね. PeriodicExecutionContextは周期実行できます. 対してExtTrigExecutionContextを設定すると外部トリガによる実行になります. OpenRTM-aistのPython版にサンプルがあります. C++で簡単にをつくってみました. ここからダウンロードできます. 実行する前に,
corba.nameservers: localhost
naming.formats: %n.rtc
exec_cxt.periodic.type: ExtTrigExecutionContext
exec_cxt.periodic.rate: 1000
という内容のrtc.confを作成して,適当なフォルダに入れた後,OpenRTM-aist-1.0.0-RELEASE付属のConsoleInCompとConsoleOutCompをそのフォルダにコピーして起ち上げてください.
その後,今回作成したプログラムを起動すれば,0を押したときはConsoleInComp,1を押したときはConsoleOutComp,2を押したときは両方を実行します.
・・・Python版のサンプルと同じになるはずですが,僕の環境が悪いのかどうかはわかりませんがPython版のサンプルが入力に関係なく周期実行になってしまいますね.これを読んでる皆さんの環境ではどうなってますかね?
※OpenRTM-aistのメーリスで質問してくれた人がいて,どうやらバグだったみたいです.
と言うかサンプルプログラムなのに誰も動作確認しようとしなかったのか,僕みたいに自分の使い方が間違ってると思い込んで報告しなかったのかどっちなんでしょうね?
これなら,WubiでOpenRTM-aistが使えないのもバグかも.
とりあえず,今回のプログラムとC++版のConsoleInCompとConsoleOutCompを使うと,0を入力した後しかConsoleInCompの数字の入力が受け付けなくなり,1を入力した時しかConsoleOutCompのInportから入力された値が表示されなくなります.
今回作成したプログラムのポイントは
CorbaConsumer<OpenRTM::ExtTrigExecutionContextService> ec0;
CorbaConsumer<OpenRTM::ExtTrigExecutionContextService> ec1;
ec0.setObject(ExecutionContextListIn[0]);
ec1.setObject(ExecutionContextListOut[0]);
ec0->tick();
ec1->tick();
です.
tick()で実行できるみたいです.
PeriodicExecutionContext,ExtTrigExecutionContex以外では,OpenHRP3のコントーラーに使う SynchExtTriggerEC,ARTLinux用実行コンテキストARTExecutionContextがあるみたいですね.
rtc.confは他にも設定できる項目はありますが,だいたいOpenRTM-aistの公式HPの通りなので別にここでやらなくても・・・・という感じですね.
強いて言うなら,managerに関する設定と,corba.endpointとかはやってもいいかもしれないけど,managerは後でやりたい気分だし,corba.endpointは他のサイトで解説があるようなので別に触れなくても良いかなと思ったりですね.
次回はポートの動的な追加,削除をやりたいと思います.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・