AndroidアプリからPepperに接続して発話させてみる

今回はqisdkを使ってAndroidアプリとPepperの連携する方法について紹介します。


<h2>qisdkを使うための下準備</h2>

qisdkを使えるようにするためにリポジトリと依存関係の追加を行います。

<h4>リポジトリの追加</h4>
/build.gradle を編集してPepper SDKのリポジトリを追加します。

```
allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'http://android.aldebaran.com/sdk-beta/maven'
        }
    }
}
```

<h4>依存関係の追加</h4>
/app/build.gradle を編集してdependenciesに「api 'com.aldebaran:qisdk:1.3.3'」を追加します。

```

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'


    api 'com.aldebaran:qisdk:1.3.3'
}
```

<h2>Pepperと連携するためのクラスを実装</h2>
Pepperと連携するための手順は以下の通りです。

1. Session.connectに接続したいPepperのIPを渡して接続する
2. Session.serviceにて必要なALモジュールを取得する
3. Future.callを用いてALモジュールが持っているメソッドを呼び出す


```
package jp.co.happyhack.androidsample;

import com.aldebaran.qi.AnyObject;
import com.aldebaran.qi.Session;

public class Pepper {
    private static final String MODULE_NAME_ALTEXTTOSPEECH = "ALTextToSpeech";

    // Pepperとスマホの接続情報
    private Session mSession = null;
    private AnyObject mALTextToSpeech = null;
    private ConnectionCallback mCallback = null;

    /**
     * PepperとのSessionリスナー
     * 接続、切断されたらコールバックする
     */
    private Session.ConnectionListener mConnectionListener = new Session.ConnectionListener() {
        @Override
        public void onConnected() {
            try {
                mALTextToSpeech = mSession.service(MODULE_NAME_ALTEXTTOSPEECH).get();
            }catch(Exception e){
                disconnect();
            }
            if(mCallback != null){
                mCallback.onConnected();
            }
        }

        @Override
        public void onDisconnected(String s) {
            if(mCallback != null){
                mCallback.onDisconnected();
            }
        }
    };

    /**
     * 指定されたIPのPepperに接続する
     * @param ipAddress
     * @param callback
     * @return
     */
    public Boolean connect(String ipAddress, ConnectionCallback callback){
        Boolean result = false;
        if(mSession == null){
            mSession = new Session();
            mSession.addConnectionListener(mConnectionListener);
        }

        if(callback != null && !mSession.isConnected()){
            mCallback = callback;
            mSession.connect(ipAddress);
            result = true;
        }

        return result;
    }

    /**
     * Pepperとの接続を切断する
     */
    public void disconnect(){
        if(mSession != null){
            mSession.close();
            mALTextToSpeech = null;
        }
    }

    /**
     * チェックイン結果をPepperに送信する(ALMemory.raiseEvent)
     * @param phrase
     */
    public void say(String phrase){
        if(mALTextToSpeech != null)
            mALTextToSpeech.call("say", String.format("\\vct=130\\ \\rspd=110\\ %s", phrase));
    }


    /**
     * Pepperとの接続状況をコールバックするためのIF
     */
    public interface ConnectionCallback{
        void onConnected();
        void onDisconnected();
    }
}
```

今回はALTextToSpeechを使って発話させるメソッドのみを用意していますが、
ALMemoryやALMotionなど様々なALモジュールにアクセスすることが出来ますので、
是非、お試しいただければと思います。

<h2>注意事項</h2>

- qisdk自体、ちょいちょい更新されているっぽく、以前動いていたものが動かなくなったりします。普通にします。
- ロボアプリが動作しているところにAndroidアプリから発話やモーションを割り込ませた場合にロボアプリの動作がおかしくなる可能性があります。ご利用は計画的に。


<h2>サンプルコード</h2>
GitHubに挙げてありますので参考にして下さい。
https://github.com/y-minabe/AndroidSample