はじめに
イベントなどで、Pepperをプレゼンターとしてブース前に設置することが増えてきました。
基本的には、来客した方が自由にPepperとコミュニケーションをとってもらい、来客者がトリガー(胸パネルを操作したり)となって製品の紹介をPepperがするのですが、
運営側のタイミングで「お客さんに気づかれない方法でPepperの挙動を制御したい」場合があったりします。
そこで、以下の要件を満たすための仕組みを考えてみました。
- Pepper自体はお客さんに自由に触ってもらいたい(胸パネル、頭、手など)
- お客さんが話しに食いついてきたときに、接客員が明示的にPepperのデモンストレーションを制御したい
- 接客員が操作していると分からないような方法がうれしい
- お客さんに自由に触ってもらっているときに、Pepperのデモンストレーションが起動しないようにしてほしい
- WiFiでつないでの外部機器からの操作は通信環境が悪い。安定した操作がしたい
- 接客員に覚えられる方法で操作できるようにしてほしい(複雑な操作はできない)
- Pepperのデモンストレーションのパターンは3つ
・・・言うは易し。。
いくつか考えた案の中から、今回は
「Pepperの特定のセンサーを長押ししてイベント発火させるボックス」
を作ることにしました。
環境
- Pepper for Biz (NAOqi OS 2.4.3.28)
- Choregrape 2.4.3.28 (windows7環境)
pythonボックス
入力
メソッド名 | 引数 | 説明 |
---|---|---|
onStart | ダイナミック | タッチイベントの戻り値 |
出力
メソッド名 | 引数 | 説明 |
---|---|---|
onStopped | ダイナミック | 0:タッチセンサが押された 1:長押し状態が「Timeout (s)」に満たずにタッチセンサ押下状態が解除された 2:長押し状態が「Timeout (s)」を超えてタッチセンサ押下状態が解除された |
パラメータ
変数 | 型 | 説明 |
---|---|---|
memkey_tatch_start | 文字列 | センサーをタッチしたときのタイムスタンプを保存するメモリキー |
Timeout (s) | 整数 | 長押しする時間(秒) |
CallBackEventKey | 文字列 | 長押し経過後に発火するイベントキー |
フロー
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 )
ロジックはいたって単純。
- 「イベント追加」でタッチセンサーのイベント発火を待ち受ける(今回は、左足バンパー「LeftBumperPressed」)
- 左足バンパーが押された場合「1.0」が引数としてくるので、押された時のタイムスタンプをメモリキー(memkey_tatch_startに設定したメモリキー)に保存
- 左足バンパーが押された状態から解除された場合「1.0」以外がくるので、解除されたときのタイムスタンプと、メモリキー(memkey_tatch_startに設定したメモリキー)に保存しているタイムスタンプの差を比較する
- タイムスタンプの差が「Timeout (s)」で設定した長押しする時間を超えている場合は、「CallBackEventKey」に設定したイベントキーを発火させる
- タイムスタンプの差が「Timeout (s)」で設定した長押しする時間を超えていない場合は、なにもしない
さいごに
長押しのときに、「Timeout (s)」を経過したかどうか、押された状態から解除されないと分からないので、
解除するタイミングを伝える手段が必要と指摘があった。
しかし、それはまた別の物語。。。ということで、また次回。