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()
Starting / Stopping the 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.
You must use Convert Matrix for Metal.('metalMatrixConverter')
>SlamViewController.swift
func setupMetal() {
...
featurePoint = FeaturePointCPU(device: self.device)
axis = Axis(device: self.device)
...
}
func draw(in view: MTKView) {
...
featurePoint.draw(commandEncoder: commandEncoder, trackingManager: trackingManager, projectionMatrix: projectionMatrix)
let trackingCount:Int32 = result.getCount()
for i in stride(from: 0, to: trackingCount, by: 1) {
let trackable:MasTrackable = result.getTrackable(i)
let poseMatrix:matrix_float4x4 = trackable.getPose() * metalMatrixConverter
axis!.setProjectionMatrix(projectionMatrix: projectionMatrix)
axis.setPoseMatrix(poseMatrix: poseMatrix)
axis.setTranslation(x: 0.0, y: 0.0, z: 0.0)
axis.setScale(x: 0.5, y: 0.5, z: 0.5)
axis.draw(commandEncoder: commandEncoder)
}
...
}
Preferably, use landscape left mode (screen orientation) for Visual SLAM.
