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
}