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

投稿

5月, 2019の投稿を表示しています

Pepper SDK入門(9) オートノマスライフ

オートノマスライフについて、簡単な概要を説明します。 自律モードの管理 Pepperはオートノマスライフというモードを持っており、人間の検知や追跡、音への反応や立ち位置の調整といった振る舞いを、自律して自然に行い、Pepperをより生き物らしく見せています。 1.Autonomous abilities Autonomous abilitiesとは、Pepperに備わる複数の自律行動の機能のことです。自律行動はPepperへ生命らしさを与えるため、移動・アニメーション・顔追跡によって構成されています。 2.Autonomous abilitiesの管理 写真撮影など、Pepperのアニメーションの動きを完全に停止させたい場合には、Autonomous abilitiesを止める機能を使用してください。ここでは概要のみの記述ですが、詳細はまた改めて解説します。 いつもよりも短いですが、今回はここで終了です。次回はアニメーションブラウザについて見ていきます。

Pepper SDK入門(8) アクションの連結

同期と非同期について、今回は様々なクラスやメソッドと共に解説を行っていきます。 1.同期と非同期 アクションを順番に実行したい場合、同期で実行するようにコードを書く必要があります。 //animateアクションのビルド Animate animate = ...; //animateアクションを同期で実行 animate.run(); //listenアクションのビルド Listen listen = ...; //listenアクションを同期で実行 listen.run(); ここでは Animate と Listen を同期で順番に実行していますが、これらのアクションは非同期で実行することも可能です。 //animateアクションを非同期で実行 animate.async().run(); //listenアクションを非同期で実行 listen.async().run(); 単純にこれらのアクションを非同期で実行してしまうと、アクションが連結していないため双方のアクションが同時に開始されます。一つ目のアクションが終了してから二つ目のアクション(ここではAnimateが終わった後のListen)を開始するよう非同期で実行したい場合には、複数のアクションを連結させる必要があります。 2.Futures Futureクラスについて説明します。 Futureとは Futureクラスは非同期の操作をラップするオブジェクトであり、主として次のような非同期の処理を行うために使用されます。 アクションやリソースといったオブジェクトの作成 アクション実行の取り扱い(結果の取得やアクションのキャンセル) 複数のアクション実行やリソース作成の連結 Futureの状態 Futureの状態には成功、アクションのキャンセルもしくはエラーの3つがあり、成功した場合には値を返却することがあります。 Future<T>は戻り値の型にTを対応付けるジェネリッククラスであり、例えばFuture<String>インスタンスであればStringが返却されます。値を返却しないような場合にはFuture<Void>を使用します。 また、getメソッドを使用することで同期的な値の取得が可能です。 Fu

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.ワーカースレッド 続いて、ワーカースレッド