使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

方椿
• 阅读 659

前言

在今年声网主办的「RTE2022 编程挑战赛」中,数支队伍经过一个多月的努力开发,很多优秀的作品最终突出重围,斩获大奖。本文由RTE2022编程挑战赛获奖者之一李新春撰写,他主要围绕获奖作品「Piloteer助盲服务平台」分享了开发的构思过程、实践经验。

01 为什么要做这件事

因为工作原因,在一些沟通中接触了不少养老相关的项目需求,在信息化高度发展的社会,老年人的生活却变得不那么舒服,特别是在疫情期间以及健康码常态化的今天,老年人以及推而广之的视障人员的生活会更加的不方便。因此,考虑到视障人员更不方便,所以以视障人员为目标人群,以人工智能、声网音视频技术、智能硬件设备和人性化服务为依托,进行了该解决方案的设计和系统开发。

02 项目介绍

项目口号:让我成为你的眼,让我领航前行路

项目介绍:科技在飞速发展,而部分人被落在了后面,让我们协助弱势群体,为他们在新时代领航。新技术让人们的生活更加便利,而视障群体无法看清世界、老年群体无法快速学习进而无法有效的享受科技带来的便利生活。本项目利用人工智能、音视频传输技术、智能硬件等为他们提供一套音视频领航服务方案,协助他们在熟悉周边环境、道路导航、辅助食品/药品辨别等场景下更从容、更舒心。

项目地址:

https://github.com/AgoraIO-Community/RTE-2022-Innovation-Challenge/tree/main/Application-Challenge/项目89-领航者-Piloteer服务平台

03 如何做这个项目

需求调研

有了这个想法,那首先还是要看看视障人员有没有这个需求。

在我国有 8500 万残疾人¹,这其中超 1700 万是视障人群²。其中 23.5% 是 30 岁以下的年轻人,而在视障网民中,80、90 后占比 75%。

在我国有 30% 的视障者基本呆在家中不出门,大部分人出行是需要家人朋友陪同的。完全不需要家人朋友出行的视障人士比例很低,而且大部分不是全盲人。

因此,从数据上看,有一定学历又不经常出门的视障者有不少人群,那他们出门用什么设备呢?粗略统计一下得到如下内容:

  • 导盲犬:导盲犬是一种工作犬,主要工作是代替视障人士的眼睛,为他们领路。训练导盲犬的原理是利用动物的自我保护本能,行走避开障碍物,通过训练将导盲犬的保护机制扩大到视障者,使导盲犬能带着主人躲避障碍物。
  • 超声波导盲仪:超声波导盲仪是以发射超声波和接收障碍物反射回波的方式来定位的,它从回波中得到障碍物信息。
  • 穿戴式导盲仪器:将导盲装置穿戴在身上,通过简单的导盲语音来进行安全行进。比如腰带式行动辅具。能够通过引导的方式使盲人躲避障碍物,将盲人作为半被动式接受躲避障碍物命令的辅助工具。
  • 移动式机器人:移动式机器人是具有多种监测器、强大计算能力和高度智能化障碍物躲避系统的机器人。
  • AI智能设备:通过视障人士携带的图像采集单元采集环境图像;将所述环境图像与预设的立体地图进行对比,以确定所述视障人士的当前位置;根据所述当前位置和立体地图,向所述视障人士发出导航提示。

以上这些设备各有各的优势也各有劣势,综合考虑来看随着技术的发展,利用智能化设备、AI 识别、音视频高效传输才是未来真正解决问题的方向。

04 解决方案

综合来看,还是考虑依托新技术来实现降低成本,辅助出行的目的。通过可移动的摄像头解决人员移动过程中视角差的问题,如果使用手机视频,需要举着才能获得第一视角,而利用 OTG 和 UVC 摄像头,可以佩戴到眼镜上,更加方便。

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

05 系统架构

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

从系统架构中可以清楚的看到,在设计过程中应用了如下技术:

  • UVC 摄像头:利用安卓手机以及安卓系统硬件的 OTG 特性,设计可挂载摄像头,以第一视角进行导引。
  • 视频中台:主要利用声网音视频传输技术,实现 1V1 对话,群组对话等实时通信功能,实现单人指导和多人协助的功能以及后台的针对音视频质量、接入时间以及设备的管理。
  • AI 中台:是以 AI 算法为核心的能力中台,目前主要依托于 Yolo 算法,实现各类车辆、行人、动物等的识别。
  • 平台功能:平台功能依托赋能中台,提供基础的三维地图导航、接入设备管理、导航业务管理以及数据分析等功能,未来根据客户需要进行模块化调整。

06 项目开发实践

开发环境准备

安卓平台

开发平台:android studio 2021.2.1

安卓版本:6.0.1

一般支持 OTG 摄像头的系统即可使用,当前未作机型适配。

Windows平台

当前测试系统使用的是:win10

CPU:I7 7700K

GPU:GTX1050TI

内存:16G

开发平台:Unity3D 2021.2.14AI

算法:Yolo v3

其他:云虚拟主机

声网 SDK 应用

Unity3D C#开发

开发工具:Unity3D 2021.2.4 SDK 版本、RTM 1.4+、RTC 3.7+学习 Demo 场景。在如下场景中,首先要注册登陆声网开发者控制台 console.agora.io 并且创建项目获得的 AppID,点击运行即可进入视频房间,关于获得声网 AppID 的过程,建议在声网官网浏览一下,有非常丰富的文档,如下链接。

https://docs.agora.io/cn/Agora%20Platform/get_appid_token

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

下面简单介绍几个重要函数

1、打开脚本“TestHelloUnityVideo”这里面的“loadEngine”即为声网引擎重要的初始化步骤。

 public void loadEngine(string appId)
    {
        // start sdk
        Debug.Log("initializeEngine");
 
        if (mRtcEngine != null)
        {
            Debug.Log("Engine exists. Please unload it first!");
            return;
        }
 
        // init engine
        mRtcEngine = IRtcEngine.GetEngine(appId);
 
        // enable log
        mRtcEngine.SetLogFilter(LOG_FILTER.DEBUG | LOG_FILTER.INFO | LOG_FILTER.WARNING | LOG_FILTER.ERROR | LOG_FILTER.CRITICAL);
    }

2、加入房间,“join”函数,为用户加入房间以及各种回调函数的设计,也是未来我们系统中进行实时沟通对话的开始。

public void join(string channel)
    {
        Debug.Log("calling join (channel = " + channel + ")");
 
        if (mRtcEngine == null)
            return;
 
        // set callbacks (optional)
        mRtcEngine.OnJoinChannelSuccess = onJoinChannelSuccess;
        mRtcEngine.OnUserJoined = onUserJoined;
        mRtcEngine.OnUserOffline = onUserOffline;
 
        // enable video
        mRtcEngine.EnableVideo();
        // allow camera output callback
        mRtcEngine.EnableVideoObserver();
 
        // join channel
        mRtcEngine.JoinChannel(channel, null, 0);
    }

3、完成点对点导航后,“leave”函数,切记在程序退出时记得关闭。

public void leave()
    {
        Debug.Log("calling leave");
 
        if (mRtcEngine == null)
            return;
 
        // leave channel
        mRtcEngine.LeaveChannel();
        // deregister video frame observers in native-c code
        mRtcEngine.DisableVideoObserver();
    }

4、因为我们使用的是 OTG 外部摄像头,因此在开发过程中要使用声网的外部视频推送能力。

安卓端代码如下

protected void preview(boolean start, SurfaceView view, int uid) {
    if (start) {
        mSource = new AgoraVideoSource();
        mRender = new AgoraVideoRender(uid, false);
        rtcEngine().setVideoSource(mSource);
        rtcEngine().setLocalVideoRenderer(mRender);
       // rtcEngine().startPreview();
    } else {
       // rtcEngine().stopPreview();
    }
}

07 项目主要功能

移动端

安卓端主要包含用户登录和音视频通话,为方便视障人员使用,尽量做了简化

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

Win 服务端

包含数据大屏、设备管理、工单管理、导航管理等模块

数据大屏

展示运营数据分析,设备使用信息,服务质量等内容,如用户年龄分布、周服务排名、当前呼叫信息、日活用户分布等数据问题。

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

导航管理

以卫星图、街道图为服务人员提供导航服务,可以进行初步的线路规划,实时视频对话、RTM 及时信令控制等。

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

设备管理

采购设备的企业、单独购买的用户,通过集中注册或者个人注册的方式,将自身设备注册到系统平台上,通过该界面对设备的使用者基本信息进行编辑。

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

工单管理

系统采用了 AI 辅助识别功能,因此系统设计支持通过网页端(非 AI)和本地端(AI 辅助)进行系统登录和远程服务,包含导航信息的获取、查看、检索等功能。

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

08 未来拓展

“十四五”规划和 2035 年远景目标纲要中提出要加快数字化社会建设,我们需要考虑到不同群体的数字化需求,特别是老年群体。

上海是国内最早进入人口老龄化且老龄化程度最深的大型城市有将近 400 万老年人,近年来上海积极探索“社区嵌入式养老服务”,让社区老人在熟悉的环境中实现“老有所养”。因而,利用我们已开发完成的这套系统和服务模式,可以在多方面辅助老年人的生活。

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

以上是 Piloteer 助盲服务平台作品在 RTE2022 编程挑战赛期间的实践分享,更多信息和作品可以访问官方渠道。

Piloteer服务平台:

https://github.com/AgoraIO-Community/RTE-2022-Innovation-Challenge/tree/main/Application-Challenge/项目89-领航者-Piloteer服务平台

大赛作品仓库:

https://github.com/AgoraIO-Community/RTE-2022-Innovation-Challenge

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
方椿
方椿
Lv1
射人先射马,擒贼先擒王。
文章
4
粉丝
0
获赞
0