使用ARKit和Google Maps的GPS导航

增强现实(AR)允许用户体验现实世界中的虚拟对象。 苹果发布ARKit之后,为iOS构建AR应用程序变得很容易。 让我们考虑您要从源头到目的地旅行。 如果您可以看到一个在导航时显示方向的AR视图,而不是依靠2D应用程序,那将是多么令人兴奋。 可以使用带有ARKit的Google Maps SDK轻松构建此类应用程序,其中Google Direction Api在两个位置之间提供所需的方向信息。然后,这些方向信息用于在Google Maps和AR环境中绘制路线。

让我们看一下用于构建AR导航应用程序的框架。

2.1 Google Maps SDK

Google Maps SDK会自动处理对Google Maps服务器的访问,地图显示以及对用户手势(例如单击和拖动)的响应。 它允许在地图上添加标记,折线,地面叠加层和信息窗口。 为了提出Google API请求,必须具有有效的API密钥。

2.2 ARKit

ARKit框架允许开发高细节的增强现实体验。 在ARKit的帮助下开发的应用程序使用Visual Inertial Odometry(VIO)将虚拟对象放到了现实世界中。 在这里,ARKit框架用于开发实时导航应用程序,该应用程序通过将虚拟对象放置在增强现实场景中来显示从源到目的地的路径。

现在让我们跳入构建此应用程序必须实现的两个关键方面。

3.1。 在Google地图上的源和目标之间绘制路线。

Google Maps SDK支持在源位置和目标位置之间的地图上绘制概图折线。 源始终是用户的当前位置,该位置不可编辑。 用户只需提供其坐标即可选择任何目的地。 Google Directions Api会获取位置之间的路线。 它有助于根据区域搜索路线,指定不同的交通方式(驾驶,步行或骑自行车),不同的交通模式等。 确保您具有用于使用方向api的有效api密钥。

Google Direction URL:

https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&mode= \(travelMode)&key = \(ApiKey)

以下示例以JSON格式请求从旧机场路到Indiranagar的步行路线:

https://maps.googleapis.com/maps/api/directions/json?origin=12.96023760508684,77.6436832043738&destination=12.9718915,77.6411545&mode=”walking”&key=ApiKey

获得的JSON响应包含以下信息:

  1. status :此字段指示响应是否包含有效数据。 如果Api无法获取结果,则此字段提供有助于跟踪的调试信息。
  2. geocoded_waypoints :此字段包含一个数组,其中包含有关起点,目的地和航点的地理编码的详细信息。
  3. 路由 :它包含源和目的地之间的路由数组。 此数组由包含中间坐标详细信息的“腿和台阶”组成。

从json响应的路由中获取以下信息:

  1. 总距离和旅行持续时间。
  2. 路线的“腿”内的“步骤”数组提供了以下详细信息:

2.1。 指定为end_location的中间坐标。

2.2。 行驶距离。

2.3。 旅行时间。

2.4。 html形式的方向指示。

上面获取的详细信息用于在Google Maps上绘制路径和在ArSceneView上绘制路径。

3.2。 使用ARKit在源和目标之间绘制增强现实路径。

增强现实导航是借助ARKit框架实现的。 在这里,虚拟对象放置在中间坐标处。 遍历方向以文本和路径箭头的形式表示。

3.2.1如何在ArSceneView中设置增强现实导航?

  1. 加载ArSceneView。 SceneKit允许开发人员使用高级场景描述创建3D内容并将其添加到应用程序。
  2. 将世界对齐方式设置为gravityAndHeading。 将对齐方式设置为gravityAndHeading,可使y轴与重力平行,z和x轴与指南针航向对齐。 原点放置在设备的初始位置。 (请参阅图像3.2.1.1)
  3. 将虚拟对象(立方体)放置在中间坐标处:
    为了帮助用户从源导航到目标,将虚拟对象放置在中间坐标处。 还将显示更多的方向指示和方向箭头,在导航时会提供其他信息。

要将3D对象放置在中间坐标处,请将以下逻辑应用于每个中间坐标:

  1. 计算源坐标和中间坐标之间的距离。
  2. 计算源坐标和中间坐标之间的方位角。
  3. 创建转换矩阵。
  4. 创建一个SCNNode。
  5. 将转换矩阵应用于在步骤3中创建的节点。

创建转换矩阵:

  1. 创建一个距离为z的三元素向量,以获取平移矩阵。
  2. 使用单位矩阵,使用该方位角获得y轴上的旋转矩阵。
  3. 将平移矩阵和旋转矩阵相乘(记住乘法的顺序很重要),以获得最终的变换矩阵。

在两个坐标之间放置方向箭头:

  1. 获取放置在坐标处的两个节点的SCNVector位置。
  2. 创建带有向上方向箭头作为其图像的SCNPlane。
  3. 令SCNPlane的位置为2个坐标的中点。
  4. 将SCNPlane绕x轴旋转.pi / 2。
  5. 围绕y轴旋转SCNPlane坐标之间的角度。

增强现实导航是热门话题之一。 我已经为增强现实导航创建了pod(navigationar),以便在有或没有Google Maps集成的情况下体验导航。 窗格只能根据用户的CLLocationCoordinate2D和Google api键要求源坐标,目标坐标显示增强现实路径。

在系统上安装CocoaPods

步骤1

打开终端并输入以下命令:

须藤宝石安装cocoapods

为项目创建Podfile

第2步

创建一个XCode项目并关闭它。 在项目的根文件夹中打开终端。

步骤3

现在输入以下命令来创建podfile:

荚初始化

编辑Podfile

步骤4

键入以下命令以使用Xcode打开Podfile进行编辑:

打开-Xcode Podfile

步骤5

如下所示更新pod文件,保存并关闭。

步骤6

在终端中输入以下命令,然后按Enter

吊舱安装

使用Pod打开项目

现在转到项目文件夹,并使用xcode打开project_name.xcworkspace,吊舱将已安装。

注意:初始化pod的ARPathViewController类,将源,目标作为CLLocationCoordinate2D,将Google api键作为字符串。