スキップしてメイン コンテンツに移動

Pepper SDK入門(7) UIスレッドとワーカースレッド

前回、アクションについて解説するなかで同期と非同期の区別が登場しました。今回はその同期と非同期について、UIスレッドとワーカースレッドの二つを主軸に見ていきます。

同期と非同期

Pepperではタブレットと本体でそれぞれ異なるプロセスが動いており、二つのCPU間にはUSBを経由したTCP/IPによる通信があります。 同期と非同期のどちらでアクションを実行するかは、実際に動かしてみた上での選択をお勧めします。

1.UIスレッド 

Androidシステムからのコールバック(onCreateやOnClickListenerなど)はUIスレッド上で動作します。
@Override
protected void onCreate(Bundle savedInstanceState) {
}
@Override
protected void onResume() {
}
タブレットからPepperに指示を出した場合、Pepperとタブレット間での通信が発生します。しかしUIスレッド上でのネットワーク通信は出来ないため、NetworkOnMainThreadExceptionがスローされてしまいます。そのため、UIスレッドからPepperに指示を出す際は非同期を使用するようにしてください。

実践:同期と非同期
同期:UIスレッドで呼ぶことができない
// UIスレッド
Say say = SayBuilder.with(qiContext)
        .withText("こんにちは")
        .build(); // NetworkOnMainThreadExceptionがスローされる
// UIスレッド
goTo.run(); // NetworkOnMainThreadExceptionがスローされる
非同期:UIスレッドで呼ぶことができる
// UIスレッド
Future<say> sayBuilding = SayBuilder.with(qiContext)
        .withText("こんにちは")
        .buildAsync(); 
// UIスレッド
goTo.async().run();

2.ワーカースレッド

続いて、ワーカースレッドについて見ていきましょう。Androidのワーカースレッドは独自で管理することも可能ですが、QiSDKのライブラリに任せることもできます。
QiSDKは複数の方法により、ワーカースレッドで処理を実行させることが可能です。
例① ロボットライフサイクル
@Override
public void onRobotFocusGained(QiContext qiContext) {
}
@Override
public void onRobotFocusLost() {
}
例② Futureチェーン
future.thenConsume(future -> {
});
例③ リスナー
qiContext.getHumanAwareness().addOnHumansAroundChangedListener(humans -> {
});
以上の例はすべて、UIスレッド上ではなくワーカースレッドで同期します。

実践:非同期が有効なシーン

2-1.アクションをキャンセルしたい場合
非同期でアクションを実行する必要があります。
Future<void>goToFuture = goTo.async().run();
...
goToFuture.requestCancellation();
2-2.複数のアクションを同時に実行したい場合
複数のアクションを、非同期で連続して実行する必要があります。
Future<void>sayFuture = say.async().run();
Future<void>goToFuture = goTo.async().run();
2-3.その他の場合
上記の2-1、2-2に該当しない場合は、同期か非同期のいずれかでアクションを実行します。
say.run();
もしくは
Future<void> sayFuture = say.async().run();

コメント

このブログの人気の投稿

Pepper SDK入門(1) Pepper SDKプラグインのインストール

Pepper SDK for Androidのサイトが黙々とアップデートされています。そろそろ感もありますので、Pepper SDK for Androidの公式サイトを読みつつ、理解したことをまとめていきたいと思います。 Android Studio対応版Pepperでは、AndroidのActivityからAPIを使用して、会話や動きを制御することが出来るようです。Pepper SDK for AndroidはAndroid Studioのプラグインであり、グラフィカルツール、Javaライブラリ、QiSDKを提供します。 Android Studio対応版Pepper向けのロボアプリを開発するため、以下に従って開発環境を整えましょう。 《OSバージョンの確認》 まずは、OSとバージョンの互換性を確認してください。 Linux … Ubuntu 16.04 Xenial Xerus - 64bits only Windows … Microsoft Windows 10 - 64bits only Mac … Mac OS X 10.12 Sierra 《Android Studioのインストール》 ロボアプリはPepperにビルトインされたAndroidのタブレット上で動くアプリであり、それによって開発を行うため、Android Studioのインストールが必要です。 <必要なもの> ・Android Studio Version 2.3かそれ以降 最新の安定したバージョンのインストールを推奨しています。 ・Java Development Kit (JDK) Android Studioの動作環境 Android Studioのインストールにあたっては、以下の公式インストールガイドに従ってください: http://developer.android.com/sdk/index.html 《Android SDKとビルドツールの入手》 Androidのアプリを開発するために、Android SDKとビルドツールのインストールが必要です。 <手順> ① Android Studioのツールバーから、 SDK Managerをクリックすると、SDK Managerが表示さ...

Pepper SDK入門(3) はじめてのロボアプリ開発②

Androidプロジェクトの作成及びロボアプリの初期設定を行った前回に引き続き、Pepperのエミュレータと実機でアプリを実行するために必要な手順を確認していきます。 1.Pepperのエミュレータ  まずは、Pepperのエミュレータで動作確認するための方法についてです。 <手順> エミュレータボタン をクリックしてください。すると、ロボットエミュレータが表示されます。 プロジェクトにおける実行の構成でappが選択されているか を確認し、 選択されていない場合はそれを選択してください。 実行ボタン をクリックしてください。すると、Select Deployment Targetダイアログが表示されます。 ダイアログからPepperのエミュレータを選択してください。アプリがエミュレータにインストールされ、Robot Viewer上のバーチャルロボットで動作確認することが出来ます。 2.Pepperの実機  次に、Pepperの実機で動作確認するための方法を見ていきます。 <手順> Pepperのタブレットの設定を確認します。タブレットのホームにある設定アイコンをタップし、以下の設定を確認してください。 開発者モードが有効になっていること 開発者向けオプション、デバッグ、ADBも有効になっていること Android studioで、接続ボタン をクリックし、Robots Browserを表示してください。 Use fix portとUse fixed IP/hostnameにチェックを入れ、接続先のPepperのIPアドレスを入力してください。PepperのIPアドレスはタブレットの通知バーか、胸部ボタンを一回押すことで確認できます。 Selectボタンをクリックしてください。すると、セキュリティの警告が表示されます。 Pepperのパスワードを入力してください。初期パスワードはnaoです。変更している場合は管理者に確認して下さい。パスワード入力後にOKボタンをクリックすると、Robot Viewerが表示されます。 Pepperの実機に接続すると、同時にタブレットにもADB経由で接続されます。 プロジェクトにおける実行の構成でa...

Pepper SDK入門(11) Robot ViewerとRobot Browser

Robot emulatorについては「 Pepper SDK入門(3) はじめてのロボアプリ開発② 」でも触れましたが、もう少し詳しく見ていきたいと思います。 Robot emulatorは、下記のモジュールから構成されています。 モジュール名 概要 NAOqi Robot emulatorエンジン。実機での操作をエミュレートする。 Robot Viewer Pepperの挙動のシミュレーションを表示する。 AVD Android仮想デバイス。Pepperのタブレットと同じ形状をしており、アプリはここで実行される。 以上の3つは同じライフサイクルを持っているため同時に起動し、一つでも停止すればすべてが停止します。 1.Robot Viewer Robot viewerにはpluginが接続しているPepperをモニタリングするツールがまとまっており、以下のような機能が利用できます。 Robot viewによる、Pepperの3Dモデル表示 Motion Viewによる、Pepperの関節の角度設定 Dialog viewによる、音声認識の結果や発話内容の表示 Log viewによる、Pepper本体側のログの表示 pluginがPepperに接続するタイミングで、Robot Viewerは自動で起動します。 <手順> Android StudioのToolsメニューのPepper SDKからEmulatorを選択するか、ツールバーのエミュレータボタン をクリックしてください。robotsdk.xmlに設定されているAPIレベルに応じたエミュレータが起動します。 1-1.Robot view Robot viewは接続しているPepperの状態を表示します。 エミュレータに接続している場合、Pepperは青い背景で表示されます。 実機に接続している場合、Pepperは緑の背景で表示されます。 Robot viewのツールバーで、表示内容を設定できます...