Basic AR navigation
ViewController
import CoreLocationimport MapboxDirectionsimport MapboxVisionimport MapboxVisionARimport MapboxVisionARNativeimport UIKit /*** "AR Navigation" example demonstrates how to display navigation route projected on the surface of the road.*/ class ARNavigationViewController: UIViewController {var videoSource: CameraVideoSource!var visionManager: VisionManager!var visionARManager: VisionARManager! let visionARViewController = VisionARViewController() override func viewDidLoad() {super.viewDidLoad() addARView() // create a video source obtaining buffers from camera modulevideoSource = CameraVideoSource() // create VisionManager with video sourcevisionManager = VisionManager.create(videoSource: videoSource)// create VisionARManagervisionARManager = VisionARManager.create(visionManager: visionManager)// configure AR view to display AR navigationvisionARViewController.set(arManager: visionARManager) let origin = CLLocationCoordinate2D()let destination = CLLocationCoordinate2D()let options = RouteOptions(coordinates: [origin, destination], profileIdentifier: .automobile)options.includesSteps = true // query a navigation route between location coordinates and pass it to VisionARManagerDirections.shared.calculate(options) { [weak self] _, routes, _ inguard let route = routes?.first else { return }self?.visionARManager.set(route: Route(route: route))}} override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated) visionManager.start()videoSource.start()} override func viewDidDisappear(_ animated: Bool) {super.viewDidDisappear(animated) videoSource.stop()visionManager.stop()} private func addARView() {addChild(visionARViewController)view.addSubview(visionARViewController.view)visionARViewController.didMove(toParent: self)} deinit {// free up resources by destroying modules when they're not longer usedvisionARManager.destroy()// free up VisionManager's resources, should be called after destroing its modulevisionManager.destroy()}} private extension MapboxVisionARNative.Route {/**Create `MapboxVisionARNative.Route` instance from `MapboxDirections.Route`.*/convenience init(route: MapboxDirections.Route) {var points = [RoutePoint]() route.legs.forEach {$0.steps.forEach { step inlet maneuver = RoutePoint(coordinate: GeoCoordinate(lon: step.maneuverLocation.longitude,lat: step.maneuverLocation.latitude),maneuverType: step.maneuverType.visionManeuverType)points.append(maneuver) guard let coords = step.coordinates else { return }let routePoints = coords.map {RoutePoint(coordinate: GeoCoordinate(lon: $0.longitude, lat: $0.latitude))}points.append(contentsOf: routePoints)}} self.init(points: points,eta: Float(route.expectedTravelTime),sourceStreetName: route.legs.first?.source.name ?? "",destinationStreetName: route.legs.last?.destination.name ?? "")}} private extension MapboxDirections.ManeuverType {var visionManeuverType: MapboxVisionARNative.ManeuverType {switch self {case .none:return .nonecase .depart:return .departcase .turn:return .turncase .continue:return .continuecase .passNameChange:return .newNamecase .merge:return .mergecase .takeOnRamp:return .onRampcase .takeOffRamp:return .offRampcase .reachFork:return .forkcase .reachEnd:return .endOfRoadcase .useLane:return .nonecase .takeRoundabout:return .roundaboutcase .takeRotary:return .rotarycase .turnAtRoundabout:return .roundaboutTurncase .exitRoundabout:return .roundaboutExitcase .exitRotary:return .rotaryExitcase .heedWarning:return .notificationcase .arrive:return .arrivecase .passWaypoint:return .none}}}