NUWA Robot SDKを使う環境を整える

この記事は、公開時点での [NUWA Robotics](https://www.nuwarobotics.com/ja/) 社製のロボット Kebbi Air のアプリ開発キット「NUWA Robot SDK」のサンプルコードを手元環境で動かす手順の覚書です。

:::note warn
SDKの入手先は本記事には含まれません。
:::

# NUWA Robot SDKとは
> Android Q をベースに動作する、アプリ開発キット。Android Studio を利用してアプリを作成することが可能。

（[NUWA Robot SDK 日本語チュートリアル](https://developer-docs.nuwarobotics.com/sdk/NUWA_Robot_SDK_Tutorial_jp.html)より）

# 開発環境
私の開発環境です。

- OS：Windows 11 Pro
- Android Studio： Giraffe 2022.3.1 Patch 2
- Gradle Version：8.0
- Android Gradle Plugin Version：8.1.3

執筆中に Android Studio の最新版が出ていたので、別のPCでも試してみました。
記事の中ではこちらの条件で環境を構築していきます。

- OS：Windows 11 Home
- Android Studio：Hedgehog 2023.1.1 Patch 2
- Gradle Version：8.2
- Android Gradle Plugin Version：8.2.2

# 開発の準備
[NUWA Robot SDK 日本語チュートリアル](https://developer-docs.nuwarobotics.com/sdk/NUWA_Robot_SDK_Tutorial_jp.html)をもとに説明していきます。
Kebbiのスクリーンショットは撮り方が分からなかったので、不安な方はチュートリアルの画像も参考にしながら進めてください。

## PC側の準備
アプリの開発には [Android Studio](https://developer.android.com/studio/) を使用します。
最新版をダウンロードしてください。
Android Studio は統合開発環境で、指示通りインストールしておけば後は必要なパッケージやSDKを追加していくだけで開発が行えます。

### サンプルコードの読み込み
まずは実際に動くコードを見ながら学習するのが良いでしょう。
この記事では [NuwaSDKExample](https://github.com/nuwarobotics/NuwaSDKExample) を使用します。
サンプルコードをダウンロードしたら開発を行いたい場所に移動させてください。

Android Studio を開き、「Open」から NuwaSDKExample フォルダを開きます。
Android のアイコンになっているので分かりやすいですね。
既に Android Studio を使用している場合はメニューから「File -> Open」としてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/da3a12be-e775-33f9-6b75-97cddfe830a6.png)
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/cb39c5bb-4033-adb8-b1c2-0aaf41f53ecc.png)
画像ではGitHubからZipでダウンロードしたためにブランチ名が入っていますが気にしないで大丈夫です。

### Gradleの設定
読み込むと、Gradle のビルドが始まりますが，まだこの段階では画像のようなエラーで止まると思います。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/c9c8864d-dc11-258c-ec70-34803d9821af.png)
Gradle のバージョンが低すぎるようです。Upgrade Gradle wrapper to... をクリックすると、アップグレードしてもらえるようですが、これは最新版ではありません。プラグインのアップグレードまでやってもらえるツールがあるのでそちらを使いましょう。
「Tools -> AGP Upgrade Assistant」を選択してください。ちなみに AGP は Android Gradle Plugin の略です。

:::note warn
AGPが開かない場合は最後のトラブルシューティングをご覧ください。
:::

![画像17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/26a29141-63be-db18-c07b-7d5406b9d422.jpeg)
AGP Assistant が開いたら、アップグレードしたいバージョンを選択します。最新版で良いでしょう。
![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/ffac7408-e0bf-94cf-c0ec-8dd14601ff80.png)
バージョンを選択したら「Run selected steps」を押します。
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/5c184108-6584-7690-c54d-a4ad3e171dc4.png)
ここまでの設定で、アプリのビルド環境が整いました。

### SDKの読み込み
NuwaSDKExample/app/（src/と同じ階層）に libs フォルダを作成します。
作成した libs フォルダの中に、ダウンロードした SDK を入れてください。
サンプルコードを動かすためには、NuwaSDK と NuwaBLEInterface ファイル（拡張子は.aar）が必要です。

:::note
SDKはご自分で入手してください。
:::

## Kebbi側の準備
Kebbiの設定を開き、シリアル番号等情報が閲覧できるメニュー（チュートリアルでは「紹介ケビー」となっていますが、私のKebbiでは「ケビー情報」となっていました）を10回連打すると、開発者向けの設定が追加で表示されます。

### KebbiとPCの接続
KebbiとPCを付属のケーブルで接続します。
自前の通信用ケーブルでもいいですが、恐らく USB2.0 でないと正しく認識されません。

USB接続にはパスワードが必要です。
なぜかバージョン違いの[マニュアル](https://developer-docs.nuwarobotics.com/sdk/NUWA_Robot_SDK_jp.html)から確認できます。

## アプリケーションの実行
あとはKebbiに接続して実行すればサンプルが動きます。
一度実行すればアプリは Kebbi 本体に保存されるので、PC と接続しなくても実行することができます。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/6b6af85a-2b0e-727e-b907-6685c845c6b9.png)

Kebbi 接続前に、UI の確認をすることもできます。
「Device Manager -> ＋」で仮想デバイスを追加します。
![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/693c95f0-a330-5a20-a4ef-cdec422971fc.png)
Kebbiと同じ解像度のデバイスを選択すると、正確に UI が確認できてよいかもしれません。画像では適当に Medium Tablet を選択しています。
![画像14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/2bf93e44-fe77-0fb4-ec16-cb060443acca.jpeg)
次に Android のバージョンを選択します。Kebbiは Android 9.0 ですので、合わせると良いでしょう。必要があれば選択してダウンロードしてください。
Kebbi は arm64 らしいですが、仮想デバイスではうまく動かなかったので推奨通り x86 のままで良いでしょう。
![画像15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/5e5e5b10-5beb-cee5-7555-1170fa441a1b.jpeg)
あとは画面の向きを設定して、実行ボタン横でデバイスを選択すれば仮想デバイス上で実行できます。
![画像16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/e5921990-d2b9-83d7-d85d-b25effd8c11e.jpeg)

# おわりに
以上で NUWA Robot SDK を使い、サンプルコードを動かすことができるようになりました。
とりあえず NUWA の SDK を読み込み、動く環境を作ることを第一にしていたので、Android アプリ開発に関係する詳しい話はご自身で調べていただければと思います。
また記述に不明点、誤り等見つけましたらお知らせください。よろしくお願いいたします。

## トラブルシューティング
### AGP Assistantが開かない（2024/7/26追記）
AGP Assistant を使用して変更するファイルとその内容は次の通りです。

- build.gradle
    - classpath（バージョンの更新）
- build.gradle (:app)
    - namespace（追加記述）
- gradle.properties
    - android.defaults.buildfeateres.buildconfig=true（追加記述）
    - android.nonFinalResIds=false（追加記述）
    - android.nonTransitiveRClass=false（追加記述）
- gradle-wrapper.properties
    - distributionUrl（ファイルパスの更新）

とりあえずbuild.gradleの更新をすれば次に進めます。
直接build gradleのバージョンを書き換えてあげることで、更新が可能です。

```diff_properties:build.gradle
# （省略）
buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
-       classpath 'com.android.tools.build:gradle:3.2.1'
+       classpath 'com.android.tools.build:gradle:8.4.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
# （省略）
```
2024/7/26現在の私の環境では、8.4.0で動きました。他のバージョンは試せていないのでわかりません。
その後のエラーは、以降のエラー対応でカバーできるはずです。

### import com.nuwarobotics.example.BuildConfigでエラーを吐く
AGP Assistant を使用して変更されたファイルとその内容は次の通りです。

- build.gradle
    - classpath（バージョンの更新）
- build.gradle (:app)
    - namespace（追加記述）
- gradle.properties
    - android.defaults.buildfeateres.buildconfig=true（追加記述）
    - android.nonFinalResIds=false（追加記述）
    - android.nonTransitiveRClass=false（追加記述）
- gradle-wrapper.properties
    - distributionUrl（ファイルパスの更新）

これを手順の画像中に出てきたように CUI 上の 「Upgrade Gradle wrapper to...」から行ってしまうと、gradle.properties が変更不足になることがあります。追加記述が正しく行われているか確認してください。

```diff_properties:gradle.properties
# （省略）
# The setting is particularly useful for tweaking memory settings.
+ android.defaults.buildfeatures.buildconfig=true
+ android.nonFinalResIds=false
+ android.nonTransitiveRClass=false
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# （省略）
```

### Namespace not specified.というエラーを吐く
BuildConfigと同じように、 AGP Assistant を使用しないと起こり得ます。
app 直下の build.gradle に追加記述してください。

```diff_gradle:build.gradle (:app)
//（省略）
android{
    compileSdkVersion 28
    defaultConfig {/*（省略）*/}
    buildTypes {/*（省略）*/}
    compileOptions {/*（省略）*/}
+   namespace 'com.nuwarobotics.example'
}
//（省略）
```

### SDKが読み込めない
「File -> Project Structure -> Dependencies -> app」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/6b7c492e-a4a6-fba5-1926-de0db59d43bf.png)

Declared Dependencies 欄の「＋」ボタンを押し、2 JAR/AAR Dependency を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/edec48d3-4811-33b8-afc2-79c809303b11.png)

Step 1.に作成した libs フォルダのパス（写真の入力は私の環境の例）を入力し、OK を押します。Step 2.は implementation のままで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/959b4813-421f-19ed-f1e9-f9a58b6cb630.png)

Applyを押せば、SDKが正しく読み込まれ、Build が完了します。もし読み込みが重複しているとエラーが出るようであれば、元の implementation の記述をコメントアウトしてください。
![画像18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640607/e78edab4-91ce-7584-d63d-ccb165e48d33.png)