ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
1日1回更新宣言はどこへやらといった感じです.
へたれなので許してください.
それはさておき,今回はomniORBで他のPCとの通信をやります.
とは言っても,前回のサンプルのサーバーかクライアントを
TestCORBAserver -ORBInitRef NameService=corbaloc:iiop:1.0@(IPアドレス):2809/NameService
とコマンドから入力して起ち上げるだけです.
普通なソケット通信と比較してみます.
単純なデータの送受信なら普通のソケット通信の方が良さそうです.
omniORBはちょっと日本語の資料が少なすぎるのが難点かも.
同じCORBAでもJAVAなら資料が見つかりますけど.
ただ,IDLで簡単にインターフェースを定義できるのでちょっと複雑になったらCORBAの方が良いと思います.
完全に主観ですけど,使ってみた感じこんな感想.
まあ,RTMだったらさらに簡単にできるわけだから,別にomniORB単体でつかう必要を感じなかったりしてるところです.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
へたれなので許してください.
それはさておき,今回はomniORBで他のPCとの通信をやります.
とは言っても,前回のサンプルのサーバーかクライアントを
TestCORBAserver -ORBInitRef NameService=corbaloc:iiop:1.0@(IPアドレス):2809/NameService
とコマンドから入力して起ち上げるだけです.
普通なソケット通信と比較してみます.
単純なデータの送受信なら普通のソケット通信の方が良さそうです.
omniORBはちょっと日本語の資料が少なすぎるのが難点かも.
同じCORBAでもJAVAなら資料が見つかりますけど.
ただ,IDLで簡単にインターフェースを定義できるのでちょっと複雑になったらCORBAの方が良いと思います.
完全に主観ですけど,使ってみた感じこんな感想.
まあ,RTMだったらさらに簡単にできるわけだから,別にomniORB単体でつかう必要を感じなかったりしてるところです.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
omniORB単体だとやたら面倒くさい.
正直な所,OpenRTM-aistを使うだけなら別にソースなんか読まなくても良いような気がする.
でもこの前の卒論発表で,「OpenCVのライブラリをそのまま使っているので,どんなアルゴリズムかは知りません」とか平気な顔で言う人を見たので,読んだ方が良いような気もするんだよなぁ.
まあ,OpenCVはちょっと探せば情報はすぐに出てくるから別に読まなくても良いんだけど.
ちなみに僕は画像処理に興味がないのでOpenCVのアルゴリズムなんか知りません.
それはさておき,今回はネームサーバーを使ってクライアントとサーバーを分けます.
今回のサンプルはここからダウンロード出来ます.
・・・・とは言っても,omniORBのサンプルとほぼ同じですが.
では,クライアントから見ていきます.
TestCORBAclientのTestCORBAcliant.cppを見てください.
//ネームサーバーよりオブジェクトリファレンスを取得
CORBA::Object_var obj = getObjectReference(orb);
//サーバントのオブジェクトリファレンス取得
Example::Echo_var echoref = Example::Echo::_narrow(obj);
//サーバーに処理を要求
for (CORBA::ULong count=0; count < 10; count++)
hello(echoref);
重要なのはgetObjectReferenceなので,そちらを見ます.
//ネーミングサービスの参照を取得
obj = orb->resolve_initial_references("NameService");
rootContext = CosNaming::NamingContext::_narrow(obj);
・・・
//test.mycontext/Echo.Objectに名前を設定
CosNaming::Name name;
name.length(2);
name[0].id = (const char*) "test"; // string copied
name[0].kind = (const char*) "my_context"; // string copied
name[1].id = (const char*) "Echo";
name[1].kind = (const char*) "Object";
・・・
//指定した名前のオブジェクトリファレンスを返す
return rootContext->resolve(name);
重要なのはこんなところかな.
例の如く,example_echo.idlからomniidl -bcxx -Wba -nf example_echo.idlとコマンドを打ってファイル生成してください.
次はサーバーです.
TestCORBAserverのTestCORBAserver.cppを見てください.
main文では
//ネームサーバーにオブジェクトを登録
if( !bindObjectToName(orb, obj) )
return 1;
・・・
//サーバアプリケーションの終了待機
orb->run();
重要なのはこれだけ.
あとは前と同じ.
bindObjectToNameでは,
//test.my_contextの下に登録するため,ネーミングコンテキストの名前設定
CosNaming::Name contextName;
contextName.length(1);
contextName[0].id = (const char*) "test";
contextName[0].kind = (const char*) "my_context";
・・・
//ネーミングコンテキストの作成
testContext = rootContext->bind_new_context(contextName);
・・・
//Echo.Objectという名前を設定
CosNaming::Name objectName;
objectName.length(1);
objectName[0].id = (const char*) "Echo";
objectName[0].kind = (const char*) "Object";
・・・
//オブジェクトを登録
testContext->bind(objectName, objref);
みたいな感じ.
最後に動作確認してみます.
ネームサーバーを起ち上げるのは
omniNames -start -logdir tmp
とコマンド入力します.
この際,tmpのフォルダの中のファイルは削除してないと実行できないみたいですね.
続いて,サーバーを起ち上げます.
コマンドから
TestCORBAserver -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とネームサーバーのポート番号を指定して起ち上げます.
クライアントも同様に
TestCORBAclient -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とします.
すると,クライアントでサーバーのechoStringから"hello"と返されて,サーバーでも今回は受け取った文字列を表示するようにしたので表示されるはずです.
これで完了です.
・・・・うん,面倒くさい.
次回は他のPCでサーバーを起ち上げて通信させます.
後,普通のソケット通信との比較でもやってみようと思います.
少し比べる次元がおかしいような気もしますが.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
正直な所,OpenRTM-aistを使うだけなら別にソースなんか読まなくても良いような気がする.
でもこの前の卒論発表で,「OpenCVのライブラリをそのまま使っているので,どんなアルゴリズムかは知りません」とか平気な顔で言う人を見たので,読んだ方が良いような気もするんだよなぁ.
まあ,OpenCVはちょっと探せば情報はすぐに出てくるから別に読まなくても良いんだけど.
ちなみに僕は画像処理に興味がないのでOpenCVのアルゴリズムなんか知りません.
それはさておき,今回はネームサーバーを使ってクライアントとサーバーを分けます.
今回のサンプルはここからダウンロード出来ます.
・・・・とは言っても,omniORBのサンプルとほぼ同じですが.
では,クライアントから見ていきます.
TestCORBAclientのTestCORBAcliant.cppを見てください.
//ネームサーバーよりオブジェクトリファレンスを取得
CORBA::Object_var obj = getObjectReference(orb);
//サーバントのオブジェクトリファレンス取得
Example::Echo_var echoref = Example::Echo::_narrow(obj);
//サーバーに処理を要求
for (CORBA::ULong count=0; count < 10; count++)
hello(echoref);
重要なのはgetObjectReferenceなので,そちらを見ます.
//ネーミングサービスの参照を取得
obj = orb->resolve_initial_references("NameService");
rootContext = CosNaming::NamingContext::_narrow(obj);
・・・
//test.mycontext/Echo.Objectに名前を設定
CosNaming::Name name;
name.length(2);
name[0].id = (const char*) "test"; // string copied
name[0].kind = (const char*) "my_context"; // string copied
name[1].id = (const char*) "Echo";
name[1].kind = (const char*) "Object";
・・・
//指定した名前のオブジェクトリファレンスを返す
return rootContext->resolve(name);
重要なのはこんなところかな.
例の如く,example_echo.idlからomniidl -bcxx -Wba -nf example_echo.idlとコマンドを打ってファイル生成してください.
次はサーバーです.
TestCORBAserverのTestCORBAserver.cppを見てください.
main文では
//ネームサーバーにオブジェクトを登録
if( !bindObjectToName(orb, obj) )
return 1;
・・・
//サーバアプリケーションの終了待機
orb->run();
重要なのはこれだけ.
あとは前と同じ.
bindObjectToNameでは,
//test.my_contextの下に登録するため,ネーミングコンテキストの名前設定
CosNaming::Name contextName;
contextName.length(1);
contextName[0].id = (const char*) "test";
contextName[0].kind = (const char*) "my_context";
・・・
//ネーミングコンテキストの作成
testContext = rootContext->bind_new_context(contextName);
・・・
//Echo.Objectという名前を設定
CosNaming::Name objectName;
objectName.length(1);
objectName[0].id = (const char*) "Echo";
objectName[0].kind = (const char*) "Object";
・・・
//オブジェクトを登録
testContext->bind(objectName, objref);
みたいな感じ.
最後に動作確認してみます.
ネームサーバーを起ち上げるのは
omniNames -start -logdir tmp
とコマンド入力します.
この際,tmpのフォルダの中のファイルは削除してないと実行できないみたいですね.
続いて,サーバーを起ち上げます.
コマンドから
TestCORBAserver -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とネームサーバーのポート番号を指定して起ち上げます.
クライアントも同様に
TestCORBAclient -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とします.
すると,クライアントでサーバーのechoStringから"hello"と返されて,サーバーでも今回は受け取った文字列を表示するようにしたので表示されるはずです.
これで完了です.
・・・・うん,面倒くさい.
次回は他のPCでサーバーを起ち上げて通信させます.
後,普通のソケット通信との比較でもやってみようと思います.
少し比べる次元がおかしいような気もしますが.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
CORBAについては分かり易く解説してるサイトがあったので,そちらを見た方が良さそうですね.
ちなみにOmniORBのマニュアルはこのページです.
なんで前々回の記事でリンク集作ったかって言うと,僕のブログやHP見るより他のサイトを見る方が参考になると思ってるからですしね.
それはおいといて,今回は前回のサンプルのソースを見ていこうと思います.
まず,先頭に
# undef USE_stub_in_nt_dll
# include "example_echo.hh"
# include "example_echoSK.cc"
と記述してください.
mainでは,
// ORBの生成と初期化
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
// RootPOA(ツリー構造のルート)への参照を取得
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
//サーバントオブジェクト
Echo_i* myecho = new Echo_i();
//オブジェクトIDを生成し,サーバントをAOMに格納
PortableServer::ObjectId_var myechoid = poa->activate_object(myecho);
//サーバントのオブジェクトリファレンス取得
Example::Echo_var myechoref = myecho->_this();
//リファレンスカウンタ
myecho->_remove_ref();
//POAManagerオブジェクトの取得とアクティブ状態への遷移
PortableServer::POAManager_var pman = poa->the_POAManager();
pman->activate();
//hello関数(後述)
hello(myechoref);
// ORBの破棄
orb->destroy();
みたいな流れですかね.説明が間違ってる可能性もありますが.
hello関数では,
//オブジェクトリファレンスeによりechoStringを呼び出す
CORBA::String_var dest = e->echoString(src);
しかしてないです.
echoStringからは同じ文字列が返されます.
今回は自分が要求を受け付けるサーバーで,echoStringの処理を要求するクライアントも自分という感じでしたが,次回はネーミングサービスを使って違うプログラムにします.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
ちなみにOmniORBのマニュアルはこのページです.
なんで前々回の記事でリンク集作ったかって言うと,僕のブログやHP見るより他のサイトを見る方が参考になると思ってるからですしね.
それはおいといて,今回は前回のサンプルのソースを見ていこうと思います.
まず,先頭に
# undef USE_stub_in_nt_dll
# include "example_echo.hh"
# include "example_echoSK.cc"
と記述してください.
mainでは,
// ORBの生成と初期化
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
// RootPOA(ツリー構造のルート)への参照を取得
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
//サーバントオブジェクト
Echo_i* myecho = new Echo_i();
//オブジェクトIDを生成し,サーバントをAOMに格納
PortableServer::ObjectId_var myechoid = poa->activate_object(myecho);
//サーバントのオブジェクトリファレンス取得
Example::Echo_var myechoref = myecho->_this();
//リファレンスカウンタ
myecho->_remove_ref();
//POAManagerオブジェクトの取得とアクティブ状態への遷移
PortableServer::POAManager_var pman = poa->the_POAManager();
pman->activate();
//hello関数(後述)
hello(myechoref);
// ORBの破棄
orb->destroy();
みたいな流れですかね.説明が間違ってる可能性もありますが.
hello関数では,
//オブジェクトリファレンスeによりechoStringを呼び出す
CORBA::String_var dest = e->echoString(src);
しかしてないです.
echoStringからは同じ文字列が返されます.
今回は自分が要求を受け付けるサーバーで,echoStringの処理を要求するクライアントも自分という感じでしたが,次回はネーミングサービスを使って違うプログラムにします.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
何やら前回の記事のリンク集がOpenRTM-aistのMLで出てきたみたいで,いつもの3倍ぐらいは人が来ましたね.
ただ,無断リンクしてるので少し怖かったりします.
こんな所にリンク集載せても特に意味はないので,OpenRTM-aistの公式サイトとかにもそういうページがあった方が良いかもと思ったりもしてます.
あと,フォーラムがどうなるのかは楽しみだったりします.
さて,今回の内容はRTMを直接いぢるのではなくて,omniORBを使ったプログラムを作成してみます.
今回のサンプルはここからダウンロード出来ます.
日本語で解説しているサイトが皆無だったんですけど,皆さん英語のマニュアルをガリガリ読んでるんでしょうかね?
Pythonで解説しているサイトならあったので,今回はC++で作りました.
omniORBはOpenRTM-aistをインストールすると一緒に付いてくるので,インストールの方法は省略します.
今回のサンプルは,omniORBに付いてくるサンプルとほとんど同じです.
なので,今回は環境構築するだけということです.
まず,IDLファイルを作成してください.
中身はこんな感じで.OpenRTM-aistだけ使ってれば,サービスポート作成以外であまり見ることはないと思います.
module Example {
interface Echo{
string echoString(in string mesg);
};
};
これで,コマンドプロンプトから
omniidl -bcxx -Wba -nf example_echo.idl
と入力すれば,example_echo.hhとexample_echoSK.cc,example_echoDynSK.ccが生成されます.
あとは,VC++で空のプロジェクトを作成して,ツール→オプション→プロジェクト及びソリューション→VC++ディレクトリのインクルードファイルにC:\Program Files\omniORB-4.1.4\include,ライブラリファイルにC:\Program Files\omniORB-4.1.4\libを追加します.
OpenRTMではrtm_config.vspropsの中で設定されてるみたいです.
後はプロパティ→C/C++→プリプロセッサ→プリプロセッサの定義に
USE_stub_in_nt_dll
WIN32
_DEBUG
_CONSOLE
__WIN32__
__x86__
_WIN32_WINNT=0x0500
__NT__
__OSVERSION__=4
_CRT_SECURE_NO_DEPRECATE
を設定してください.
あとは,リンカ→入力→追加の依存ファイルに
omnithread_rtd.lib
omniORB414_rtd.lib
omniDynamic414_rtd.lib
を設定してください.
これで後はソースをいぢるだけです.
今日はここまでにして,ソースについては次回にします.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
ただ,無断リンクしてるので少し怖かったりします.
こんな所にリンク集載せても特に意味はないので,OpenRTM-aistの公式サイトとかにもそういうページがあった方が良いかもと思ったりもしてます.
あと,フォーラムがどうなるのかは楽しみだったりします.
さて,今回の内容はRTMを直接いぢるのではなくて,omniORBを使ったプログラムを作成してみます.
今回のサンプルはここからダウンロード出来ます.
日本語で解説しているサイトが皆無だったんですけど,皆さん英語のマニュアルをガリガリ読んでるんでしょうかね?
Pythonで解説しているサイトならあったので,今回はC++で作りました.
omniORBはOpenRTM-aistをインストールすると一緒に付いてくるので,インストールの方法は省略します.
今回のサンプルは,omniORBに付いてくるサンプルとほとんど同じです.
なので,今回は環境構築するだけということです.
まず,IDLファイルを作成してください.
中身はこんな感じで.OpenRTM-aistだけ使ってれば,サービスポート作成以外であまり見ることはないと思います.
module Example {
interface Echo{
string echoString(in string mesg);
};
};
これで,コマンドプロンプトから
omniidl -bcxx -Wba -nf example_echo.idl
と入力すれば,example_echo.hhとexample_echoSK.cc,example_echoDynSK.ccが生成されます.
あとは,VC++で空のプロジェクトを作成して,ツール→オプション→プロジェクト及びソリューション→VC++ディレクトリのインクルードファイルにC:\Program Files\omniORB-4.1.4\include,ライブラリファイルにC:\Program Files\omniORB-4.1.4\libを追加します.
OpenRTMではrtm_config.vspropsの中で設定されてるみたいです.
後はプロパティ→C/C++→プリプロセッサ→プリプロセッサの定義に
USE_stub_in_nt_dll
WIN32
_DEBUG
_CONSOLE
__WIN32__
__x86__
_WIN32_WINNT=0x0500
__NT__
__OSVERSION__=4
_CRT_SECURE_NO_DEPRECATE
を設定してください.
あとは,リンカ→入力→追加の依存ファイルに
omnithread_rtd.lib
omniORB414_rtd.lib
omniDynamic414_rtd.lib
を設定してください.
これで後はソースをいぢるだけです.
今日はここまでにして,ソースについては次回にします.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
OpenRTM-aistのメーリスでExtTrigExecutionContextの話が出たおかげで少し人が来ました.
僕のこのブログとHPはあまり正しくない情報も載せることが多いので他に参考になるサイト,または本を勝手に載せておきます.
勝手に紹介して欲しくない場合は,コメント欄に書き込んでくれたら即座に消します.
書籍
はじめてのコンポーネント指向ロボットアプリケーション開発 ~RTミドルウェア超入門~
OpenRTM.NETのRTCもみんなもっと開発してほしい.
UMLとRTミドルウェアによる モデルベースロボットシステム開発
どちらかと言うとUMLの説明が多いかも.
ロボット情報学ハンドブック
CORBAの解説もあります.
本格的に解説してるサイト
ysuga.net
OpenRTM-aistの公式サイトでインストール→ysugaさんのサイトを参考にしてRTCを作成という流れの人が多いのではないかと
けんちょの部屋 改改
以前のコンテンツが消えたのが残念です.
RTミドルウェア入門
OpenCVを用いたRTCについての解説があります.
@ホームに参加するぞのページ
OpenHRIについて解説もあります.
tech note
多分,このサイトが一番情報が多いと思う.おすすめです.
RTMの情報が載っているサイト
alt-ctrl-today
僕のブログによくコメントやアドバイスをくださるalt-nativeさんのサイトです.
ロボット開発工学
このサイトはRTM以外に関しても参考にさせてもらってます.
ロボット系プログラマの日記
ScalaでRTC作ったりしてます.
ソース+水=麦茶色の何か
たこあしはいせん
robotics tools
研究ぶろぐ
ヴイストン株式会社のRTコンポーネント 解説ページ
ビュートローバーRTCの使用方法が載ってます
ロボナブル
RTMに関するニュースも載ることがあるので一応載せておきます.
解説記事
SEのためのRTシステム概論
RTミドルウエアを用いたロボットシステム開発
公式サイト
OpenRTM-aist
OpenRT Platform
RTミドルウェアコンテスト
OpenHRP3
OpenHRI
OpenINVENT
他に参考になるサイトなどがあれば教えて頂けると大変ありがたいです.
僕のこのブログとHPはあまり正しくない情報も載せることが多いので他に参考になるサイト,または本を勝手に載せておきます.
勝手に紹介して欲しくない場合は,コメント欄に書き込んでくれたら即座に消します.
書籍
はじめてのコンポーネント指向ロボットアプリケーション開発 ~RTミドルウェア超入門~
OpenRTM.NETのRTCもみんなもっと開発してほしい.
UMLとRTミドルウェアによる モデルベースロボットシステム開発
どちらかと言うとUMLの説明が多いかも.
ロボット情報学ハンドブック
CORBAの解説もあります.
本格的に解説してるサイト
ysuga.net
OpenRTM-aistの公式サイトでインストール→ysugaさんのサイトを参考にしてRTCを作成という流れの人が多いのではないかと
けんちょの部屋 改改
以前のコンテンツが消えたのが残念です.
RTミドルウェア入門
OpenCVを用いたRTCについての解説があります.
@ホームに参加するぞのページ
OpenHRIについて解説もあります.
tech note
多分,このサイトが一番情報が多いと思う.おすすめです.
RTMの情報が載っているサイト
alt-ctrl-today
僕のブログによくコメントやアドバイスをくださるalt-nativeさんのサイトです.
ロボット開発工学
このサイトはRTM以外に関しても参考にさせてもらってます.
ロボット系プログラマの日記
ScalaでRTC作ったりしてます.
ソース+水=麦茶色の何か
たこあしはいせん
robotics tools
研究ぶろぐ
ヴイストン株式会社のRTコンポーネント 解説ページ
ビュートローバーRTCの使用方法が載ってます
ロボナブル
RTMに関するニュースも載ることがあるので一応載せておきます.
解説記事
SEのためのRTシステム概論
RTミドルウエアを用いたロボットシステム開発
公式サイト
OpenRTM-aist
OpenRT Platform
RTミドルウェアコンテスト
OpenHRP3
OpenHRI
OpenINVENT
他に参考になるサイトなどがあれば教えて頂けると大変ありがたいです.