Visual SLAM
Related documentations |
---|
Map Manager |
Tracker Coordinate System |
Visual SLAM Learning Guide |
The Visual SLAM(Simultaneous Localization and Mapping) creates a map by scanning 3D space.
Please refer Visual SLAM Learning Guide to create a map more precisely while scanning 3D space.
Create Instants
Start / Stop Tracker
Start / Stop Map Creation & Map Saving
Draw Object by SceneKit
Create Instants
>SlamGameViewController.swift
var cameraDevice:MasCameraDevice = MasCameraDevice() var sensorDevice:MasSensorDevice = MasSensorDevice() var trackingManager:MasTrackerManager = MasTrackerManager()
Start / Stop Tracker
To start / stop Tracker, refer to the following code.
>SlamGameViewController.swift
@objc func resumeAR() { ... trackingManager.start(.TRACKER_TYPE_SLAM) } @objc func pauseAR() { trackingManager.stopTracker() ... }
Start / Stop Map Creation & Map Saving
- To start a map generation, refer to the following code.
trackingManager.findSurface()
- To stop generating a map, refer to the following code.
trackingManager.quitFindingSurface()
Draw Object by SceneKit
You must use Convert Matrix for Metal.('metalConverter')
>SlamGameViewController.swift
func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) { if backgroundCameraQuad == nil { backgroundCameraQuad = BackgroundCameraQuad(device: renderer.device, pixelFormat: renderer.colorPixelFormat) } let commandEncoder:MTLRenderCommandEncoder = renderer.currentRenderCommandEncoder! let trackingState:MasTrackingState = trackingManager.updateTrackingState() let result:MasTrackingResult = trackingState.getTrackingResult() let surfaceMesh:MasSurfaceMesh! = trackingManager.getSurfaceMesh() if surfaceMesh != nil { let value:Float = surfaceMesh.getInitializingProgress() * 0.01 DispatchQueue.main.async(execute: { self.progressBar.setProgress(value, animated: false) }) } let backgroundImage:MasTrackedImage = trackingState.getImage() var backgroundProjectionMatrix:matrix_float4x4 = cameraDevice.getBackgroundPlaneProjectionMatrix() backgroundProjectionMatrix = backgroundProjectionMatrix * metalConverter let projectionMatrix:matrix_float4x4 = cameraDevice.getProjectionMatrix() if let cameraQuad = backgroundCameraQuad { if(backgroundImage.getData() != nil) { cameraQuad.setProjectionMatrix(projectionMatrix: backgroundProjectionMatrix) cameraQuad.draw(commandEncoder: commandEncoder, image: backgroundImage) } } let trackingCount:Int32 = result.getCount() if trackingCount > 0 { for i in stride(from: 0, to: trackingCount, by: 1) { let trackable:MasTrackable = result.getTrackable(i) let projectionSCNMatrix4 = SCNMatrix4.init(projectionMatrix) let poseSCNMatrix4 = SCNMatrix4.init(trackable.getPose()) cameraNode.camera?.projectionTransform = projectionSCNMatrix4 monsterNode.transform = SCNMatrix4Mult(monsterTransform, poseSCNMatrix4) } } else { monsterNode.scale = SCNVector3Make(0.0, 0.0, 0.0) } }
Preferably, use landscape left mode (screen orientation) for Visual SLAM.