PepperからPython Milkcocoa SDKを使ってpushしたメモ

最近、PepperとMilkcocoaを連携する機会がありましてPepperからPython Milkcocoa SDKを使ってpushしたメモです。

どうやらPythonをがんばればPepperと連携できることが分かる

まず、Pepper用Tweetボックスをつくる の記事を見て、どうやらPythonボックスでPythonを書けばPepperと連携できることが分かりました。

さらに、MQTT Publisher ボックスを作るの記事を参考にして、外部からPythonライブラリを入れればできることが分かりました。

image

Choregraphe2.5.5.5のバーチャルロボットで動かすようにしてみます。

ネットワークの検証であればバーチャルロボットでもできるので便利。

MilkcocoaにはPython SDKがある

そして、MilkcocoaにはPython SDKがあります。

milk-cocoa/python_sdk: Milkcocoa python sdk

まず、こちらのMilkcocoaのpython sdkをダウンロードして移植します。

pepperに外部モジュール追加してみる。とりあえずrequestsで。 – Qiita

こちらの記事を参考にして、

image

libフォルダにMilkcocoaライブラリ本体を入れてChoregrapheに読み込みます。

image

このように入りました。これでライブラリが使えるようになります。

Pythonボックスでpushのコードつくる

image

Pythonボックスで作っていきます。

image

起動するとWaitしたのちにPush Milkcocoaと書かれたPythonボックスに到達してメッセージを送るようにします。

image

あらかじめ、Milkcocoa側でアプリIDを確認しておきましょう。

ソースはこちらです。

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.framemanager = ALProxy("ALFrameManager")
        self.folderName = None
        self.milkcocoaClient = None
        self.datastore = None

    def onUnload(self):
        import sys
        if self.folderName and self.folderName in sys.path:
            sys.path.remove(self.folderName)
        self.folderName = None
        self.milkcocoaClient = None
        self.datastore = None
        self.logger.info("onUnload");

    def onInput_onStart(self, p):
        import sys, os

        self.folderName = os.path.join(
                    self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
        if self.folderName not in sys.path:
            sys.path.append(self.folderName)
        for moduleName in os.listdir(self.folderName):
            # モジュールのreload
            if moduleName in sys.modules:
                self.logger.info("Loaded: %s, %s" % (moduleName, sys.modules[moduleName].__file__))
                reload(sys.modules[moduleName])

        import milkcocoa.milkcocoa as milkcocoa
        # MilkcocoaAppIDは自分のものに変更する
        milkcocoaClient = milkcocoa.Milkcocoa.connect("MilkcocoaAppID", useSSL=False);
        datastore = milkcocoaClient.datastore("python")
        datastore.push({"content":"Hello"})

        self.milkcocoaClient = milkcocoaClient;
        self.datastore = datastore;

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box

こちらをPythonボックスをダブルクリックしたスクリプトウィンドウに入れます。

image

動かしてみる

image

実際にバーチャルロボットを動かしてみます。

image

到達します。

image

Milkcocoaのデータストアを確認するとメッセージが送られています!

補足情報

SSL通信でハマる

セキュアだと良いだろうということで、一旦、デフォルトのMilkcocoaのSSL通信を試みましたがエラーがでてしまったので、以下の記事を参考にuseSSL=Falseで対応しました。

Milkcocoaのpython sdk使おうとしていろいろはまった話 | takemikami's note

Milkcocoa切断後の開放がうまくいかない?

また、今回のソースの場合、Milkcocoaに接続されるのは良いのですが、切断後の開放がうまくいかないようなので、コネクション数が実行するたびに増えるようです。これがバーチャルボックスで動かしているためにうまくいかないのか、実機だとうまく破棄されるのかは、まだ追いきれていないので、また機会があれば調べてみます。

まとめ

というわけでPepperからPython Milkcocoa SDKを使ってpushしてみました。

これができると、Pepperの手を握るとMilkcocoa側にデータが記録されて、クラウド上のさらなるアクションにつなげたり、Milkcocoaと相性の良いIoT機器とつなぐことで、面白い反応につなげることも可能だと思いました!

それでは、よきPepper & Python & Milkcocoa Life を!