"NUWA Robot SDK"は、NUWA Robotics 製のロボット(2019年11月現在、日本ではケビーのみ対応)用のアプリ開発キットです。Android Qをベースに動作しており、Android Studioを利用してアプリを作成することが可能です。
NUWA Robot SDKは、次の開発環境をサポートしています。
最新情報は、公式ホームページで公開しています。
NUWA Robot APIが含まれるAndroid Archive(aar)の他、サンプルコード、チュートリアルなどを提供しています。
※ 本ドキュメントは、初心者向けの日本語チュートリアル(オリジナル)となります。NUWA Robot SDK Manual 1.1 をベースに解説しています。最新の情報は公式のドキュメントを参照してください。
本ドキュメントでは、NUWA Robot SDKの簡単な使い方を解説しています。NUWA Robot SDKの概要については、NUWA Robot SDK Manual、APIの詳細につきましては、NUWA Robot SDK Javadoc を御覧ください。
ケビーのアプリは、WindowsでもMacでも開発が可能です。本ドキュメントでは、Mac(Catalina)で開発を行っています。
開発には、Android Studioが必要です。最新版のAndroid Studioを用意してください。
※本ドキュメントでは、執筆時の最新版である 3.5.2 を使用しています。
最初に、以下の手順で、ケビーを開発者モードに設定します。



この画面から、「端末情報」にある「ビルド設定」を探して、「ビルド番号」を連打してください。「システム」の「詳細設定」に「開発者向けオプション」が追加されます。

ケビーをUSBケーブルで接続します。
Please get USB password from [NUWA Robot SDK Manual]
※ 自分の環境では、手持ちのUSB-Cケーブル(両端ともにUSB-C)だと認識しなかったので、ケビーに付属しているUSB-Cケーブル(USB-CとUSB-2.0)に変換アダプターをつけたところ正常に認識しました。
それでは、簡単なKebbi用のアプリを作成してみましょう。
「Start a new Android Studio project」を選択して、新しいプロジェクトを作成します。

「Empty Activity」を選んでください。

今回は、「HelloKebbi」という名前にしました。
※ Languageは、Javaを選択してください。
※ Minimum API level は、「API 26: Android 8.0 (Oreo)」を選択してください。

NUWA Robot API を利用するためのライブラリを設定します。
最初に、左上のメニューから「Project」を選択します。

次に、appフォルダの中のlibsフォルダに、KiwiSDKの最新版の.aarファイルをコピーします。

コピーが成功すると、このようになります。

appフォルダの中の「build.gradle」の一番最後に、以下の記述を追加します。
repositories {flatDir {dirs 'libs'}}

最後に、「build.gradle」のdependenciesの最後に以下を追記します。
xxxxxxxxxx// include Nuwa Robot SDK in /libsimplementation(name: 'KiwiSDK_RPC_2019-10-03_v1.0.1.9.54caff0', ext: 'aar')

それでは、プログラムを作成していきましょう。
appフォルダの中にあるsrcフォルダから、MainActivity.javaを探してください。

AppCompatActivityに、以下の行を追加します。(自動的に、NuwaRobotAPIを利用するためのimportが追加されます。以下同様です。)
xxxxxxxxxxprivate NuwaRobotAPI mRobot;

onCreateに、APIを使うための初期処理を記述します。また、イベントを処理するための関数も用意しましょう。以下のようにonCreateを書き換えてください。
x @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //init kiwi sdk String your_app_package_name = getPackageName(); IClientId id=new IClientId(your_app_package_name); mRobot = new NuwaRobotAPI(this, id); // register Nuwa Robot Listener registerNuwaRobotListener(); } void registerNuwaRobotListener() { }
次に、ケビーから発生するイベントのリスナーを定義していきましょう。
先ほど作成した「void registerNuwaRobotListener」の中に以下をコピペしないで記述していってください。
xxxxxxxxxxmRobot.registerRobotEventListener(new RobotEventListener
そうすると、こんな感じで入力補助が出るので選択します。

閉じカッコでエラーになっているので

このように修正します。

修正が終わったら、以下のプログラムも追加してみてください。
xxxxxxxxxxmRobot.registerVoiceEventListener(new VoiceEventListener
最終的に、registerNuwaRobotListenerは、以下のようになります。入力補助がうまく出来なかった場合は、以下のソースをコピペしてみてください。
xxxxxxxxxxvoid registerNuwaRobotListener() {mRobot.registerRobotEventListener(new RobotEventListener() {@Overridepublic void onWikiServiceStart() {}@Overridepublic void onWikiServiceStop() {}@Overridepublic void onWikiServiceCrash() {}@Overridepublic void onWikiServiceRecovery() {}@Overridepublic void onStartOfMotionPlay(String s) {}@Overridepublic void onPauseOfMotionPlay(String s) {}@Overridepublic void onStopOfMotionPlay(String s) {}@Overridepublic void onCompleteOfMotionPlay(String s) {}@Overridepublic void onPlayBackOfMotionPlay(String s) {}@Overridepublic void onErrorOfMotionPlay(int i) {}@Overridepublic void onPrepareMotion(boolean b, String s, float v) {}@Overridepublic void onCameraOfMotionPlay(String s) {}@Overridepublic void onGetCameraPose(float v, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8, float v9, float v10, float v11) {}@Overridepublic void onTouchEvent(int i, int i1) {}@Overridepublic void onPIREvent(int i) {}@Overridepublic void onTap(int i) {}@Overridepublic void onLongPress(int i) {}@Overridepublic void onWindowSurfaceReady() {}@Overridepublic void onWindowSurfaceDestroy() {}@Overridepublic void onTouchEyes(int i, int i1) {}@Overridepublic void onRawTouch(int i, int i1, int i2) {}@Overridepublic void onFaceSpeaker(float v) {}@Overridepublic void onActionEvent(int i, int i1) {}@Overridepublic void onDropSensorEvent(int i) {}@Overridepublic void onMotorErrorEvent(int i, int i1) {}});mRobot.registerVoiceEventListener(new VoiceEventListener() {@Overridepublic void onWakeup(boolean b, String s, float v) {}@Overridepublic void onTTSComplete(boolean b) {}@Overridepublic void onSpeechRecognizeComplete(boolean b, ResultType resultType, String s) {}@Overridepublic void onSpeech2TextComplete(boolean b, String s) {}@Overridepublic void onMixUnderstandComplete(boolean b, ResultType resultType, String s) {}@Overridepublic void onSpeechState(ListenType listenType, SpeechState speechState) {}@Overridepublic void onSpeakState(SpeakType speakType, SpeakState speakState) {}@Overridepublic void onGrammarState(boolean b, String s) {}@Overridepublic void onListenVolumeChanged(ListenType listenType, int i) {}@Overridepublic void onHotwordChange(HotwordState hotwordState, HotwordType hotwordType, String s) {}});}
これで、プログラムの準備はできました!
おまたせしました!ケビーを喋らせてみましょう。先程追加したイベントリスナーの中から、onWikiServiceStartを探して以下のように修正してください。このイベントは、APIの初期化が終わったら呼び出されるイベントです。
xxxxxxxxxx@Overridepublic void onWikiServiceStart() {Log.d("KEBBI", "onWikiServiceStart");mRobot.startTTS("ハロー、私は、ケビーです。");}
最後にもう一つだけ、イベントリスナーにログを入れてみましょう。
xxxxxxxxxx@Overridepublic void onTTSComplete(boolean b) {Log.d("KEBBI", "onTTSComplete:" + b);}
onTTSCompleteは、ケビーの発話が終わったら呼び出されるイベントです。ケビーに連続した発話や動作をさせたい場合に役に立つでしょう。今回は最初なので、ログを確認できるようにしておきます。
それでは、プログラムを実行してみましょう。パソコンにケビーが接続されていれば、左上の機種名のところにケビーが表示されているはずです。再生ボタンをおせば、プログラムが実行されますよ!

どうでしょう?ケビーはちゃんと話してくれましたか?ついでに、ログも確認しておきましょう。ログの検索に「KEBBI」と入れておくと、余計なログが表示されないので便利です。

アプリを終了させるには、Android Studioの停止ボタンを押してください。ケビーの頭のボタンをおしても見かけ上は終了したようにみえますが、実際はアプリは動作しています。

実行したアプリは、自動的にケビーのメニューに追加されます。次回以降は、こちらからアプリを起動させることも出来ます。

他のアプリのように、プログラム名を指定したり、アイコンを素敵なものに変えれば、あなただけのオリジナルアプリが完成しますよ!
おつかれさまでした、これでチュートリアルは完了です。ケビーのアプリを作るための基本的な流れは理解できたかと思います。とはいえ、まだまだやってみたいことはたくさんありますよね?
まずは、
[NUWA Robot SDK Manual(日本語訳)] NUWA Developer
を読んでみましょう。このドキュメントには、ケビーのアプリを作るためのAPIの使い方が完結に紹介されています。また、公式サイトにもサンプルプログラムなどが公開されているので、参考にしてみて下さい。
たとえば・・・
などといったことが出来るようになりますよ!
とはいえ、まだまだ、ケビーのプログラム環境は充実しているとは言い切れません、みなさんが挑戦したこと、やってみたこと、実際に作成したアプリケーションなど、ぜひqiitaなどで公開していただければとおもいます!
よろしくおねがいします!