Skip to content

Lhonatak/EyePath

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ARNavigation - Indoor Visual Navigation System

An iOS application that provides visual navigation for indoor environments using ARKit, designed to work in situations where GPS signals are weak or unavailable.

Overview

ARNavigation is a SwiftUI-based application that leverages Apple's ARKit framework to create an indoor navigation system. Users can create custom navigation paths by recording waypoints in 3D space, then use augmented reality to follow these paths for precise indoor navigation.

Key Features

🗺️ Path Creation & Management

  • Record custom navigation paths by walking through indoor spaces
  • Store multiple paths with descriptions and timestamps
  • Visual path preview with captured images
  • Core Data persistence for reliable path storage

🧭 AR-Based Navigation

  • Real-time augmented reality navigation using ARKit
  • 3D waypoint visualization with directional indicators
  • Compass-based orientation alignment
  • Distance and direction feedback
  • Audio cues for waypoint arrival

📱 User-Friendly Interface

  • SwiftUI-based modern interface
  • Onboarding flow for new users
  • Path management with edit/delete capabilities
  • Visual alignment system for accurate navigation start

Core Technologies

ARKit Framework

  • ARWorldTrackingConfiguration: Provides 6DOF tracking for precise positioning
  • RealityKit: Renders 3D waypoint models in AR space
  • AnchorEntity: Anchors virtual content to real-world positions
  • Camera Transform: Tracks user position and orientation

Core Data Stack

  • Persistent storage for navigation paths
  • Custom Path entity with properties:
    • position: Array of 3D coordinates for waypoints
    • truenorth: Compass headings for orientation
    • direction: Model names for waypoint visualization
    • pathname, pathdescription, timestamp: Metadata

Core Location

  • CLLocationManager: Provides compass heading for orientation
  • True north calculation for accurate directional guidance

Additional Frameworks

  • SwiftUI: Modern declarative UI framework
  • AVKit: Audio feedback system
  • AudioToolbox: System sound notifications

Architecture

App Structure

ARNavigationApp (Main)
├── OnboardingView (First-time user experience)
└── ContentView (Main path management)
    ├── PathDetailView (Individual path details)
    ├── compareView (Path alignment interface)
    └── ARViewContainer (AR navigation view)

Key Components

1. Path Recording (AutoAddPathView)

  • Real-time position tracking using ARKit
  • Automatic waypoint recording based on movement
  • Compass heading capture for each waypoint
  • Core Data persistence

2. Navigation Interface (compareView)

  • Visual alignment between recorded and current view
  • Camera feed comparison for accurate starting position
  • Integration with FrameModel for camera management

3. AR Navigation (ARViewContainer)

  • 3D model rendering for waypoints
  • Real-time distance calculation
  • Directional guidance using compass data
  • Progress tracking and arrival detection

Installation & Setup

Prerequisites

  • iOS 14.0+ (ARKit requirement)
  • Device with A12 Bionic chip or later (for optimal AR performance)
  • Camera and location permissions

Build Requirements

  • Xcode 14.0+
  • Swift 5.7+
  • iOS Deployment Target: 14.0+

Dependencies

  • ARKit (system framework)
  • RealityKit (system framework)
  • Core Data (system framework)
  • Core Location (system framework)

Usage

Creating a Navigation Path

  1. Tap the "+" button to create a new path
  2. Enter a name and description for your path
  3. Start recording at your desired starting point
  4. Walk to your destination while the app records waypoints
  5. End recording to save the path

Following a Navigation Path

  1. Select a saved path from the main list
  2. Position yourself at the starting point
  3. Align your orientation using the visual comparison screen
  4. Tap "开始导航" (Start Navigation) to begin AR guidance
  5. Follow the 3D waypoint indicators to your destination

Optimization Opportunities for Latest Swift

1. Swift Concurrency Migration

Current Implementation:

DispatchQueue.main.async {
    timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
        // Navigation logic
    }
}

Recommended Modern Approach:

@MainActor
class NavigationManager: ObservableObject {
    private var navigationTask: Task<Void, Never>?
    
    func startNavigation() {
        navigationTask = Task {
            while !Task.isCancelled {
                await updateNavigationState()
                try? await Task.sleep(for: .milliseconds(100))
            }
        }
    }
    
    func stopNavigation() {
        navigationTask?.cancel()
    }
}

2. Modern ARKit APIs

Current: Basic ARWorldTrackingConfiguration Upgrade to:

  • ARKit 6.0 features including improved plane detection
  • RoomPlan framework integration for better indoor mapping
  • Enhanced tracking capabilities with scene understanding

3. SwiftUI Modernization

Replace UIViewRepresentable with native SwiftUI:

// Modern SwiftUI approach with RealityView (iOS 17+)
import RealityKit

struct ARNavigationView: View {
    var body: some View {
        RealityView { content in
            // Setup AR content
        } update: { content in
            // Update logic
        }
        .gesture(navigationGesture)
    }
}

4. Data Management Improvements

Current: Traditional Core Data with manual management Recommend: SwiftData (iOS 17+) for modern persistence:

import SwiftData

@Model
class NavigationPath {
    var name: String
    var waypoints: [Waypoint]
    var createdAt: Date
    var description: String
    
    init(name: String, description: String = "") {
        self.name = name
        self.description = description
        self.waypoints = []
        self.createdAt = Date()
    }
}

@Model
class Waypoint {
    var position: SIMD3<Float>
    var heading: Double
    var modelName: String
    
    init(position: SIMD3<Float>, heading: Double, modelName: String) {
        self.position = position
        self.heading = heading
        self.modelName = modelName
    }
}

5. Observation Framework

Replace @StateObject/@ObservableObject with @Observable:

@Observable
class NavigationState {
    var currentIndex: Int = 0
    var distanceToNext: Float = 0
    var isNavigating: Bool = false
    var hasArrived: Bool = false
}

6. Enhanced Error Handling

Implement structured error handling:

enum NavigationError: LocalizedError {
    case arNotAvailable
    case pathNotFound
    case trackingLost
    
    var errorDescription: String? {
        switch self {
        case .arNotAvailable:
            return "ARKit is not available on this device"
        case .pathNotFound:
            return "Navigation path could not be loaded"
        case .trackingLost:
            return "AR tracking has been lost"
        }
    }
}

7. Performance Optimizations

Implement efficient model loading:

@MainActor
class ModelCache: ObservableObject {
    private var loadedModels: [String: ModelEntity] = [:]
    
    func loadModel(named name: String) async -> ModelEntity? {
        if let cached = loadedModels[name] {
            return cached.clone(recursive: true)
        }
        
        do {
            let model = try await ModelEntity.load(named: name)
            loadedModels[name] = model
            return model.clone(recursive: true)
        } catch {
            print("Failed to load model: \(error)")
            return nil
        }
    }
}

Hardware Recommendations

  • iPhone 12 or later for optimal ARKit performance
  • iPad Pro with LiDAR scanner for enhanced depth sensing
  • Sufficient lighting conditions for camera-based tracking

Privacy & Permissions

The app requires:

  • Camera access for AR functionality
  • Location services for compass data
  • Local storage for path data (no external data transmission)

Future Enhancements

  1. Integration with Core ML for object recognition and automated waypoint placement
  2. SharePlay support for collaborative path creation
  3. Accessibility improvements with VoiceOver integration
  4. Cloud sync with CloudKit for cross-device path sharing
  5. Apple Watch companion app for haptic navigation feedback

Contributing

This project demonstrates modern iOS development practices combining ARKit, SwiftUI, and Core Data for indoor navigation solutions. The codebase provides a solid foundation for AR-based navigation applications and can be extended for various indoor positioning use cases.

License

[Add your license information here]


Last updated: March 2023 Compatible with: iOS 14.0+, Xcode 14.0+

About

AR indoor navigation based on ARKit/Coremotion

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages