Try MAXST AR Fusion Tracker Now ✨

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
Set Rendering Options

Create Instants

>SlamViewController.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.

>SlamViewController.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()
  • Saving map is only possible while tracking. Refer to the following code for the file storage location when you save the generated map data as a file.

>SlamViewController.swift

func getFilePath() -> String {
    let documentPaths:[String] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentPath:String = documentPaths[0]
    let contentsPath:String = "\(documentPath)/3DMap"
    
    let fileManager:FileManager = FileManager.default
    
    var isDir:ObjCBool = false
    let exists = fileManager.fileExists(atPath: contentsPath, isDirectory: &isDir)
    
    if exists == false {
        try! fileManager.createDirectory(atPath: contentsPath, withIntermediateDirectories: true, attributes: [:])
    }
    
    let filePath:String = "\(contentsPath)/\(getDateForFileName())"
    
    return filePath
}

Set Rendering Options

Feature points, SLAM initialization progress, and axis can be created with 'FeaturePoint', 'Axis' class. Refer to the following code.

>SlamViewController.swift

func startEngin() {
    ...
    featurePoint = FeaturePoint()
    axis = Axis()
    ...
}
override func glkView(_ view: GLKView, drawIn rect: CGRect) {
      ...
      if let feature = featurePoint {
            feature.draw(trackingManager: trackingManager, projectionMatrix: projectionMatrix)
        }
    
        glEnable(GLenum(GL_DEPTH_TEST))

        let trackingCount:Int32 = result.getCount()
        
        for i in stride(from: 0, to: trackingCount, by: 1) {
            let trackable:MasTrackable = result.getTrackable(i)
            
            axis.setProjectionMatrix(projectionMatrix: projectionMatrix)
            axis.setPoseMatrix(poseMatrix: trackable.getPose())
            axis.setTranslation(x: 0.0, y: 0.0, z: 0.0)
            axis.setScale(x: 0.3, y: 0.3, z: 0.3)
            axis.draw()
        }
        ...
}

Preferably, use landscape left mode (screen orientation) for Visual SLAM.