ENGINEER BLOG

ENGINEER BLOG

Pepperとサーマルプリンターの連携方法

こんにちは。コンサルティングサービス本部、野村です。
今回はPepperを店舗やイベントで利用する際、出来ると色々な用途に使える
サーマルプリンターとPepperとの連携方法をご紹介いたします。

 

構成


サーマルプリンターと連携するにはいくつかのやり方ありますが、
今回は比較的簡単に連携できる以下の方法をご紹介してみます。

printer

Pepper側からのトリガーにより、Windows上のPDFをPythonを使って
サーマルプリンターへ出力します。
※弊社では下記プリンターを使用しました。
 Star TSP100futurePRNT

 

Pub/Subモデルについて


次に、Pepperの特徴的なアーキテクチャーであるPub/Subモデルについて
簡単にご説明しておきたいと思います。

Pub/Subモデル(出版-購読モデル)とは、メッセージを送る(出版)側と
受け取る(購読)側とで非同期的にメッセージのやりとりを行うことができるプログラミングモデルで、
ブローカーと呼ばれる中間層が互いをハンドリングすることで疎結合化を実現しています。

Pepperのソフトウェア構成もPub/Subモデルをとっていて
ALMemoryというメモリキーを介して各デバイス間でメッセージのやりとりを
行うことができるようになっています。

 

Pythonの実装


次に、Python側の実装方法です。

【準備】


Pythonのインストール
 下記からPython2.7をダウンロードしてセットアップします

 https://www.Python.org/

Python SDKのインストール
 AldebaranのサイトからPython 2.7 SDKをダウンロードしてセットアップします

 https://community.ald.softbankrobotics.com/ja/resources/software/language/ja

 

【subscribe(購読)してPDFへ出力する】


●qi.Application APIでPepperからのメッセージを非同期で待ち受けます。

if __name__ in '__main__':
  app = qi.Application()
  session = app.session
  #接続先のIPアドレス
  session.connect("tcp://192.168.xxx.xxx:9559")

  #接続確認 
  tts = session.service("ALTextToSpeech")
  tts.setLanguage("Japanese")
  tts.say("接続しました。")
  mem = session.service("ALMemory")

●adobe readerを開始します。(環境によって随時変更してください)

   acrobat = r'C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe'
   cmd1 = '"{}" /H'.format(acrobat)
   proc = subprocess.Popen(cmd1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

●1秒ごとにPepperからのメッセージをsubscribeします

   i = 0
   try:
        while True:
            time.sleep(1)
            #メモリの購読
            sub = mem.subscriber("xxx/xxxxx")
            sub.signal.connect(functools.partial(mycallback, "xxx/xxxxx"))
            i = i + 1
   except KeyboardInterrupt:
        proc.kill()

●pdfを出力します

   def mycallback(key, value):
     print("val:{0}".format(value))
     pdffile = format(value)
     printer = "PRINTER_NAME"
     r_print(pdffile, printer)

   def r_print(pdffile, printer):

     cmd = '"{}" /N /T "{}" "{}"'.format(acrobat, pdffile, printer)

     proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     stdout, stderr = proc.communicate()

 

Pepperの実装


次に、Pepper側の実装方法です。

【印刷させたいタイミングでraiseEvent(出版)する】

●印刷させたいタイミングでPDF名を送ってメモリーキーにraiseEventします。

raise

これだけ。

 

まとめ


サーマルプリンターからちょっとした引換券やチケット等を
プリントアウトすることでイベントを盛り上げたりと、
色々な利用方法がありそうです。