SotaアプリをJavaで開発して登録する方法

Javaを用いたSota君アプリの開発と登録の一連の流れをまとめました。
本記事で作成したアプリのソースは [GitHub] (https://github.com/Masataka0127/SotaRepeat) にあります。

# 開発環境
- OS：Windows 10 (64 bit)
- 言語：Java
- IDE：Eclipse

本記事では Intel(R) Edison版 Sota （デベロッパー版）を対象としてアプリ開発を行いました。

# Sotaアプリの開発方法
公式ドキュメントでは、Sotaアプリの開発方法として以下の2つが挙げられています。

- [VstoneMagicを使ってみる](http://www.vstone.co.jp/sotamanual/index.php?VstoneMagic%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
- [Javaでプログラミングをしてみる](http://www.vstone.co.jp/sotamanual/index.php?Java%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)

VstoneMagicはSota用のプログラミングソフトで、予め用意された命令ブロックを繋げてアプリを開発します。
VstoneMagicの利点として、アプリの登録方法が公式ドキュメントに書かれており、Sota本体を操作するだけで「アプリの実行」から作成したアプリを実行することができます。しかし、命令ブロックを繋げる仕様上アプリ開発に制約が掛かります。
そこで、本記事ではJavaでアプリの開発を行います。
Javaで開発したアプリの登録方法は公式ドキュメントに書かれていないので、以下にその方法を説明していきます。

# 開発環境の準備
まずは公式ドキュメントの [Javaでプログラミングをしてみる](http://www.vstone.co.jp/sotamanual/index.php?Java%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B) に従って、サンプルプログラムの実行までやってください。
以下では、開発環境としてEclipse、サンプルプログラムのプロジェクトとして``SotaSample``が手元にあるものとして説明していきます。

# 新規プロジェクトの作成
ここからJavaでアプリ開発をしていきます。
本記事では、こちらが喋ったことをSota君が音声認識してオウム返しするアプリを開発します。
``SotaSample``内の``SpeechRecSample.java``とやってることは同じです。

まずは「ファイル」→「新規」→「Javaプロジェクト」から新規プロジェクトを作成します。プロジェクト名は``SotaRepeat``としておきます。ちなみにGitHubで管理する場合は [GitHubとEclipseの連携とかまとめ - Qiita](https://qiita.com/komikcomik/items/207794a332aa581c22d4) が参考になると思います。

新規プロジェクトを作成したら、srcフォルダ上で右クリック→「新規」→「パッケージ」からパッケージを作成します。パッケージ名は``com.example.sotarepeat``としました（パッケージの命名方法は良く分かってません）。

# Javaプログラムの実装
パッケージ名上で右クリック→「新規」→「クラス」からmainのJavaファイル``SotaRepeat.java``を作成し、実装していきます。アプリの流れとしては以下の通りです。

1. 音声認識を使用して喋った内容を文字列で取得する
2. TextToSpeechを使用して取得した文字列をSota君に喋らせる
3. 1.と2.を任意の回数繰り返す

実装した``SotaRepeat.java``を以下に載せます。

```java:SotaRepeat.java
/* SotaRepeat.java
 * 音声認識結果をTTSでオウム返しするアプリ
 */

package com.example.sotarepeat;

import jp.vstone.RobotLib.CPlayWave;
import jp.vstone.RobotLib.CRobotMem;
import jp.vstone.RobotLib.CSotaMotion;
import jp.vstone.sotatalk.MotionAsSotaWish;
import jp.vstone.sotatalk.SpeechRecog;
import jp.vstone.sotatalk.SpeechRecog.RecogResult;
import jp.vstone.sotatalk.TextToSpeechSota;

public class SotaRepeat {
	static final String TAG = "SotaRepeat";
	static final int LOOP_NUM = 10;

	public static void main(String[] args) {
		//VSMDと通信ソケット・メモリアクセス用クラス
		CRobotMem mem = new CRobotMem();
		//Sota用モーション制御クラス
		CSotaMotion motion = new CSotaMotion(mem);
		SpeechRecog recog = new SpeechRecog(motion);
		MotionAsSotaWish wish = new MotionAsSotaWish(motion);

		if (mem.Connect()) {
			//Sota仕様にVSMDを初期化
			motion.InitRobot_Sota();
			motion.ServoOn();

			for (int i=0; i<LOOP_NUM; i++) {
				// 音声認識（10秒までの音声に対応）
				RecogResult result = recog.getRecognition(10000);
				if (result.recognized) {
					// 認識結果をTextToSpeech
					wish.Say(result.getBasicResult(), MotionAsSotaWish.MOTION_TYPE_TALK);
					//CPlayWave.PlayWave(TextToSpeechSota.getTTSFile(result.getBasicResult()),true);

					if(result.getBasicResult().contains("おわり")){
						CPlayWave.PlayWave(TextToSpeechSota.getTTSFile("終了するよ"),true);
						break;
					}
				}
				if (i == LOOP_NUM - 1) {
					CPlayWave.PlayWave(TextToSpeechSota.getTTSFile("疲れたので終了するよ"), true);
				}
			}
			motion.ServoOff();
		}
	}
}
```

``jp.vstone.RobotLib.CPlayWave``などをimportする所でそんなものは無いとEclipseに怒られた場合は、``SotaRepeat``上で右クリック→「ビルド・パス」→「外部アーカイブの追加」から``SotaSample``内の``lib``フォルダにある``sotalib.jar``を指定してください。

# jarファイルの作成
開発したアプリをSotaに登録するために、jarファイルを作成します。
まず、``SotaRepeat``上で右クリック→「エクスポート」→「JARファイル」を選択します。
「JARエクスポート」画面でSotaRepeatにチェックが入っていることを確認し、エクスポート先のjarファイルを指定して「次へ」。
「JARパッケージ・オプション」はデフォルト設定のまま「次へ」。
「JARマニフェスト仕様」は以下の画面のように「ワークスペース内のマニフェストを保存」にチェックを入れ、マニフェストファイル名を指定します。また、メイン・クラスとして``SotaRepeat``を指定します。そして「完了」。

![jar_manifest_sample01.jpg](https://qiita-image-store.s3.amazonaws.com/0/237153/7855b05b-7732-fec9-6a48-aaf9c466b94b.jpeg)

次に、作成した``MANIFEST.MF``を編集します。今のままだとclasspathの記述がされていないため、アプリ実行時にエラーが出ます。
上記の画像のようにマニフェストファイルを作成した場合、``MANIFEST.MF``は次のようになっていると思います。

```MANIFEST.MF
Manifest-Version: 1.0
Sealed: true
Main-Class: com.example.sotarepeat.SotaRepeat
```

ここに次のような記述を加えます。

```
Class-Path: . /home/vstone/lib/core-2.2.jar /home/vstone/lib/javase-2.2.jar /home/vstone/lib/jna-4.1.0.jar /home/vstone/lib/opencv-310.jar /home/vstone/lib/sotalib.jar /home/vstone/lib/SRClientHelper.jar /home/vstone/lib/gson-2.6.1.jar
```

見境なくclasspathに追加しているので不要なものがあるかもしれませんが、``/home/vstone/lib/gson-2.6.1.jar``を追加しているのがミソです。``SotaSample``の``lib``フォルダ内に含まれていないので最初は書いてなかったのですが、Sotaコンソール上で実行したらgsonが必要だとエラーを吐かれたので追加しました。

このマニフェストファイルを使って、改めてjarファイルを作成します。先ほどと同様にjarファイルを作成していきますが、「JARマニフェスト仕様」で以下のように「ワークスペース内の既存のマニフェストを使用」にチェックを入れます。そして「完了」。
![jar_manifest_sample02.jpg](https://qiita-image-store.s3.amazonaws.com/0/237153/a6484c91-03c3-0a38-1d56-0ffd7441fac9.jpeg)

# jarファイルの転送
作成したjarファイルをSotaに転送します。なお、ここからの流れは [Sotaに自作のjarを登録する方法 - Qiita](https://qiita.com/yamarobo/items/5c71336b4dfa4c6c3c3e) が非常に参考になりました。書いてあることは基本的に同じです。

筆者の環境では無線LANを介してSotaに接続しているので、WinSCPを使って転送します。
Sota内の``/home/vstone/vstonemagic/app/jar``下に``SotaRepeat``ディレクトリを作成し、その中に作成したjarファイルを置きます。

# アプリの設定ファイルの記述
Sotaの「アプリの実行」から実行するプログラムは、``/home/vstone/vstonemagic/app/jar/app.properties``という設定ファイルに記述されています。この設定ファイルを以下のように書き換えます。

```app.properties
length=1              #アプリ数
Debug=false
TimeZone=Asia/Tokyo

app1.title=SotaRepeat
app1.workingdir=SotaRepeat/
app1.jar=SotaRepeat.jar
app1.type=app
app1.trigger=
app1.triggeroption=
```

``length``の値はアプリ数と一致するようにします。また、新しくアプリを開発した場合、``app2.title=hogehoge``という風に追記していきます。
これで登録が完了したので、Sotaを再起動します。
再起動後、背中のボタンを押して「設定モード」→「アプリの実行」から開発したアプリを実行できます。

# 参考にした記事
-  [GitHubとEclipseの連携とかまとめ - Qiita](https://qiita.com/komikcomik/items/207794a332aa581c22d4)
-  [Sotaに自作のjarを登録する方法 - Qiita](https://qiita.com/yamarobo/items/5c71336b4dfa4c6c3c3e)