0 votos

Ayuda con la frecuencia de muestreo del GPS del iPhone XR

Todavía no he encontrado información útil sobre la tasa de muestreo/salida del GPS en los iPhones. Por favor, diríjanme a cualquier artículo útil y relevante que me haya perdido. También por favor, hágame saber cómo hacer mi post más claro.

Comportamiento real: El iPhone XR emite muestras de GPS a un ritmo lento, alrededor de una muestra cada 6 segundos, pero ocasionalmente con dos muestras en una sucesión más rápida (por ejemplo, 1,5 segundos, aunque muy raramente). Esto ocurre cuando se está sentado, cuando se camina rápidamente y se agita el teléfono alrededor, y con varias asignaciones diferentes para CLLocationManager.desiredAccuracy.

Comportamiento esperado/optimista: Salidas de muestra de GPS más rápidas de mi iPhone XR, como las de este vídeo de aquí. Soy consciente de que este vídeo es de 2017, aunque no sé qué hace que esto sea significativo. https://www.youtube.com/watch?v=XyncTJdXbbw&t=5m20s

Discusión: Necesito muestras de GPS para un proyecto, e idealmente me gustaría que se muestreara a 1,0+ Hz. He escrito programas en Swift y he descargado aplicaciones que registran y grafican los datos GPS de mi iPhone XR, pero la tasa de muestreo de mis datos GPS parece ser inconsistente y muy lenta, alrededor de una medición cada 6 segundos.

Tengo un montón de preguntas, que incluyen:

  • ¿Tiene el iPhone XR una tasa de salida de GPS bien definida?
  • ¿Qué factores le afectan?
  • ¿Dónde puedo encontrar esta información mejor documentada?
  • ¿Cómo puedo aumentar la velocidad de salida del GPS?

Soy nuevo en el trabajo con iOS, así como en saber a través de qué métodos los iPhones calculan las coordenadas GPS. He oído que el GPS del iPhone puede emitir datos a 1 Hz, aunque todavía no he encontrado esto documentado oficialmente.

Soy consciente de que puedo especificar el desiredAccuracy y el distanceFilter en mi programa Swift, pero el parámetro desiredAccuracy parece no tener mucho efecto en mi precisión de coordenadas o mi tasa de salida. Mi iPhone XR está en iOS 13.4.1, y mi teléfono de 128 GB está casi completamente lleno de fotos en caso de que eso haga alguna diferencia extraña. Estoy eliminando esas fotos sólo para limpiar ahora.

He incluido mi programa Swift a continuación. Es muy básico, y no sé cómo codificar en Swift, así que siéntase libre de informarme si estoy haciendo las cosas incorrectamente. La última vez que lo ejecuté con éxito (hace dos días), mi iPhone estaba en iOs 13.3 o así, Mac OS en 10.13 o así. El programa Swift debe ser lo más básico posible, una aplicación de una sola vista con una interfaz de usuario de guión gráfico. Si es necesario, puedo proporcionar actualizaciones en versiones más nuevas de OS/iOS/Xcode una vez que limpie mi teléfono y consiga que algunas cosas funcionen.

No encuentro mi archivo de texto de salida de la consola, así que subiré algo cuando pueda. Supongo que responder con la suposición de que mi salida se produce cada 6 +/- 0,05 segundos.

//
//  ViewController.swift
//  CoreMotionExample
//
//  Created by COVID-19 on 11/17/19
//  Copyright © 2019 COVID N. Teen. All rights reserved.
//
import UIKit
import CoreMotion
import CoreLocation

class ViewController: UIViewController {

    let motionManager = CMMotionManager()
    let locationManager = CLLocationManager()
    var timer: Timer!
    let start = Date()
    var time_prev = 0.0
    var elapsedTime = 0.0

    let verbose = false;

    override func viewDidLoad() {

        super.viewDidLoad()

        motionManager.startAccelerometerUpdates()
        motionManager.startGyroUpdates()
        motionManager.startMagnetometerUpdates()
        motionManager.startDeviceMotionUpdates()

        locationManager.requestAlwaysAuthorization()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.distanceFilter = kCLDistanceFilterNone
        locationManager.startUpdatingLocation()

        timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true)

        }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

            if let location = locations.first
            {
                if(true)
                {
                    print(location.coordinate, "\n")
                    elapsedTime = time_prev - start.timeIntervalSinceNow
                    print("Time elapsed: ", elapsedTime, "\n")
                    time_prev = start.timeIntervalSinceNow
                }
            }
    }

    @objc func update() {

//      IMU/MARG/INS data:

        if let accelerometerData = motionManager.accelerometerData
        {
            if(verbose)
            {
                print("Accelerometer data:\n",accelerometerData, "\n")
            }
        }

        if let gyroData = motionManager.gyroData
        {
            if(verbose)
            {
                print("Gyroscope data:\n", gyroData,"\n")
            }
        }

        if let magnetometerData = motionManager.magnetometerData
        {
            if(verbose)
            {
                print("Magnetometer data:\n", magnetometerData,"\n")
            }
        }

        if let deviceMotion = motionManager.deviceMotion
        {
            if(verbose)
            {
                print("deviceMotion data:\n", deviceMotion,"\n")
            }
        }

        //GPS/Location data:
        //Nothing successful here, see above

    }

}

extension ViewController: CLLocationManagerDelegate {
  // handle delegate methods of location manager here, also nothing here
}

1voto

Jose Chavez Puntos 645

No hay forma de establecer explícitamente la frecuencia de actualización de su ubicación. Tenga en cuenta que no se está "comunicando" directamente con un GPS, sino que está recibiendo actualizaciones de ubicación desde Core Location que podrían provenir de una fuente GPS, pero también de otras fuentes.

Recuerde que las actualizaciones de ubicación se filtran para conservar la energía. Esto significa que sólo se obtienen actualizaciones cuando el teléfono se ha movido realmente una cierta distancia - y el número de actualizaciones puede verse afectado por factores externos como si el teléfono está o no en el estado de ahorro de energía. Recuerde también que debe probar esto mientras en el exterior y se mueve de un lado a otro. No conseguirás un buen posicionamiento en el interior.

Debes asegurarte de establecer el filtro de distancia a una distancia apropiada para tu aplicación (actualmente lo tienes configurado como ninguno), y también establecer la actividad correcta (es decir, actualmente lo tienes configurado como otro, pero si quieres hacer, por ejemplo, navegación automotriz, entonces establécelo como eso).

En su código fuente adjunto, sólo mira la primera ubicación dada en didUpdateLocations . Normalmente no se quiere hacer eso. La ubicación más nueva es la última del array, así que yo al menos la cambiaría para que mirara la última.

Como te interesa tener más localizaciones en un periodo de tiempo, recuerda mirar todas las actualizaciones de la matriz. Puede haber más de una en cada actualización.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X