PepperとPython3の連携

By | 2018年6月26日

PepperをPythonのみで開発ができるPythonSDKが提供されています。こちらを用いることで、Pepperとtensorflowを連携させて物体認識ができたりと、高度なアプリを開発することができます。しかし、PythonSDKはPython2系のみ対応しています。よって、現在Python3系ユーザにとっては不便な環境です。そこで、本記事ではPepperのAPIを用いる部分のみPython2系で書き、その他の処理をPython3で記述できる方法をご紹介します。

subprocess

Pythonのライブラリであるsubprocessを用いることで、コマンドラインに命令を下せます。また、 標準出力を取得することも可能です。

応用例

以下のプログラムはPepperにQRコードを読み取らせて、Doorkeeperから出席者の名前を取得するプログラムになります。Python3は Python2と違い、Unicodeを指定せずとも日本語を扱うことが可能です。

# coding=utf-8
import sys
import time
from naoqi import ALProxy
from naoqi import ALBroker
from naoqi import ALModule
from optparse import OptionParser
import subprocess
import multiprocessing
class QRCodeReaderModule(ALModule):
    def __init__(self, name):
        ALModule.__init__(self, name)
        self.tts = ALProxy('ALTextToSpeech')
        global memory
        memory = ALProxy('ALMemory')
        memory.subscribeToEvent('BarcodeReader/BarcodeDetected', 'QRCodeReader', 'onQRCodeDetected')
        time.sleep(5)
        print('QRCodeReaderModule is ready.')
    def crawl_doorkeeper(self, url):
        output = subprocess.check_output(['python3', 'crawl.py', url])
        return output
    def guide_guest(self, data):
        output = subprocess.check_output(['python3', 'guide.py', data])
        print(output.decode('utf-8'))
        self.tts.say(output)
        return output
    def onQRCodeDetected(self, *args):
        print('A QR code is detected.')
        memory.unsubscribeToEvent('BarcodeReader/BarcodeDetected', 'QRCodeReader')
        data = memory.getData('BarcodeReader/BarcodeDetected')
        url = data[0][0] # get the url from the data.
        data = self.crawl_doorkeeper(url)
        self.guide_guest(data)
        time.sleep(5)
        memory.subscribeToEvent('BarcodeReader/BarcodeDetected', 'QRCodeReader', 'onQRCodeDetected')
def main():
    parser = OptionParser()
    #pepperのIPアドレスとポート番号の設定.
    parser.add_option('--ip', help='IP address of pepper.', dest='ip')
    parser.add_option('--port', help='port.', dest='port', type='int')
    parser.set_defaults(port=9559)
    opts, args = parser.parse_args()
    pepper_ip = opts.ip
    pepper_port = opts.port
    #ALBrokerとは,
    myBroker = ALBroker('myBroker', '0.0.0.0', 0, pepper_ip, pepper_port)
    global QRCodeReader
    QRCodeReader = QRCodeReaderModule('QRCodeReader')
    #takeAndShowPics = TakeAndShowPics(ip, port)
    #takeAndShowPics.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print()
        print('Interrupted.')
        myBroker.shutdown()
        sys.exit()
    if __name__ == '__main__':
        main()

Python3をメインに扱うエンジニアのみなさん、PepperアプリをPython3で開発してみませんか。

コメントを残す

メールアドレスが公開されることはありません。