ARKit增强现实版实景导航开源

简介: ARKit使用摄像头和运动数据来绘制用户移动时本地的地图;CoreLocation使用WiFi和GPS数据来确定位置,精度比较低;ARKit + CoreLocation将高精度的AR与GPS数据相结合。

ARKit + CoreLocation

ARKit:使用摄像头和运动数据来绘制用户移动时本地的地图。

CoreLocation:使用WiFi和GPS数据来确定位置,精度比较低。

ARKit + CoreLocation:将高精度的AR与GPS数据相结合。

Points of interest demoNavigation demo

将这些技术结合起来的潜力是巨大的,在许多不同的领域有着很多的应用。 这个库有两个主要的特点:

  • 允许使用真实世界的坐标将元素放置在AR世界中。
  • 利用最近的位置数据点,并结合有关AR世界运动的知识,极大地提高了定位精度。

位置精度的改进目前还处于实验阶段,但在未来可能是最重要的组成部分。

由于目前还有一些工作尚未完成,并且存在其他方面的原因,因此最好由一个开放的社区来为这个项目服务,而不是通过GitHub Issues的方式。 所以我开放了一个Slack组,任何人都可以加入进来,讨论有关这个库的改进和大家的工作。

加入Slack社区

软硬件要求

ARKit需要iOS 11系统,并支持以下设备:

  • iPhone 6S及以上
  • iPhone SE
  • iPad(2017)
  • iPad Pro的所有型号

iOS 11可以从Apple的开发者网站上下载。

使用方法

这个库包含了ARKit和CoreLocation框架, 同时还包含了一个类似于Demo 1的演示程序。

使用CocoaPods进行设置

  1. 将本库添加到你的podfile中:

    `pod 'ARCL'`
  2. 在终端中,进入你的项目目录,然后执行:

    `pod update`
    `pod install`
  3. 添加 NSCameraUsageDescription 和 NSLocationWhenInUseUsageDescription 到 plist文件中以添加一个简短说明(请参考演示项目)

手工设置

  1. 将ARKit+CoreLocation/Source目录中的所有文件添加到项目中。
  2. 导入ARKit、SceneKit、CoreLocation和MapKit。
  3. 添加 NSCameraUsageDescription 和 NSLocationWhenInUseUsageDescription 到 plist文件中以添加一个简短说明(请参考演示项目)

快速入门指南

要在一座建筑物上放置一个标注点,例如伦敦的金丝雀码头,我们要使用包含ARCL的主要类:SceneLocationView。

首先,导入ARCL和CoreLocation,然后将SceneLocationView声明为属性:

import ARCL
import CoreLocation

class ViewController: UIViewController {
  var sceneLocationView = SceneLocationView()
}

当获取到焦点时,调用sceneLocationView.run(),当中断时,调用sceneLocationView.pause(),例如移动到不同的视角或者退出应用程序。

func viewDidLoad() {
  override func viewDidLoad() 
  super.viewDidLoad()

  sceneLocationView.run()
  view.addSubview(sceneLocationView)
}

在调用run()之后,就可以添加坐标了。 ARCL附带一个名为LocationNode的类,它是3D场景中的一个对象,具有真实世界的位置,并且可以在世界范围内显示其他一些属性。 LocationNode是SceneKit的SCNNode的子类,也可以进一步子类化。 对于这个例子,我们将使用一个名为LocationAnnotationNode的子类,我们用它在世界上显示一个总是面向我们的2D图像:

let coordinate = CLLocationCoordinate2D(latitude: 51.504571, longitude: -0.019717)
let location = CLLocation(coordinate: coordinate, altitude: 300)
let image = UIImage(named: "pin")!

let annotationNode = LocationAnnotationNode(location: location, image: image)

默认情况下,你设置的图像会以给定的尺寸显示出来,例如,如果你提供了一个100x100的图像,则会在屏幕上显示为100x100像素大小。 这意味着远处的注释点与近处的注释点看起来大小是相同的。 如果你希望按距离的远近进行缩放,可以将LocationAnnotationNode的scaleRelativeToDistance设置为true。

sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: annotationNode)

就是这样了。 如果你设置sceneLocationView的帧,则现在应该会看到Canary Wharf上方悬停的标注点了。

附加功能

这个库以及演示程序附带了一些额外的配置功能。这些都在文档里做了详细介绍,一定要去看看。

SceneLocationView是ARSCNView的一个子类。 请注意,虽然这样可以让你完全访问ARSCNView以通过其他方式去使用它,但你不应将委托设置为另一个类。 如果你需要使用委托功能,那么应该将SceneLocationView子类化。

正北校准

有一个我个人无法攻克的难题,目前iPhone正北校准精度最高为15º。这对地图导航来说还好,但是要将东西放在AR世界上时,它就成为了一个问题。

我相信通过使用各种AR技术可以攻克这个问题。

为了改善这个问题,我在库中添加了一些函数,可以用来调整正北方向:

  • sceneLocationView.moveSceneHeadingClockwise
  • sceneLocationView.moveSceneHeadingAntiClockwise
  • sceneLocationView.resetSceneHeading

要使用这些函数,你要将sceneLocationView.useTrueNorth设置为false,然后在开始之前将设备指向北方的大致一个方向,这样它才能更接近正北。将useTrueNorth设置为true(默认),它会根据自己的感觉不断调整正北方。

在演示程序中,有一个名为adjustNorthByTappingSidesOfScreen的属性,它用于访问这些函数,默认是禁用的。一旦启用这个属性,则允许通过点击屏幕的左侧或右侧来调整场景方向。

我的建议是你所处位置的正北方的附近放置一个地标,使用坐标在那个地方放置一个对象,然后使用moveSceneHeading函数来调整场景,直到它们排成一条线。

改进的定位精度

CoreLocation每1-15秒更新一次位置,精度从150米到4米不等。有时候,你会收到更精确的读数,如4米或8米。同时,AR使用运动和相机数据来创建本地世界的地图。

用户可能会收到精度为4米的位置,然后他们向北走10米,并接收到另一个位置,读数精确到65米。 这个精度为65米的读数是CoreLocation可以提供的最好的精度,但是当获取到4米精度的读数时,程序知道用户在AR场景中的位置,以及接着朝北走了10米,我们可以通过转换这个数据来提供一个新的精度为4米的坐标。这样就精确到了大概100米。

问题

我曾经提到,目前这些尚处于实验阶段。当用户经过某个场景的时候,ARKit偶尔会发生错乱,并给出错误地位置数据。 这个问题似乎也影响到了“欧拉角度”或者有关设备的方向信息。所以,在走过一小段距离之后,它可能会认为你目前正向着另外一个方向行走。

虽然苹果今后会改进ARKit,但我认为,为了避免出现这些问题,我们需要自己进行改进,例如识别出何时会出现问题并进行纠正,以及通过将位置数据与我们假定的位置进行比较,以确定是否已经超过了某个值。

定位算法改进

我们需要进一步优化定位算法。

例如,有一种技术是查看最近的位置数据,转换用户行程中的每一个点,然后使用数据点之间的重叠来更精确地确定用户可能的位置。

鸣谢

作者@AndrewProjDent,以及相关社区。

在MIT许可证的条款下开源。

文章原标题《ARKit-CoreLocation》,作者:Andrew Hart,译者:夏天,审校:主题曲。

文章为简译,更为详细的内容,请查看原文

相关文章
|
Kubernetes 搜索推荐 Linux
Containerd容器镜像管理
Containerd容器镜像管理
|
关系型数据库 MySQL Linux
Alibaba Cloud Linux release 3 (Soaring Falcon)操作系统
Alibaba Cloud Linux release 3 (Soaring Falcon)操作系统
|
8月前
|
人工智能 运维 IDE
Claude Code神器:Manus同款文件规划法,价值20亿美元的工作流秘密
你有没有遇到过这种情况:给AI下个任务,聊了50轮后,它就开始"脑抽"了。 接口规范?忘了。 变量命名风格?混了。 你半小时前定的规则?直接抛到九霄云外。 你得一直提醒它,像保姆一样伺候它,效率低,还累。 但如果我告诉你,现在有个方法能让AI拥有"持久记忆"。 你只需要在项目里放三个Markdown文件,AI就会自动记录所有发现、避免重复踩坑、恢复断开的会话。 效率提升3
2483 9
|
人工智能 算法 定位技术
AR 导航导览技术如何实现的?提供全场景解决方案深度解析
传统导航在复杂场景中存在定位断层、空间认知成本高及实景导航实施难等问题。AR导航导览通过“实景+虚拟融合”,结合高精度定位引擎、实时三维渲染引擎和智能路径规划引擎,实现室内外无缝衔接的沉浸式体验。如需AR导航导览解决方案欢迎私信获取,如有项目合作及技术交流欢迎私信作者哦~
1439 1
|
9月前
|
XML JSON 定位技术
地理编码-逆地理编码-经纬度解析-逆经纬度解析API接口的运用
本文详解地理编码(地址→坐标)与逆地理编码(坐标→地址)技术,覆盖实时定位、车辆追踪、地图搜索与导航等应用场景;对比高德(GCJ02)与百度(BD09)地图API的参数、返回结构及坐标系差异,助力开发者快速集成位置服务。
1549 1
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
426 5
|
缓存 Java 测试技术
高德?不,用自己的导航
编写该文章的目的是在开发时需要用到自定义的路网导航,查阅高德、百度地图等相关网站后,并没有发现可自定义路网的导航,后来在Git上搜到了Graphhopper这个国外的开源软件,然后学习使用后实现了自定义路网导航的功能,现在记录一下自己的实现过程,以保存开发资料,并且帮助到需要实现相关功能的朋友。
880 1
|
数据采集 人工智能 数据可视化
SpatialLM:手机视频秒建3D场景!开源空间认知模型颠覆机器人训练
SpatialLM 是群核科技开源的空间理解多模态模型,能够通过普通手机拍摄的视频重建 3D 场景布局,赋予机器人类似人类的空间认知能力,适用于具身智能训练、自动导航、AR/VR 等领域。
1601 5
SpatialLM:手机视频秒建3D场景!开源空间认知模型颠覆机器人训练
阿里云服务器发票开具流程_发票抬头_发票常见问题解答FAQ
在阿里云开具发票,需登录用户中心访问发票管理页面。首次开票时设置发票抬头(个人/企业/事业单位),选择发票类型(增值税普通/专用)。随后选择需开票的订单并按提示操作。个人账号不可直接开企业发票,需变更实名认证。发票税率一般为6%,硬件为13%。发票抬头可修改,纸质发票邮费视情况由阿里云或用户承担,电子发票具同等法律效力且可报销。更多详情见阿里云帮助文档。
1968 9