LoginSignup
5
3

More than 5 years have passed since last update.

Pepperのセンサーを長押ししてイベント発火させるボックスを作成してみた

Last updated at Posted at 2016-09-26

はじめに

イベントなどで、Pepperをプレゼンターとしてブース前に設置することが増えてきました。
基本的には、来客した方が自由にPepperとコミュニケーションをとってもらい、来客者がトリガー(胸パネルを操作したり)となって製品の紹介をPepperがするのですが、
運営側のタイミングで「お客さんに気づかれない方法でPepperの挙動を制御したい」場合があったりします。

そこで、以下の要件を満たすための仕組みを考えてみました。
1. Pepper自体はお客さんに自由に触ってもらいたい(胸パネル、頭、手など)
2. お客さんが話しに食いついてきたときに、接客員が明示的にPepperのデモンストレーションを制御したい
3. 接客員が操作していると分からないような方法がうれしい
4. お客さんに自由に触ってもらっているときに、Pepperのデモンストレーションが起動しないようにしてほしい
5. WiFiでつないでの外部機器からの操作は通信環境が悪い。安定した操作がしたい
6. 接客員に覚えられる方法で操作できるようにしてほしい(複雑な操作はできない)
7. Pepperのデモンストレーションのパターンは3つ

・・・言うは易し。。
いくつか考えた案の中から、今回は

Pepperの特定のセンサーを長押ししてイベント発火させるボックス

を作ることにしました。

環境

  • Pepper for Biz (NAOqi OS 2.4.3.28)
  • Choregrape 2.4.3.28 (windows7環境)

pythonボックス

image3.png

入力

メソッド名 引数 説明
onStart ダイナミック タッチイベントの戻り値

出力

メソッド名 引数 説明
onStopped ダイナミック 0:タッチセンサが押された
1:長押し状態が「Timeout (s)」に満たずにタッチセンサ押下状態が解除された
2:長押し状態が「Timeout (s)」を超えてタッチセンサ押下状態が解除された

パラメータ

image1.png

変数 説明
memkey_tatch_start 文字列 センサーをタッチしたときのタイムスタンプを保存するメモリキー
Timeout (s) 整数 長押しする時間(秒)
CallBackEventKey 文字列 長押し経過後に発火するイベントキー

フロー

image2.png

pythonボックスのコード

def onInput_onStart(self, p):
    import datetime
    try:
        ret = 0
        date = datetime.datetime.now()
        #コールバックイベントキー
        callBackEventKey = self.getParameter("CallBackEventKey") 
        #トリガー時間
        waitTime = self.getParameter("Timeout (s)") 
        #メモリー保存用キー
        memoryKey = self.getParameter("memkey_tatch_start") 
        if( int(p) == 1):
            #タッチした日時をメモリーへ保存
            self.memory.insertData(memoryKey, date.strftime("%Y/%m/%d %H:%M:%S"))
            ret = 0
        else:
            memDate = datetime.datetime.strptime(self.memory.getData(memoryKey),"%Y/%m/%d %H:%M:%S")
            #日時の差を秒で取得
            diffSecond = (date - memDate).total_seconds()
            if( diffSecond >= waitTime):
                self.memory.raiseEvent(callBackEventKey,p)
                ret = 2
            else :
                ret = 1
        self.onStopped(ret)
    except Exception, e:
        self.logger.error( e )

ロジックはいたって単純。

  1. 「イベント追加」でタッチセンサーのイベント発火を待ち受ける(今回は、左足バンパー「LeftBumperPressed」)
  2. 左足バンパーが押された場合「1.0」が引数としてくるので、押された時のタイムスタンプをメモリキー(memkey_tatch_startに設定したメモリキー)に保存
  3. 左足バンパーが押された状態から解除された場合「1.0」以外がくるので、解除されたときのタイムスタンプと、メモリキー(memkey_tatch_startに設定したメモリキー)に保存しているタイムスタンプの差を比較する
  4. タイムスタンプの差が「Timeout (s)」で設定した長押しする時間を超えている場合は、「CallBackEventKey」に設定したイベントキーを発火させる
  5. タイムスタンプの差が「Timeout (s)」で設定した長押しする時間を超えていない場合は、なにもしない

さいごに

長押しのときに、「Timeout (s)」を経過したかどうか、押された状態から解除されないと分からないので、
解除するタイミングを伝える手段が必要と指摘があった。
しかし、それはまた別の物語。。。ということで、また次回。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3