RealityKit - měření vzdálenosti v prostoru od pozice kamery

02.11.2023 Programování #ios #lidar #realitykit #programming

Ukázka aplikace pro měření vzdálenosti s využitím senzoru LIDAR a knihovny RealityKit na zařízeních se systéme iOS.


 Programový kód umožňuje uživateli vidět vzdálenost od kamery k bodu v prostoru, který byl detekován pomocí raycastu, což může být užitečné pro různé AR aplikace, jako je měření vzdáleností nebo umisťování objektů v prostoru.

import SwiftUI
import UIKit
import RealityKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {
    
    @IBOutlet weak var arView: ARView!
    @IBOutlet weak var lblDistance: UILabel!
       
    override func viewDidLoad() {
        super.viewDidLoad()
        
        arView.automaticallyConfigureSession = false
        arView.session.delegate = self
        
        let config = ARWorldTrackingConfiguration()
        config.sceneReconstruction = .meshWithClassification
        arView.debugOptions.insert(.showSceneUnderstanding)
        arView.session.run(config, options: [])
        
    }
    
    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        let centerPoint = CGPoint(x: arView.bounds.midX, y: arView.bounds.midY)
            if let raycastResult = arView.raycast(from: centerPoint, allowing: .estimatedPlane, alignment: .any).first {
                // Calculate the distance from the camera to the raycast result
                let cameraTransform = frame.camera.transform
                let cameraPosition = SIMD3<Float>(cameraTransform.columns.3.x, cameraTransform.columns.3.y, cameraTransform.columns.3.z)
                let hitTestPosition = SIMD3<Float>(raycastResult.worldTransform.columns.3.x, raycastResult.worldTransform.columns.3.y, raycastResult.worldTransform.columns.3.z)
                let distance = simd_distance(cameraPosition, hitTestPosition)
                
                // Do something with the distance
                lblDistance.text = "Distance: " + String(format: "%.2f", distance) + " m"
            }
    }
 
}

Zde je vysvětlení jednotlivých částí kódu:

  • import příkazy načítají potřebné moduly. SwiftUI a UIKit jsou frameworky pro vytváření uživatelského rozhraní, RealityKit je framework pro práci s rozšířenou realitou a ARKit je Apple framework pro rozšířenou realitu.
  • ViewController je třída, která dědí od UIViewController. Implementuje protokoly ARSCNViewDelegate a ARSessionDelegate, které umožňují reagovat na události spojené s AR scénou a AR session.
  • @IBOutlet jsou speciální proměnné používané v Interface Builderu k propojení UI komponent z storyboardu s kódem. arView je pravděpodobně instance ARView, což je pohled pro zobrazování AR obsahu, a lblDistance je UILabel pro zobrazování vzdálenosti.
  • viewDidLoad() je metoda volaná po načtení view controlleru, kde se nastavuje AR session a její konfigurace. automaticallyConfigureSession je nastaveno na false, což znamená, že session nebude automaticky konfigurována. Místo toho se používá manuálně nastavená konfigurace ARWorldTrackingConfiguration, která umožňuje sledování polohy a orientace zařízení a rekonstrukci scény s klasifikací.
  • arView.debugOptions.insert(.showSceneUnderstanding) nastavuje debugovací možnosti pro arView, aby zobrazovala vizuální pomůcky pro lepší pochopení scény, jako jsou například mřížky na detekovaných plochách.
  • arView.session.run(config, options: []) spouští AR session s předem nastavenou konfigurací.
  • session(_:didUpdate:) je metoda protokolu ARSessionDelegate, která je volána pokaždé, když se aktualizuje frame AR session. V této metodě se provádí raycast ze středu obrazovky do scény, aby se zjistila přibližná poloha v prostoru, kam uživatel směřuje zařízení.
  • Raycast vrací první výsledek, který je použit k výpočtu vzdálenosti od kamery k bodu v prostoru, kde raycast narazil.
  • Vzdálenost je poté převedena na textový řetězec a zobrazena v UILabel lblDistance.

ios-distance