1. 引言
日本任天堂公司在1996年推出了《精灵宝可梦》电子游戏后,随即在世界各地俘虏了众多粉丝 [1] 。增强现实(Augmented Reality, AR)相关技术的出现,让宝可梦以一种崭新的方式从动漫走出,而重新获得人们的关注。AR技术是指利用计算机、行动装置与其上的惯性运动传感器(Inertial Motion Unit, IMU)及同步定位与建图(Simultaneous Localization and Mapping, SLAM)等技术手段,把虚拟物件与现实环境信息叠加到同一个空间或画面中。软、硬件及系统的交互协作使虚拟物件与现实环境之间完成了三维信息的对齐,使虚拟物件变成了现实环境的一部分 [2] 。在实现增强现实的过程中,虚拟元素必须完美地被置放到目标位置上,这个过程中的任何错误都会极大地降低系统的可用性,并影响用户交互的真实感 [3] 。随着科技的不断发展,增强现实技术在变得日益成熟的同时,也在不断地深入到生活中的各个领域中,例如儿童的智力开发、大学堂的人机互动、虚拟展示等。在城市规划工作中,增强现实技术能更好地将未来城市规划、变更与发展,更直观、精确地展示在人们面前,降低了错误风险以及为解决问题付出的高额代价 [4] 。
从1956年德国摄影师莫顿·海格(Morton Heilig)开发出名为Sensorama的虚拟现实(Virtual Reality, VR)机器以来,纯虚拟VR技术的快速进展,引发了AR与介导现实(Mediated Reality, MR)的研究热潮。处于VR环境中的用户是与现实物理环境隔离的,只能与虚拟环境交互。操作AR的用户可以看到系统在真实环境中为其准备的虚拟物件,并与之交互。而MR则综合前二者,在现实物理环境中,嵌套入虚拟环境与用户在虚拟环境中的投影,让用户在现实与虚拟融合的环境中与系统交互。三者都需要特殊传感器的支持。就行动电话而言,受限于其传感器的配置,适合作为简单应用或游戏的承载平台。
近年来,AR技术发展非常迅速,尤其是从谷歌AR眼镜的推出后,使得AR技术家喻户晓。根据美国新媒体联盟2017年发布的《地平线项目区域报告》,AR技术连续五年被选为影响全球教育领域的新兴技术。美国高等教育信息化协会预测,新兴的AR技术与教育的结合将成为未来教育领域,特别是职业教育领域的发展趋势之一 [5] 。我国AR产业的发展相较于国外起步较晚,但是在近几年发展迅速,国内已有国企进入市场布局。在应用开发平台方面,面向开发者的平台相继上线。如百度的DuMix AR内容制作平台,华为的AR Engine开发平台。在AR硬件方面,则有耐德佳、亮亮视野、亮风台、鲲游光电以及珑璟光电、惠牛科技等企业相继投入AR装置的研发。虽然起步稍晚,但是在上游硬件领域与应用开发平台方面已具备国际竞争力 [6] 。AR技术需要的图像处理、渲染及跟踪算法等,在遇到光线不足或跟踪物体时,存在较大延迟或者物体被屏蔽等问题,还有较大的优化空间 [7] 。不过,目前的AR技术已能应用与于医疗、汽修、建筑等行业,辅助从业者高效地进行工作 [8] ,将之运用在游戏与商品行销工作上,亦能取得明显的成效。
本研究运用高德地图与谷歌ARcore API,辅以Node.js平台搭配Express网页应用服务框架所建置而成的后端表现状态转移(Representational State Transfer, REST)式的应用编程接口(Application Programming Interface, API),以Android Studio与Visual Studio Code为开发工具,开发出AR商品推广应用。主要探讨高德地图与谷歌ARCore技术在移动装置上的整合应用方式,除了重点回顾高德地图定位与谷歌ARCore技术外,亦整合运用其开发套件,结合地图定位与增强现实技术,设计并开发出一款AR式商品推广应用,为商品的销售提供一个结合线上线下、现实与虚拟的商品推广管道。
2. 相关技术
2.1. 全球定位系统与地理信息系统
全球定位系统(Global Positioning System, GPS)通过在同一时间接收3个以上人造卫星讯号,藉由讯号接收点与各个卫星的距离以及各个卫星的位置,推算出接收点在地表上的位置。GPS讲究的是定位精度,评估指标为位置精度衰减因子(Position Dilution of Precision, PDOP)与用户等效误差(User Equivalent Range Error, UERE),其受到定位卫星个数、卫星轨道钟差、讯号传输误差、接收端噪声与多径误差等因素影响 [9] 。另一方面,地理信息系统(Geographic Information System, GIS)是通过计算机,汇整地理量测数据,形成地理测绘数据库,并在该基础上,进行操作、更新、分析与可视化,以供资源调查、监测预测、城市规划、辅助决策、信息补充与军事等工作上的运用。结合二者,开启了地图导航应用的发展。
高德地图
高德地图(Amap)是国内最具代表性的地图导航厂商之一。高德地图能提供行动装置在现实环境位置的映射机制,透过高德开放平台的支持,应用开发者能以低成本取得地图、定位、导航与搜索的功能,成为相关创意应用开发的基础 [10] 。在Android开发支持部份,高德地图开放平台提供Android地图、Android轻量版地图、Android定位、Android导航与Android猎鹰等软件开发套件(Software Development Kit, SDK)。在网页(Web)端开发支持部份,高德地图开放平台则提供有Web服务、猎鹰服务与物流服务的API。高德地图开放平台的Android地图SDK是一套地图开发的调用接口,支持室内外地图显示、地图交互、地图绘制、兴趣点搜索、地理编码与离线地图等功能,提供com.amap.api.maps、com.amap.api.map2d与com.amap.api.services 3个程序包,分别提供3D矢量地图显示与离线地图、栅格地图显示与覆盖物绘制以及兴趣点搜索、路径规划、公交查询与地理编码等服务。本研究采用高德地图开放平台所提供的API实现用户与虚拟宝物(下称虚宝)的定位功能。
2.2. 增强现实
增强现实(Augmented Reality, AR)是将虚拟信息融入真实世界环境并整合呈现的一种涉及虚实结合、三维建模、传感计算与计算机视觉研究领域的技术。增强现实技术通过将虚拟物件在行动或穿戴装置追踪环境过程中所得之相对位置上,以适当姿态(Pose)渲染(Render)出来并叠加在画面上,以在视觉上将虚拟物件显现在装置摄像头所对准之环境画面上的方式,实现对现实世界的增强。增强现实的基础建立在装置对自身位置、位向(Orientation)、姿态与环境特征的感知能力上,在Smith与Cheeseman于1986提出空间不确定性的表示与估测方法之后 [11] ,SLAM与IMU方面的研究,受到越来越多的关注。

Figure 1. Diagram of the architecture of visual SLAM system
图1. 视觉SLAM系统架构图
AR的核心技术基础是机器人学范筹中的SLAM与IMU。SLAM要解决的问题是在没有先验环境信息的情况下,装置透过自身运动,在运动过程中建立起环境模型,同时也建立出对自身运动的估计。近年来,由于计算机视觉技术的发展,视觉SLAM成为解决此类问题的主要思路之一。视觉SLAM的技术架构由传感器数据、前端视觉里程计(Visual Odometry, VO)、后端非线性优化、回环检测与建图5个模块所组成 [12] 。如图1。传感器数据模块着重在为各类IMU所采集之数据进行必要之前处理。VO模块综合IMU与相机采集之数据与图像,估测相邻图像间的运动并建立局部地图。后端优化模块进行滤波与优化,降低误差,避免误差传导。闭环检测模块处理位姿漂移问题,计算装置是否回到之前走过的点上,将装置运动轨迹与之前所建地图对齐。建图模块则负责建立环境的表示,即建立地图。在移动端AR中,主要以稀疏地图建立对物理环境的映射。谷歌ARCore就是基于SLAM技术的研究基础,为行动装置所打造出的AR应用开发平台 [13] 。
ARCore
ARCore也被称为Google Play Services for AR,用来让行动装置感知其与周围环境的相对位置关系、自身姿态与环境光照条件。它能通过相机影像,检测出不同的视觉特征点,进而计算出自身位置与环境特征的变化。ARCore主要做的工作是动作跟踪(Motion Tracking)、环境理解(Environmental Understanding)与光照估计(Light Estimation)。动作跟踪通过SLAM技术,从相机所得影像中找出特征点,以此找出自身位置的变化,辅以从IMU所测得的姿态,就能将装置姿态与虚拟姿态对齐,如此即能以正确的透视角度来渲染虚拟物,并将其叠加在相机影像上。环境理解是通过影像特征点来不断更新装置所在环境的数据,以检测出平面、边界与障碍物等信息,帮助在画面上渲染出位置与姿态正确的虚拟物。光照估计则估算所在环境等光线条件,如光照强度及色彩,有助于渲染出具有相同光照与色彩条件的虚拟物。
ARCore API中的核心组件有会话(Session)、点(Point)、点云(Point Cloud)、平面(Plane)、姿态(Pose)、锚点(Anchor)、与相机(Camera)等。会话是ARCore API操作的进入点,ARCore中的所有AR流程,即动作跟踪、环境理解与光照估计,都在会话中进行。点是从相机影像中所识别出的特征点,点云则是由一些三维化后的特征点所组成,点云就形成ARCore用来理解环境的数据。平面是由点云中估算出之环境中的可能平面,是许多AR应用的起点。平面是虚拟物件置放的重要依据,平面可以是水平、垂直或倾斜的,虚拟物件就可以被挂载于其上。姿态是描述装置坐标空间到环境(世界)坐标空间的转换,透过这个转换,可从装置(相机)的姿态估算出环境中某锚点的正确姿态。锚点定义了环境坐标中的1个固定点,可将虚拟物锚定在环境坐标中,确保环境中虚拟物的位置与姿态。相机则是现实环境与虚拟环境的共同观察窗口,在其所传回的帧叠加上渲染的虚拟物,即形成了现实与虚拟融合的画面。ARCore API的操作流程是先定义会话组态,并以之创建会话(Session),挂载OpenGL表面视图(GLSurfaceView)。在编写碎片生命周期(life cycle)与加入会话的相应观察者(如画面渲染器)后,就能依据会话状态的改变,在各个事件处理方法中,进行相应功能的操作。如图2所示,灰色方块表示会话的状态,白色方块表示程序所运行的操作,onResume、onPause、onDestroyView则为Android碎片组件的生命周期回调方法。

Figure 2. Diagram of the lifecycle of a session
图2. 会话生命周期图
2.3. 经纬度与距离换算
本应用须要从用户与虚宝位置换算出二者间的距离,以更好地将虚宝渲染在画面上。从经纬度换算成距离有二种常用的算法,即半正矢公式(Haversine Formula)与文森蒂公式(Vincenty Formula),其中文森蒂公式的精确度较高,但计算成本也较高。虽然在Android的地图与位置的API库中,二种算法都有实现,但在手机上,考虑到节约电能,及虚宝位置无需十分精确,本应用采用比较简单的半正矢公式来做经纬度与距离的换算。半正矢公式如式(1):
(1)
其中,S为换算所得的距离,Lng1与Lng2为二点的经度,而Lat1与Lat2则为二点的纬度,6378.137则为地球半径,单位为千米。
3. AR应用的设计与开发
本研究旨在设计与实现AR商品推广平台的前端应用。平台主要由手机应用、商品上架网站、管理网站与服务器4个模块所组成。如图3。系统的设计概念是用户以Android手机应用通过网路连接到服务器,获取虚宝(商品优惠凭证)所在位置与信息,并依照地图到达虚宝位置附近后,进入应用的AR模式寻取宝虚,待满足厂商所设定之条件后,通过虚宝寻取记录,向厂商兑换优惠商品。本文主要研讨Android手机端应用的开发。
3.1. 需求分析
为了实现上述概念,本研究依据10位手机用户操作应用的习惯与本应用的预期效果,找出必须满足的6个需求,以作为设计依据。如表1。本研究将依据功能需求与评估指标进行Android应用的设计与开发。

Figure 3. Diagram of the system designing concept
图3. 系统设计概念图

Table 1. Table of the functional needs for the application
表1. 应用功能需求表
3.2. 系统设计
系统设计须满足需求分析结果所得出的需求。根据上述6个需求,下文分别就架构设计、功能设计与界面设计进行说明。
3.2.1. 架构设计
本应用依据功能需求划分出位置标示、虚宝寻取、虚宝管理与网络4个模块的架构。位置标示模块负责呈现标示出用户及虚宝位置的高德地图,让用户可以依循地图前往虚宝所在位置,此模块在地图碎片(fragment)中实现。虚宝寻取模块负责呈现用户能在其中寻取虚宝的AR画面,此模块在AR碎片中实现。虚宝管理模块负责呈现已寻取之虚宝列表与各个虚宝的信息,用户能以之兑换厂商所提供的购物优惠,此模块在我的背包碎片中实现。网络模块负责为应用进行数据传输,将虚宝的位置与信息,传输到应用中,供其他模块使用。另一方面,亦须在云端数据库中标记出已被寻获的虚宝,使其不再显示于地图上。上述的3个碎片挂载在1个活动(Activity)上,网路模块则为辅助工具供碎片调用,以异步通信方式,与后端服务器进行数据传输。应用架构如图4所示。
3.2.2. 功能设计
Android应用设计主要满足用户定位、标示虚宝位置、AR寻取虚宝与管理已寻取虚宝的需求。本研究以1个内嵌3个碎片的活动为主体,分别在3个碎片中实现用户及虚宝定位、AR寻取虚宝与虚宝管理

Figure 4. Architecture of the AR mobile application
图4. AR移动应用架构图
3项主要功能。地图碎片先通过网络模块取得附近虚宝的位置,服务器会返回距目前用户位置5千米内的虚宝,接着调用高德地图的API,显示用户位置并标示出临近的虚宝位置。在AR碎片中则运用ARCore工具,计算用户与虚宝间的距离与朝向,相对于镜头位置,创建Pose,再创建Anchor,将虚宝挂载到Anchor上,如此即可将虚宝置放到ARCore跟踪所得之环境中的适当位置,待手机转到合适的角度时,虚宝就会被渲染在画面中的正确位置上。此外,用户可以通过点击虚宝的方式寻取虚宝。我的背包碎片中则以列表视图(RecyclerView)呈现用户已寻取之虚宝,并提供兑换优惠商品的信息。
3.2.3. 界面设计
本应用的界面设计依循谷歌Material Design设计系统的指导原则,以简洁、清晰、易于识别与操作为导向,所使用的图标、文字与颜色等界面元素,符合多数用户的操作习惯。本应用的界面设计如图5所示。
3.3. 应用实现
本应用以1个Android活动组件来实现。在活动启动时,进行必要权限的请求,所需的授权有网络定位、GPS定位、连网、外部储存区读写、后台定位与相机使用等权限。若用户授权,则连接服务器,取得附近虚宝的位置与信息。若用户拒绝授权,则弹出对话框,说明应用功能将受到限制的原因。此外,高德地图在使用前,亦须在AMapLocationClient对象上调用updatePrivacyShow()与updatePrivacyAgree()这2个保障个人信息安全的方法,以配合个人信息保护法的实施。在活动画面底部,安排了底部导航栏(BottomNavigationView),用来切换碎片容器(NavHostFragment)所承载的碎片。
本应用设计有3个碎片,用来承载位置地图、AR虚宝寻取及我的背包视图。进入应用先呈现的是地图碎片,其中所实现的是高德地图的地图视图(MapView)。将地图视图导入后,设定地图显示的样式、镜头(Camera)的缩放倍率,位置来源(Location Source)、信息窗适配器与操作界面选项后,调用Activate方法,设定定位选项,然后启动定位,并在位置变化的回调方法(onLocationChange)中,于虚宝的经纬度位置上,加入标示点(Marker)与信息窗,如此即可在地图碎片中,显示用户与虚宝的位置。本应用采用的是高德3D地图,视角设定为60度,缩放比例为第18级,地图上也显示比例尺及目前位置、指北针与比例缩放按钮,便利用户操作。用户抵达虚宝附近时,须跳转到AR碎片上进行宝物寻取。
使用ARCore API首先须确认用户装置上已安装最新版的GooglePlayServices for AR支持库,并已授权使用相机。确认后,产生会话生命周期、渲染器与视图的观察者(observer)对象,并在碎片中加入观察者对象,让各观察者依照碎片的状态,进行相应的操作。会话对象整合运动传感器及视觉处理数据并跟踪手机姿态,会在相应的时机,通知观察者,让观察者得知会话的状态,以做出因应的措施。最后,由于会话对象会占用不少内存,在碎片销毁的回调方法(onDestroyView)中,必须将会话对象销毁,以释放资源。AR碎片首先要取得附近虚宝的经纬度,与目前用户经纬度作计算,取得虚宝与用户间的相对距离与方位,并以此在会话中创建出相对于镜头的Pose对象,并用这个对象在会话中创建出ARCore锚点,并将虚宝物件挂载到新建锚点上,如此ARCore便可在手机相机转到适当方位时,把挂载在锚点上的虚宝渲染出来。AR碎片中置入了OpenGL表面视图(GLSurfaceView),供视图渲染使用,在其上设定点击监听器(onTouchListener),在用户点击某个虚宝时,能调用回调方法进行是否发生碰撞的射线检测(Ray Casting),让用户取得其所点击的虚宝。
我的背包碎片运用Android中的RecyclerView元件来显示已寻取虚宝的列表,点击列表项目会带出对话框,显示虚宝的信息,并可连接到商品的优惠活动页面,参与活动兑换优惠商品。
4. 结果与讨论
本应用以Android Studio为工具,搭配高德地图SDK与谷歌ARCore SDK开发而成。我们将应用安装在5部不同厂牌的Android手机上,于广西玉林师范学院校园进行测试,应用运行的截图如图6所示。
在应用开发与测试的过程中,我们发现了几个问题,讨论如下:
1) 从其他碎片切换回地图时,会启动重新定位,而在重新定位未完成前,画面上呈现的是高德地图预设的北京地区,造成使用体验不佳。未来将通过设定地图预设位置来修正,不过,修正需要在地图显示前进行,在高德地图第1次定位完成取得目前位置之前,就要通过Android系统自带的方法,取得目前位置的经纬度,才能解决上述问题。
2) ARCore在会话能正常跟踪之前,环境映射的功能尚无法使用。要先让ARCore进入正常跟踪状态的话,用户必须移动手机,让ARCore能收集更多环境信息,进而才能检测出平面。这对没有AR应用使用经验的用户而言,不太容易适应。这是AR类应用普遍面临的问题,可能要从预先建置环境模型的角度来着手,但这牵涉到街景环境图资建置的问题,在类似谷歌街景的应用基础建设未完成前,只能对特定的、有应用价值的小范围区域进行环境数据的采集与计算,不过整个建置过程的成本相当高,也超出本文的研究范围。
3) 从其他碎片切换回AR碎片时,ARCore会话必须重新识别环境,这就又回到问题2的情况。目前,可尝试将ARCore会话挂载到活动上,让会话不致在碎片转换的过程中被销毁。不过,这也难保用户在操作其他碎片时,其所在位置与手机不会有太大的改变或晃动,让会话的运动跟踪不会被中断。这点有待后续实验确认。而如何让装置能迅速地了解所在环境,这也是值得继续深入探讨的题目。
4) 到达虚宝所在地,却只能点击虚宝来取得虚宝,对用户的吸引力有限。未来可研发与虚宝间可能的交互模式,对用户产生更大的吸引力。
5) 最后,本应用还未能创建商品的3D模型,若系统要落地运营,必须要提供商品模型创建的机制或服务。

Figure 6. The screen captures of the running application
图6. 应用运行截图
5. 总结
本研究实现了供Android手机使用的AR商品推广应用。以Android Studio为手机端应用开发的工具,搭配高德地图与谷歌ARCore的开发套件进行AR应用的设计与开发。通过采用类似精灵宝可梦游戏的方式,让用户能够从地图上发现商品推广虚宝的位置,并在抵达虚宝位置附近后,以AR方式寻取虚宝,取得数字优惠凭证,用以参加商品的推广优惠活动。对用户而言,寻宝过程中,能在高德地图的指引与谷歌ARCore融合虚拟与现实的环境中寻取虚宝,能在现实世界中与虚宝交互,是一种不一样的AR购物体验。对商品销售方而言,平台提供了AR式的产品推广渠道,能提高企业形象与销售业绩。本文主要探讨高德地图与谷歌ARCore技术在移动装置上的应用方式,除了重点梳理高德地图定位与谷歌ARCore技术外,亦整合运用其开发套件,结合地图定位与增强现实技术,设计并开发出一款AR式商品推广的Android手机应用,为商品的销售提供一个结合线上线下、现实与虚拟的商品推广管道。
基金项目
2022年广西自治区大学生创新创业训练计划项目。