本帖最后由 张新猛 于 2019-11-18 19:14 编辑
3.1 文件配置 3.1.1 准备材料和环境3.1.2 添加依赖 将 robotservice-Vx.x.jar 放到 libs 目录下,并且在 build.gradle 中添加依赖: compile files('libs/robotservice-Vx.x.jar')
或者
implementation files('libs/robotservice-Vx.x.jar')
3.1.3 配置Manifest文件
<!-- 主Acitivity -->
<activity android:name=".XXXActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- App如果需要在开机后默认启动进入,需要在Manifest中配置 -->
<intent-filter>
<action android:name="action.orionstar.default.app" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
3.1.4 开机启动设置注意:开机启动程序设置功能在OTA3才正式上线 3.1.5 提前申请AppID和Secret3.2 连接服务
3.2.1 连接底盘及视觉服务
// 初始化接收语音请求及系统事件的回调
public class ModuleCallback extends ModuleCallbackApi {
@Override
public boolean onSendRequest(int reqId, String reqType, String reqText,
String reqParam) throws RemoteException {
//接收语音指令,
//reqTyp : 语音指令类型
//reqText : 语音识别内容
//reqParam : 语音指令参数
return true;
}
@Override
public void onRecovery() throws RemoteException {
//控制权恢复,收到该事件后,重新恢复对机器人的控制
}
@Override
public void onSuspend() throws RemoteException {
//控制权被系统剥夺,收到该事件后,所有Api调用无效
}
}
// 连接导航及视觉服务
RobotApi.getInstance().connectServer(this, new ApiListener() {
@Override
public void handleApiDisabled() {
}
@Override
public void handleApiConnected() {
//Server已连接,设置接收请求的回调,包含语音指令、系统事件等
RobotApi.getInstance().setCallback(new ModuleCallback());
}
@Override
public void handleApiDisconnected() {
//连接已断开
}
});
3.2.2 连接语音服务 // 创建语音服务回调
SkillCallback mSkillCallback = new SkillCallback() {
@Override
public void onSpeechParResult(String s) throws RemoteException {
//语音临时识别结果
}
@Override
public void onStart() throws RemoteException {
//开始识别
}
@Override
public void onStop() throws RemoteException {
//识别结束
}
@Override
public void onVolumeChange(int i) throws RemoteException {
//识别的声音大小变化
}
@Override
public void onQueryEnded(int i) throws RemoteException {
//
}
@Override
public void onQueryAsrResult(String asrResult) throws RemoteException {
//asrResult :最终识别结果
}
};
// 连接语音服务
final SkillApi skillApi = new SkillApi();
skillApi.connectApi(context, new ApiListener() {
@Override
public void handleApiDisabled() {
}
@Override
public void handleApiConnected() {
// 语音服务连接成功,注册语音回调
skillApi.registerCallBack(mSkillCallback);
}
@Override
public void handleApiDisconnected() {
// 语音服务已断开
}
}); 注意:所有功能Api必须在连接到Server后才能正常使用 4 API 讲解
4.1 初始化配置Demo中默认在LauncherActivity中已经连接相关服务,如下代码: if (!SystemUtils.isServiceRunning(ModuleService.class, getApplicationContext())) {
Intent intent = new Intent(this, ModuleService.class);
startService(intent);
}服务相关初始化请参考:ModuleService、SpeechService 服务连接成功后,可以使用导航、视觉及语音功能 每个API被调试,都会显示在APP界面底部,方便研发和测试进行调试和测试
4.2 语音功能 点开语音功能按钮,进入功能页面: 4.3 视觉引领 点击视觉引领按钮,进入功能页面: 点击底部的开始识别人脸,会实时显示人脸识别结果,点击停止识别人脸即停止检测 在检测到人脸之后,记录下结果中的id值,即可用于上面跟随或引领需要填入的personId值(该值全局有效) 注册功能是需要在正确识别人脸信息后,输入合法的名称,可以记录人脸信息到后台(可用于后续的人脸识别功能) 通过该id点击获取人脸信息按钮,可以获取服务端人脸注册的信息 选择前置摄像头,或者后置摄像头,点击切换摄像头按钮,可以切换前后摄像头 点击开始引领前,输入有效id和位置,机器人开始引领到目的地 在引领过程中,点击结束引领,机器人停止移动
注意:该接口保存的图片在使用完后需要手动删除 4.4 移动导航
4.4.1 位置移动 点击位置移动按钮,进入功能页面: 4.4.2 导航功能 点击导航功能按钮,进入功能页面: 点击当前定位状态按钮,可以查看当前机器得定位状态 点击机器人当前位置坐标点按钮,可以查看机器人当前在地图中得坐标点 手动输入位置名称,点击设置当前位置名称按钮,即绑定当前坐标于该名称 点击获取指定位置坐标按钮,即可以获取输入框中相应位置的坐标,显示于下方 点击导航到上面位置坐标按钮,即机器人会自主导航到输入框中对应的位置点(该功能有自主避障功能) 点击是否在指定位置按钮,已判断当前机器人当前位置是否在指定位置区域 点击转向目标点方向按钮,机器人回转动身体到背对指定点的方向 输入某个位置,点击导航到指定位置按钮,机器人即可导航到指定位置 在上边导航过程中,点击停止导航到指定位置按钮,机器人停止移动 可以通过手动或者自动的方式设置机器人的定位点
注意: 导航功能使用的前提条件是:已经正确建立地图、地图没有很多槽点,机器人在地图区域内、且定位状态正常 一旦地图正确建立完成,不能随意改变地图中物体的位置,否则会影响导航及引领功能的使用 无论是导航到坐标还是导航到位置点,开始和结束都是一一对应的,每次开始必须有相应的结束,不能多次开始而没有结束,否则会报错误errorCode:-6 一旦提示errorCode:-6,可以通过急停来恢复
4.5 地图巡逻
4.5.1 地图功能4.5.2 巡逻功能 注意:巡逻功能使用的前提条件是:已经正确建立地图、机器人在地图区域内、且定位状态正常 4.6 充电功能 注意:自动回充功能使用的前提条件是:已经正确建立地图、机器人在地图区域内、且定位状态正常 4.7 系统功能 点击系统功能按钮,进入功能页面: 点击获取SN号按钮,可以显示机器人的SN号 点击文本转换MP3按钮,可以将输入的文本转换成mp3文件,demo中将文件存储在/sdcard/test.mp3路径下 点击播放MP3文件按钮,可以播放/sdcard/test.mp3文件的内容 点击设置灯效按钮,可以按照配置内容控制灯效(颜色格式必须是6位16进制代码格式,如E4EE16;时间单位为毫秒;循环次数如果为-1,效果是无限循环) 点击回到豹小秘按钮,会退出当前应用,进入豹小秘主应用 点击安装APK按钮,会安装指定路径的apk(需要将apk命名为test.apk并存放在/sdcard目录下)
5 案例分析点击场景案例按钮,进入功能页面 界面显示“开始识别人脸”(人脸检测中) 界面显示“已唤醒”(正确识别到人脸会唤醒机器,面对人脸) 语音 “你好吗” 或 “傅盛是谁” 等内容,和机器人语音聊天(机器人会根据问题正确响应结果并播报,后续可以通过机器人后台可以自行添加问答对) 带我去接待点(语音下达指令,格式为:带我去XXX xxx为地图中定义的位置点)
5.1 场景的概念5.2 场景切换5.3 代码实现6 总结
7 Q&A下载OTA系统的压缩包到本地电脑 通过adb push到机器人目录 /sdcard/ota/download/update.zip 切换到原生系统界面adb shell am start -n com.android.launcher3/.Launcher 点击OtaService,然后点击Install按钮 即可
地盘资源返回-6的错误,是为什么? 底盘资源在被其他地方占用的情况下,会返回-6.例如,我们定制开发让豹小秘从A走到B,在走动过程中,我们让豹小秘去巡逻,如果没有提前释放底盘资源的前提下,直接startNavigation,就会报错,CODE=-6 位置移动功能系列,无避障检测,建议选择合适场地,速度不易设置过快 人脸识别接口getPictureById()保存的图片在使用完后需要及时删除 无论是导航到坐标还是导航到位置点,开始和结束都是一一对应的,每次开始必须有相应的结束,不能多次开始而没有结束,否则会报错误errorCode:-6,一旦报错,可以尝试通过急停恢复 人脸注册是注册到哪里?为什么我昨天注册得到id4,今天得到id0? 答:人脸注册到了猎户的服务器,这个id是临时的,不是永久的,若干个人在豹小秘面前,会有若干个临时id,这个id仅用来引领、跟随、获取id对应的本地照片地址等,和云端注册的人脸信息没有强关联。RobotApi.getInstance().startGetAllPersonInfo的回调会返回若干人物信息,里面都包含一个临时idprivate static PersonInfoListener PERSONINFOLISTENER = new PersonInfoListener() { @Override public void onData(int code, List<Person> data) { Log.d(TAG, "===>> onData: " + code + " - " + data.size()); if(data != null){ for(Person person : data){ Log.d(TAG, "onData Person: " + person.toGson()); } } for (PersonInfoListener listener : listeners) { listener.onData(code, data); } } @Override public void onResult(int status, String responseString) { Log.d(TAG, "===>> onResult: " + status + " - " + responseString); for (PersonInfoListener listener : listeners) { listener.onResult(status, responseString); } }};
答:首先这个id是一个临时的,不是跟随注册信息永久保留,所以陌生人也会被分配一个临时id,用这个id可以做到引领、焦点跟随等。 LeadingParams params = new LeadingParams();//这里是临时的id,非永久idparams.setPersonId(Integer.valueOf(mEditPersonId.getText().toString()));params.setDestinationName(mEditTarget.getText().toString());// 丢失判断params.setLostTimer(2 * 1000);// 避障超时params.setAvoidTimeout(30 * 1000);params.setAvoidDistance(2.0d);// 超距等待params.setWaitTimeout(12 * 60 * 60 * 1000);params.setMaxDistance(2.8d);FaceSkill.getInstance().startLead(Constants.REQUEST_ID_DEFAULT, params, new ActionListener() { @Override public void onResult(int status, String responseString) throws RemoteException { ToastUtil.getInstance().onResult(status, responseString); } @Override public void onError(int errorCode, String errorString) throws RemoteException { super.onError(errorCode, errorString); ToastUtil.getInstance().onError(errorCode, errorString); }}); 答:获取人脸信息的意思是获取这个人在云端的信息,包括姓名,年龄,性别,注册状态,手机号,头像信息,职位信息等。具体实现方式:1、调用RobotApi.getInstance().startGetAllPersonInfo获取临时人脸id1、调用RobotApi.getInstance().getPictureById,获取该id在本地存储的照片地址2、调用RobotApi.getInstance().getPersonInfoFromNet,获取如下信息图片: https://uploader.shimo.im/f/fAs4vfN2O1wFlJZ0.jpeg 答:视觉算法根据当前的人的特征识别出来的一个临时id,对同一个人多次识别,可能是不同的id。如果a消失后,b过来,可能是同一个id。调用识别的人脸图片,拿不到id。 答:目前注册分为访客和职工。访客是可以多次注册,而员工注册只能有一个名字,因为服务端有去重操作。 同一个人,用不同的脸部去注册,也可能生成不同的记录,例如a,b,c3条记录。再识别的时候,可能是a,可能是b,也可能是c。所以对话中显示的不一定是最新的名字。 不可以!最好是使用配套的系统ota和sdk,需要跟相关的支持同学进行联系!
文档下载地址: 链接: https://pan.baidu.com/s/12WHtUgEl6kz0K2UW0hcgdg 提取码: qwes
注:请勿将相关代码上传到各开放平台或代码仓库,如有需求,请及时沟通
|