hiro_handleとGUIコントローラを接続する(その2)
初稿: 2013/10/8, 最終更新: 2013/10/10
10.GUIコントローラにXMLRPCクライアント機能を付ける
XML-RPCを使ったPythonのサーバーはとても簡単に書くことができました。C++では、どうでしょうか。C++用のXML-RPCライブラリも幾つか公開されています。今回は、その中で古いけれども書式の素直なXMLRPC++0.7を使うことにします。ライセンスはLGPLです。
10.1 XMLRPC++0.7のインストール
XMLRPC++0.7の最終更新日は2003年となっていて10年以上昔のライブラリですが、問題なく使えます。ただし、配布されているプロジェクトのバージョンが当時の最新環境であったVC6に留まっていますので、VS2012では直接読むことも変換することも上手くできません。vs2008、vs2010ぐらいであれば何とかプロジェクトを読むこともできるかと思いますので、その場合は本家からダウンロードして通常通りにビルドしてください。vs2012しかないという場合は、vs2012対応版xmlrpc++0.7からダウンロードして
c:\workspace\xmlrpc++0.7
などに解凍してビルドしてください。 GUIコントローラのプロジェクトの設定で、インクルードディレクトリにC:\workspace\xmlrpc++0.7\srcを追加してください。
10.2 XML-RPCクライアントC++版
ソースコードに修正を加えていきます。複数の関数からXmlRpcを呼び出せるようにtestApp.h内に宣言とインスタンス保持用のポインタを宣言します。また、関節角度取り込み用ボタンのためのbool変数も作っておきます。
#include "XmlRpc.h"
class testApp内
ofParameter<bool> rpc_get_angles;
XmlRpc::XmlRpcClient *c;
testApp.cppには3箇所の変更を加えます。xmlrpcのライブラリをリンクできるようにソースコードに#pragma関数を追加します。この代わりに、プロジェクトで追加するリンクに加えてもどちらの方法でもかまいません。
#if _DEBUG
#pragma comment(lib, "C:\\workspace\\xmlrpc++0.7\\Debug\\xmlrpc.lib")
#else
#pragma comment(lib, "C:\\workspace\\xmlrpc++0.7\\Release\\xmlrpc.lib")
#endif
testApp::setup()関数の最後で、関節角度取り込み用ボタンの生成と、xmlrpcクライアントのインスタンスの作成を行います。引数は、接続先のIPアドレスとポート番号です。
gui.add(rpc_get_angles.set("get angle", false));
c = new XmlRpc::XmlRpcClient( "localhost", 8000 );
testApp::update()関数の最初に、関節角度取り込み用ボタンが押されたときの処理を記述します。ボタンが連続して押されないように、ボタンの状態をfalseに設定します。サーバ側関数への引数argsと、返り値resを宣言し、getJointAnglesDegでは特に引数無しでも呼び出すことができますので、c->executeでサーバ側関数を呼び出しています。サーバの応答があるまで処理はそこで止まり、応答を受け付けた後に再開します。返り値は関節角度のfloat配列ですので、関節角度のパラメータに渡しています。
if(rpc_get_angles){
rpc_get_angles = false;
XmlRpc::XmlRpcValue args, res;
c->execute("getJointAnglesDeg", args, res);
chest = (double)res[0];
pan = (double)res[1];
tilt = (double)res[2];
for(int i=0; i<6; i++){ rarm[i] = (double)res[3+i]; }
for(int i=0; i<6; i++){ larm[i] = (double)res[9+i]; }
}
fig.17 実機の姿勢取得
実行してみましょう。とれたー。