## SDK集成使用说明
### 第一步 导入aar文件
将aar文件添加到libs文件中

```groovy
implementation(name: 'csjsdk-beta', ext: 'aar')
```
在app的build.gradle文件的android{}结构下添加如下代码

```groovy
repositories {
    flatDir {
        dirs 'libs'
    }
}
```
### 第二步 引入依赖库
```groovy
implementation 'io.netty:netty-all:4.1.23.Final'
```

### 第三步 初始化
在Application中初始化SDK

**请保证设备端有网络的情况下进行代码授权** 

1. 在[穿山甲开发者平台上注册账号](http://openpro.csjbot.com)
2. 填入信息后申请 API Key和 User Key
3. 在右侧菜单中找到API管理，API Key 对应  key ，User Key 对应 secret
4. 在初始化的时候填入 ，注意需要给予应用权限

```xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 读外部储存 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <!-- 写外部储存 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```

```java
CsjRobot.authentication(this,"yourkey", "yoursecret", new OnAuthenticationListener() {
    @Override
    public void success() {
        Log.d("TAG","授权成功!");
    }

    @Override
    public void error() {
        Log.d("TAG","授权失败!");
    }
});
```
只需联网授权一次即可,后续使用无需联网授权，会做本地验证

在成功之后，可以进行初始化SDK，选择需要功能（可以跳过，默认打开），设置连接地址和端口（可选，默认为192.168.99.101），设置机器人类型，默认是Amy迎宾机器人，需要的则设置为对应的机器人类型

```java
// 是否启用语音模块(默认开启)  #####在init之前调用
CsjRobot.enableAsr(true);
// 是否启用人脸识别模块
CsjRobot.enableFace(true);
// 是否启用导航模块
CsjRobot.enableSlam(true);
// 设置通信的地址，默认是192.168.99.101， 60002
CsjRobot.setIpAndrPort("127.0.0.1", 60002);

/*
* 设置机器人类型(在init之前调用)
* 如果设置了ALICE，则为第八代机器人的协议
*/
CsjRobot.setRobotType(CsjRobot.RobotType.ALICE_NEW);

/*
* 初始化SDK
*/
CsjRobot.getInstance().init(this);
```



## 机器人功能使用说明

SDK初始化

在初始化之后，可以注册机器人连接状态事件，不同的状态在回调中都有展示

```java
CsjRobot.getInstance().registerConnectListener(new OnConnectListener() {
            @Override
            public void success() {
                startActivity(new Intent(SplashActivity.this,MainActivity.class));
            }

            @Override
            public void faild() {

            }

            @Override
            public void timeout() {

            }

            @Override
            public void disconnect() {

            }
});
```



### 一、语音识别、语义理解与唤醒

#### 语音识别

功能可以参考 [Demo的AsrNlpActivity.java](http://gitlab.csjbot.com/open/RobotSDKForYingbin-Android-Sample/blob/master/Android-Sample/app/src/main/java/com/demo/csjbot/csjsdkdemo/future/AsrNlpActivity.java)

1、打开、关闭语音服务（默认打开，enableAsr 需要置为true）

```java
CsjRobot.getInstance().getSpeech().startSpeechService();
```

2、注册机器人语音识别和语义理解事件

```java
private OnSpeechListener onSpeechListener = new OnSpeechListener() {
    @Override
    public void speechInfo(final String s, final int i) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 简单解析示例
                if (Speech.SPEECH_RECOGNITION_RESULT == i) { // 识别到的信息
                  ...
                } else if (Speech.SPEECH_RECOGNITION_AND_ANSWER_RESULT == i) {// 识别到的信息与的回答
                  ...
                }
            }
        });
    }
};
```

3、打开多次语音识别

```java
CsjRobot.getInstance().getSpeech().startIsr();
```

注意：此方法默认不会调用，调用之后，SDK将独占麦克风

如果想要停止识别

4、停止语音识别

```
CsjRobot.getInstance().getSpeech().stopIsr();
```

5、关闭

```java
CsjRobot.getInstance().getSpeech().closeSpeechService();
```

#### 唤醒事件

注册机器人唤醒事件，对机器人说唤醒词"灵犀灵犀"即可

```java
private OnWakeupListener onWakeupListener = new OnWakeupListener() {
    @Override
    public void response(final int i) {
		...        
    }
};
```



### 二、导航和行走

导航流程，功能可以参考 [Demo的SlamDemoActivity.java](http://gitlab.csjbot.com/open/RobotSDKForYingbin-Android-Sample/blob/master/Android-Sample/app/src/main/java/com/demo/csjbot/csjsdkdemo/future/SlamDemoActivity.java)

#### 第一次开机

​	1、寻找一个合适的地方安放充电桩，并且给充电桩上电

​	2、机器人在充电桩充电、开机

​	3、等待进入系统之后，利用RobotStuido软件进行建立地图

​	4、调用保存地图接口，地图默认名字是 map.map

```java
mCsjBot.getAction().saveMap();
```

​	5、随后可以调用查看地图恢复状态

```java
public void queryMapState(View view) {
	mCsjBot.getAction().getMapState(onMapStateListener);
}

private OnMapStateListener onMapStateListener = new OnMapStateListener() {
    @Override
    public void mapState(String s) {
        ...
    }
};
```



​	6、利用 RobotStuido 软件，移动机器人到合适的位置，调用获取坐标1

```java
public void getAndSavePose1(View view) {
    ...
	mCsjBot.getAction().getPosition(listener);
    ...
}
```



​	7、利用 RobotStuido 软件，移动机器人到合适的位置，调用获取坐标2

```java
public void getAndSavePose2(View view) {
    ...
	mCsjBot.getAction().getPosition(listener);
    ...
}
```



​	8、想要去往点位1，则可以调用去往点位，参见调用方法

```java
public void goPose1(View view) {...}
```

```java
private void goPose(final RobotPose pose) {...}
```



​	9、如果想要中途取消，则可以调用取消导航方法

```java
public void cancelNavi(View view) {
    mCsjBot.getAction().cancelNavi(new OnNaviListener() {
        @Override
        public void moveResult(String s) {}

        @Override
        public void messageSendResult(String s) {}

        @Override
        public void cancelResult(String s) {
            //在此回调中获取状态
        }

        @Override
        public void goHome() {}
    });
}
```

#### 再次开机导航流程

前提：

- **充电桩在原来位置**

- **机器人在充电桩开机**

- **已经调用过保存地图接口**

  

  此时当机器人SDK连接之后，可以调用恢复地图接口，恢复地图

  ```java
  public void restoreMap(View view) {
      mCsjBot.getAction().loadMap();
  }
  ```

  

  恢复地图之后，可以直接调用保存的点位， 进行导航

   ```java
	public void goPose1(View view) {...}
   ```

   ```java
	private void goPose(final RobotPose pose) {...}
   ```

#### 回桩充电

- 注意：需要在充电桩开机

  调用回桩充电的接口即可让机器人回去充电

  ```java
  public void goHome(View view) {
      mCsjBot.getAction().goHome(new OnNaviListener() {
  		...
          @Override
          public void goHome() {
  			// 如果成功则有回调
          }
      });
  }
  ```

  

​	

#### 其他运动接口

​	1、点动，调用接口可以让机器人往前、后、左、右运动，注意：这些方法传感器将不起作用，也不会导航

```java
public void forward(View view) {
    mCsjBot.getAction().moveForward();
}

public void backward(View view) {
    mCsjBot.getAction().moveBack();
}

public void turnLeft(View view) {
    mCsjBot.getAction().moveLeft();
}

public void turnRight(View view) {
    mCsjBot.getAction().moveLeft();
}
```

​	Tips：如果想要做App等远程控制机器人运动，可以调用这些方法

​	2、转身，转特定角度，以机器人目前朝向作为参考

```java
public void turnRight60Degrees(View view) {
    mCsjBot.getAction().moveAngle(-60, new OnGoRotationListener() {
        @Override
        public void response(int i) {

        }
    });
}

public void turnLeft60Degrees(View view) {
    mCsjBot.getAction().moveAngle(60, new OnGoRotationListener() {
        @Override
        public void response(int i) {

        }
    });
}
```

​	Tips：可以利用这个来做声源定位的转身



​	3、转到特定的角度，以机器人开机朝向作为参考

```java
public void turnTo60(View view) {
    mCsjBot.getAction().goAngle(60);
}
```



### TTS(语音合成)

```java
        // 机器人TTS
        ISpeechSpeak speak = CsjRobot.getInstance().getTts();

        // 开始说话
        speak.startSpeaking("你好呀！", new OnSpeakListener() {
            @Override
            public void onSpeakBegin() {
                // 说话前
            }

            @Override
            public void onCompleted(SpeechError speechError) {
                // 说话完成
            }
        });

        // 停止说话
        speak.stopSpeaking();

        // 暂停说话
        speak.pauseSpeaking();

        // 重新说话
        speak.resumeSpeaking();

        // 是否正在说话
        speak.isSpeaking();

        // 也可以使用自己实现的TTS(继承自ISpeechSpeak接口)
        CsjRobot.getInstance().setTts(null);
```



### 人脸识别信息
```java
        // 机器人人脸识别
        Face face = CsjRobot.getInstance().getFace();

        // 打开摄像头(打开视频流传输 默认开启)
        face.openVideo();

        // 关闭摄像头
        face.closeVideo();

        // 启动人脸识别服务(默认开启)
        face.startFaceService();

        // 关闭人脸识别服务
        face.closeFaceService();


        // 摄像头拍照
        face.snapshot(new OnSnapshotoListener() {
            @Override
            public void response(String s) {
                /*
                * {
                    "error_code": 0,
                    "face_position": 0,
                    "msg_id":”FACE_SNAPSHOT_RESULT_RSP"
                    } */
                // erro_code : 0表示有人脸 其他表示无人脸
            }
        });

        // 人脸注册(保存当前拍照的人脸)
        face.saveFace("张三", new OnFaceSaveListener() {
            @Override
            public void response(String s) {
                /*
                * {
                    "msg_id":"FACE_SAVE_RSP",
                    “person_id”:”personx20170107161021mRJOVw”,
                       “error_code":0
                   }*/

                // error_cdoe : 0 成功 , 40002 人脸已经注册,40003 人脸姓名格式错误
            }
        });

        // 人脸信息删除
        face.faceDel("faceId");

        // 人脸信息批量删除
        face.faceDelList("faceIdsJson");

        // 获取所有人脸数据库
        face.getFaceDatabase(new OnGetAllFaceListener() {
            @Override
            public void personList(String s) {
                // s
            }
        });
```

### 机器人状态
```java

```

### 机器人表情
```java

```

### 机器人版本
```java
// 机器人版本信息
Version version = CsjRobot.getInstance().getVersion();

// 获取机器人版本信息
version.getVersion(new OnGetVersionListener() {
    @Override
    public void response(String s) {
        // 返回的版本信息
    }
});
```



