hiro_handleとGUIコントローラを接続する(その1)
初稿: 2013/10/8, 最終更新:
9.hiro_handleをサーバ化する(xmlrpc版)
hiro_handleが上手く動くようになり、GUIもそれなりに出来つつあるので、2つを接続する方法を検討していきましょう。
9.1 接続方法の検討
困ったことに、hiro_handleはPythonで書かれていて、GUIはc++で書かれています。素直に考えれば、c++からpythonを呼び出す、またはその逆でpythonからc++を呼び出すようにすれば良さそうに思えますが、生憎c++からPythonを呼び出すのは、それほど分かりやすくありません。Pythonからc++を呼び出すにしてもopenframeworksのようなイベントループを持っているプログラムがどのように動くのか良く分かりません。
次点の案は、ソケット通信のようなネットワークで接続する方法です。すでにhiro_handleがCORBAでQNXと通信しているので、ネットワークを2つリレーすることになるので一見非効率な気もしますが、ネットワークサーバー化してしまうことでCORBAの使いにくいところを改善することも出来ます。産総研の先生方に怒られてしまいそうですが、今回はこれで行くことにします。
9.2 ネットワーク接続の方法の検討
手軽に書けるネットワーク通信ライブラリで思いつくものは、
- ソケット通信
- Open Sound Control
- XML-RPC
などがあります。このページでは、最終的に使い勝手とパフォーマンスの良い2を使いますが、動作テストのためにまず3でサーバを書いてみることにします。とりあえずXML-RPCを使う理由は、Pythonと親和性が良いため関数呼び出しが簡単に書けるためです。テストにしか使わない理由は、致命的に動作速度が遅いこと*1とサーバ側の関数が終了しない限りプロセスが戻ってこないためです。
9.3 XML-RPC
hiro_test.pyに修正を加えてXML-RPCを使えるようにしていきましょう。XML-RPCはhttpから他のプログラムの関数を実行するWEBツールとしてよく使われるので、pythonでは標準でサポートされています。xmlrpclibをimportするだけで使えるようになります。また、簡単にサーバを構成できるように補助クラスSimpleXMLRPCServerも用意されていますのでimportします。
import sys
from hiro_handle import *
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
hiro=HiroEnv(sys.argv, NS_HIRO)
hiro.init()
hiro.servoOff(doConfirm=False)
hiro.calibrateJoint()
server = SimpleXMLRPCServer( ("localhost", 8000) )
print "Listening on port 8000..."
server.register_function(hiro.getJointAnglesDeg, "getJointAnglesDeg")
server.serve_forever()
下4行でサーバを作り、関数呼び出しルールを登録し、サーバを実行するという処理をしています。SimpleXMLRPCServerの引数は、待ち受けIPアドレス、PORT番号です。register_functionの引数は、実行されるpythonの関数、呼び出しキーワードです。server_foreverでサーバが実行され永久ループに入ります。
間違えていきなりロボットが暴走してしまったら怖いので、まずは関節角度取得をして見ます。
*1:1回の呼び出しで100msecぐらい