投稿
开启辅助访问
 找回密码
 立即注册
取消
搜索
热搜:
活动 交友 discuz
官方发布 + 关注 已有11人关注 发新帖
分享到

豹小秘二次开发DemoApp说明文档

#使用指南#时间:2019-04-03 阅读:14300 回复:12

0

主题

0

帖子

6

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6
本帖最后由 张新猛 于 2019-11-18 19:14 编辑

  • 1 概述
      目前最新版 SDK 为 4.12  新版本 SDK 主要修改点如下:

    • 转向指定位置点
    • 设置灯效
    • 获取机器人SN号
    • 安装本地apk
    • text转mp3文件
    • 跳转回到ModuleApp

    2 Robot OS 架构图
      
      Home为默认launcher,可通过三指下拉,点击应用中心进入,其用来管理所有App对  RobotApi的访问控制权,App必须在Home中点击启动,获得访问授权后,才能对Api进行访问


  • 3 SDK接入


3.1 文件配置
3.1.1 准备材料和环境
  • jar包:robotservice-Vx.x.jar
  • SDK说明文档   
  • AndroidStudio,JDK,ADB等等

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和Secret
  • 为了能够正常使用服务端的API,例如人脸信息注册,请及时申请AppId和Secret

3.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);
    }
  • 服务相关初始化请参考:ModuleServiceSpeechService
  • 服务连接成功后,可以使用导航、视觉及语音功能
  • 每个API被调试,都会显示在APP界面底部,方便研发和测试进行调试和测试

4.2 语音功能
  点开语音功能按钮,进入功能页面:
  • 喊“小豹小豹”,会唤醒机器人并转向目标人物;
  • 点击:停止唤醒按钮,机器人停止唤醒
  • 语音:天气   ,豹小秘会播报当前的天气情况,asr 结果文字会显示出来,还可以尝试其它语音对话,例如** 傅盛是谁**
  • 可以输入文字,使用 TTS 播报功能
  • 可以开启或关闭语音识别,以及开启或关闭语音
  • 可以设置语音识别的角度

4.3 视觉引领
  点击视觉引领按钮,进入功能页面:
  • 点击底部的开始识别人脸,会实时显示人脸识别结果,点击停止识别人脸即停止检测
  • 在检测到人脸之后,记录下结果中的id值,即可用于上面跟随或引领需要填入的personId值(该值全局有效)
  • 注册功能是需要在正确识别人脸信息后,输入合法的名称,可以记录人脸信息到后台(可用于后续的人脸识别功能)
  • 通过该id点击获取人脸信息按钮,可以获取服务端人脸注册的信息
  • 选择前置摄像头,或者后置摄像头,点击切换摄像头按钮,可以切换前后摄像头
  • 点击开始引领前,输入有效id和位置,机器人开始引领到目的地
  • 在引领过程中,点击结束引领,机器人停止移动

  注意:该接口保存的图片在使用完后需要手动删除
4.4 移动导航
4.4.1 位置移动
  点击位置移动按钮,进入功能页面:
  • 根据文档相关api参数说明,正确填入参数值,以测试移动功能,每次移动开始需要手动停止或等待移动完成
    注意:该功能系列,无避障检测,建议选择合适场地,速度不易设置过快

4.4.2 导航功能
  点击导航功能按钮,进入功能页面:
  • 点击当前定位状态按钮,可以查看当前机器得定位状态
  • 点击机器人当前位置坐标点按钮,可以查看机器人当前在地图中得坐标点
  • 手动输入位置名称,点击设置当前位置名称按钮,即绑定当前坐标于该名称
  • 点击获取指定位置坐标按钮,即可以获取输入框中相应位置的坐标,显示于下方
  • 点击导航到上面位置坐标按钮,即机器人会自主导航到输入框中对应的位置点(该功能有自主避障功能)
  • 点击是否在指定位置按钮,已判断当前机器人当前位置是否在指定位置区域
  • 点击转向目标点方向按钮,机器人回转动身体到背对指定点的方向
  • 输入某个位置,点击导航到指定位置按钮,机器人即可导航到指定位置
  • 在上边导航过程中,点击停止导航到指定位置按钮,机器人停止移动
  • 可以通过手动或者自动的方式设置机器人的定位点

  注意:
  • 导航功能使用的前提条件是:已经正确建立地图、地图没有很多槽点,机器人在地图区域内、且定位状态正常
  • 一旦地图正确建立完成,不能随意改变地图中物体的位置,否则会影响导航及引领功能的使用
  • 无论是导航到坐标还是导航到位置点,开始和结束都是一一对应的,每次开始必须有相应的结束,不能多次开始而没有结束,否则会报错误errorCode:-6
  • 一旦提示errorCode:-6,可以通过急停来恢复

4.5 地图巡逻
4.5.1 地图功能
  • 手动输入已创建的地图名称,可以手动切换当前使用地图(地图名称可以通过地图工具查看)
  • 可以查看当前使用地图的名称

4.5.2 巡逻功能
  • 点击获取位置列表按钮,可以查看当前已设置的点位的列表(包括自主生成的回充点充电桩位置)
  • 点击开始巡逻按钮,会依次按照设置的点位,依次导航,即巡逻路线(该点位列表可自行设置,测试为所有点位)
  • 点击结束巡逻按钮,即停止巡逻功能

  注意:巡逻功能使用的前提条件是:已经正确建立地图、机器人在地图区域内、且定位状态正常
4.6 充电功能
  • 点击充电功能,进入功能页面:
  • 点击自动回充按钮,豹小秘开始自动回充
  • 点击结束自动回充按钮,豹小秘结束自动回充
  • 点击停止充电并脱离充电桩按钮,将豹小秘进行充电(5s之内),然后豹小秘弹出充电桩

   注意:自动回充功能使用的前提条件是:已经正确建立地图、机器人在地图区域内、且定位状态正常
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 案例分析
  • 此案例为简单的任务流展示,开发者可根据具体的业务场景组合变换,仅供参考
  • 此场景案例按照如下流程进行设计:“Standby - 人脸检测 - 人脸识别 - 问候语 - 问答 - 特定意图解析 - 底盘导航 - 到达位置 - 语音播报 - end”具体使用步骤:

  • 点击场景案例按钮,进入功能页面
  • 界面显示“开始识别人脸”(人脸检测中)
  • 界面显示“已唤醒”(正确识别到人脸会唤醒机器,面对人脸)
  • 语音 “你好吗” 或 “傅盛是谁” 等内容,和机器人语音聊天(机器人会根据问题正确响应结果并播报,后续可以通过机器人后台可以自行添加问答对)
  • 带我去接待点(语音下达指令,格式为:带我去XXX xxx为地图中定义的位置点)

5.1 场景的概念
  • 我们将如上场景案例人为进行分类:
  • 1.Standby - 人脸检测 - 人脸识别 - 问候语 - 问答 (可以归纳成欢迎场景,主要负责检测、识别人脸,打招呼和互动)
  • 2.底盘导航 - 到达位置 (可以归纳成导航场景,主要负责引领/导航)

5.2 场景切换
  • 当我们收到一条语音指令,首先判断是属于哪个场景,然后切换到相应的场景,进行相关业务处理,更新UI,DemoApp使用的是ControlManager来进行场景切换,Module进行业务处理,Fragment负责界面渲染

5.3 代码实现
  • 可以参照类图来进行Demo的解读

6 总结
  • 小伙伴们可以通过 DemoApp 配合 API讲解 一节了解到 RobotApi 单一技能如何调用及实际效果
  • 案例分析 部分仅仅是一个参考,用来将多个单一技能整合到一起,形成一个功能模块,此处仅仅是抛砖引玉,具体实现不尽相同,还需要开发同学视业务而定


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,用这个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);    }});
  • 获取人脸信息,是什么意思?是摄像头捕获指定id的人脸,其他人或没人都无法调用成功?

答:获取人脸信息的意思是获取这个人在云端的信息,包括姓名,年龄,性别,注册状态,手机号,头像信息,职位信息等。具体实现方式:1、调用RobotApi.getInstance().startGetAllPersonInfo获取临时人脸id1、调用RobotApi.getInstance().getPictureById,获取该id在本地存储的照片地址2、调用RobotApi.getInstance().getPersonInfoFromNet,获取如下信息图片: https://uploader.shimo.im/f/fAs4vfN2O1wFlJZ0.jpeg
  • 开始识别人脸,对陌生人也可以识别到,而且有一个id,这个id是存在哪里,多久会失效?调用识别的人脸图片,是否可以拿得到id?

答:视觉算法根据当前的人的特征识别出来的一个临时id,对同一个人多次识别,可能是不同的id。如果a消失后,b过来,可能是同一个id。调用识别的人脸图片,拿不到id。
  • 注册多个名字后,对话中显示的不是最新名字?

答:目前注册分为访客和职工。访客是可以多次注册,而员工注册只能有一个名字,因为服务端有去重操作。       同一个人,用不同的脸部去注册,也可能生成不同的记录,例如a,b,c3条记录。再识别的时候,可能是a,可能是b,也可能是c。所以对话中显示的不一定是最新的名字。      
  • 老的sdk是否可以在最新的ota版本上运行

不可以!最好是使用配套的系统ota和sdk,需要跟相关的支持同学进行联系!

文档下载地址:
链接: https://pan.baidu.com/s/12WHtUgEl6kz0K2UW0hcgdg
提取码: qwes

注:请勿将相关代码上传到各开放平台或代码仓库,如有需求,请及时沟通


回复
使用道具 举报

0

主题

6

帖子

36

积分

新手上路

Rank: 1

积分
36
张新猛| 2019-8-20 18:45:42 | 显示全部楼层
指针 发表于 2019-8-16 17:43
谢谢回复,“AppId和Secret”我目前使用的API没用到,这个是应用运行在机器上自动设置绑定了? ...

客户端不用关心这个问题,是后台的逻辑。
回复
使用道具 举报

0

主题

6

帖子

36

积分

新手上路

Rank: 1

积分
36
张新猛| 2019-8-20 18:44:06 | 显示全部楼层
指针 发表于 2019-8-16 17:38
谢谢回复,还有请问下,reqType目前的类型相对应的值,比如:Demo中“guide&guide”表示导航的。除了Demo ...

reqType根据企业会有不一样的值,所以还没有固定的文档。语音匹配指令类型是企业自己配置文法来匹配的。比如:我想去XXX返回guide,小豹你会做什么返回chat,JSON格式具体字段如下:
2.png
1.png
回复
使用道具 举报

1

主题

9

帖子

67

积分

注册会员

Rank: 2

积分
67
指针| 2019-8-16 17:43:43 | 显示全部楼层
张新猛 发表于 2019-8-16 15:29
你好,这是服务端需要的信息,请联系技术申请

谢谢回复,“AppId和Secret”我目前使用的API没用到,这个是应用运行在机器上自动设置绑定了?
回复
使用道具 举报

1

主题

9

帖子

67

积分

注册会员

Rank: 2

积分
67
指针| 2019-8-16 17:38:45 | 显示全部楼层
张新猛 发表于 2019-8-16 15:26
你好,reqType是语音指令类型,如天气、日历、闲聊等,可以根据业务扩展,类型数量不固定,在语音说出机 ...

谢谢回复,还有请问下,reqType目前的类型相对应的值,比如:Demo中“guide&guide”表示导航的。除了Demo中的,有完整的对应文档吗?语音是如何匹配到相应的指令类型的,有什么规则吗?还有指令下发数据的JSON格式具体字段含义是什么,是平台配置对应的?(比如:平台配置自定义问答有图片,下发的字段就有下发图片链接字段)
回复
使用道具 举报

0

主题

6

帖子

36

积分

新手上路

Rank: 1

积分
36
张新猛| 2019-8-16 15:29:49 | 显示全部楼层
指针 发表于 2019-8-14 15:55
有道云笔记文档里面”为了能够正常使用服务端的API,例如人脸信息注册,请及时申请AppId和Secret”,这个Ap ...

你好,这是服务端需要的信息,请联系技术申请
回复
使用道具 举报

0

主题

6

帖子

36

积分

新手上路

Rank: 1

积分
36
张新猛| 2019-8-16 15:26:41 | 显示全部楼层
指针 发表于 2019-8-14 15:59
命令回调ModuleCallback里面,reqTyp : 语音指令类型有哪些类型,那些情况下,可以触发收到这些指令的?req ...

你好,reqType是语音指令类型,如天气、日历、闲聊等,可以根据业务扩展,类型数量不固定,在语音说出机器人技能的时候会触发。reqParam是请求参数,是JSON格式
回复
使用道具 举报

0

主题

6

帖子

36

积分

新手上路

Rank: 1

积分
36
张新猛| 2019-8-16 15:13:34 | 显示全部楼层
指针 发表于 2019-8-14 17:52
这两个接口startRecordFaceData和stopRecordFaceData是什么用的?

你好,这两个接口的作用是人脸识别相关,目前SDK中没有用到,因为对性能有影响,所以不建议使用
回复
使用道具 举报

1

主题

9

帖子

67

积分

注册会员

Rank: 2

积分
67
指针| 2019-8-14 17:52:40 | 显示全部楼层
这两个接口startRecordFaceData和stopRecordFaceData是什么用的?
回复
使用道具 举报

1

主题

9

帖子

67

积分

注册会员

Rank: 2

积分
67
指针| 2019-8-14 15:59:25 | 显示全部楼层
命令回调ModuleCallback里面,reqTyp : 语音指令类型有哪些类型,那些情况下,可以触发收到这些指令的?reqParam : 语音指令参数,对于不同指令收到的数据格式有哪些?有相应的文档吗?
回复
使用道具 举报
12下一页
快速回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

    1

    主题

    9

    帖子

    67

    积分

    注册会员

    Rank: 2

    积分
    67

发私信

TA 的相关文章

    官方微信
    发布 快速回复 返回顶部 返回列表