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で開発してみませんか。