Pepperタブレットのフリーズ回避


この記事の内容

 Pepperアプリでは、たまにタブレットからのイベントが本体で受信できないことがあります。タブレット側のレスポンスを前提にアプリが構築されていた場合、アプリが進まなくなるためフリーズしてしまうおそれがあります。フリーズの回避方法と既存アプリでの確認方法を考えてみたいと思います。

フリーズ回避方法

 タブレットから送信されたメッセージが本体側で受信できないことにより、アプリがフリーズする場合があります。そのため、タブレットからのメッセージ受信を前提とするアプリではタイムアウトルーチンを設けて、アプリのフリーズが回避できます。

 次のようにプログラムすると、一定時間後タブレットからメッセージが来なかったとしても、アプリの進行は止まることはありません。

 正常にメッセージを受信できた場合のタイマー停止をお忘れなく。

既存アプリでの確認方法

 開発済みのアプリでタイムアウトが実装されているか確認する方法を考えてみたいと思います。以下の3ステップのアプローチが有効と考えられます。

1.raiseEventによるALMemoryキーの確認
2.ALMemoryキーによるボックスの確認
3.ボックスごとの実装の確認

1. raiseEventによるALMemoryキーの確認

1.ロボアプリの中に含まれているbehavior.xar以外のファイルに対して文字列”raiseEvent”の検索(grep)を行います。

プロジェクトフォルダ内のgrepコマンド例
> grep -r raiseEvent . | grep -v behavior.xar
./html/js/common.js:   ALMemory.raiseEvent("/Key/AppSample2, val);

2.検索結果にマッチしたファイル(JavaScriptあるいはHTML)をリストアップします。
3.該当ファイルのソースコードを確認し、”raiseEvent”に渡されるALMemoryキーリストを作成します。ラッパー等別メソッド経由で呼び出されている場合も同様です。

2. ALMemoryキーによるボックス名の確認

1.raiseEventによるALMemoryキーの確認で作成されたALMemoryキーリストをbehavior.xarから見つけ出します。behavior.xarをエディタで開き、ALMemoryキーリストを検索します。一般的にbehavior.xarはChoregrapheで開きますが中身はXMLですので、テキストエディタで開けます。
注意:behavior.xarの編集はテキストエディタで編集は意図しない不具合やプログラムの破損に繋がるため、検索のみに留めます。
2.エレメント内に関連するALMemoryキーが含まれていた場合、エレメントのname属性をボックス名としてリストアップします。
 ※複数のbehavior.xarがある場合、behavior.xarごとに同様の処理が必要になります。

3. ボックスごとの実装の確認

1.Choregrapheでロボアプリプロジェクト(.pml)を開きます。
2.該当のbehavior.xarを開きます。
3.[プロジェクトオブジェクト]パネルから、虫眼鏡ボタンをクリックし、検索窓よりリストアップしたボックス名を検索します。[プロジェクトオブジェクト]パネルが表示されてない場合は、メニュー[表示]-[プロジェクトファイル]より[プロジェクトパネル]を表示させ、パネル下部の[プロジェクトオブジェクト]タブをクリックし表示できます。

プロジェクトオブジェクトパネル
4.対象のボックスがダイアグラムの場合、ダイアグラム内にイベントの出力口が確認できます。対象のボックスがPythonスクリプトボックスの場合、タブレット側からのコールバックが確認できます。
5.タブレットからイベントが来なかった場合に備え、タイムアウト等の回避策が実装されているか確認します。
例1)タイムアウト処理を追加:raiseEventと処理の間にタイムアウト処理を追加する。(前掲タブレットタイムアウトで紹介している方法です)
 ※複数のbehavior.xarがある場合、behavior.xarごとに同様の処理が必要になります。