Necesito realizar un programa para un cliente en haskell que permita obtener la posición de un usuario a partir de los datos obtenidos de un GPS, y contenidos en un fichero llamado
sat.txt, que contendrá una línea por cada satélite GPS observado, con 4 números: el pseudorango (ver pdf), y las coordenadas X, Y y Z del satélite en el momento de la observación, todos ellos en kilómetros.
El método para obtener las coordenadas (X,Y,Z) del observador se explica en el pdf, básicamente hay que obtener un sistema lineal para minimizar los errores, empleando para ello el método de mínimos cuadrados de Gauss:
https://es.wikipedia.org/wiki/M%C3%ADnimos_cuadrados
Una vez que se disponga del sistema lineal, se resolverá por el método de Gauss:
https://es.wikipedia.org/wiki/Eliminaci%C3%B3n_de_Gauss-Jordan
Y como el sistema obtenido no es realmente lineal, ya que aparecen raices cuadradas para calcular la distancia, una sóla aproximación no vale, y habrá que hacer varias, partiendo en cada caso de la posición obtenida como solución del sistema anterior. Para la primera se puede partir del centro de la Tierra (0,0,0) como aproximación inicial.
Posteriormente a la obtención de las coordenadas cartesianas se deberán pasar a coordenadas en el elipsoide WGS84:
https://es.wikipedia.org/wiki/WGS84
en concreto a longitud y latitud (en grados) y elevación del observador sobre el nivel del mar (en metros).
Finalmente se pasarán a coordenadas UTM, calculando también el huso correspondiente:
https://es.wikipedia.org/wiki/Sistema_de_coordenadas_universal_transversal_de_Mercator
Y para acabar habrá que calcular el azimut y la elevación de cada satélite (en grados) y el error cometido (en metros), y la suma de los cuadrados de los errores (en metros^2).
Todos los resultados se deberán escribir por pantalla, esto sería lo que debería escribir el programa por ejemplo:
Aproximacion 0:
delta(0)=-2.55536e+06, x(0)=-2555361.910854
delta(1)=-3.94787e+06, x(1)=-3947865.593076
delta(2)=3.52685e+06, x(2)=3526846.410093
Aproximacion 1:
delta(0)=-147034, x(0)=-2702396.016047
delta(1)=-375505, x(1)=-4323370.774486
delta(2)=285312, x(2)=3812158.150449
Aproximacion 2:
delta(0)=-2120.1, x(0)=-2704516.111723
delta(1)=-2752.74, x(1)=-4326123.509724
delta(2)=2596.4, x(2)=3814754.551643
Aproximacion 3:
delta(0)=-0.0824893, x(0)=-2704516.194212
delta(1)=-0.267049, x(1)=-4326123.776773
delta(2)=0.204202, x(2)=3814754.755845
Aproximacion 4:
delta(0)=9.4199e-10, x(0)=-2704516.194212
delta(1)=-3.48698e-09, x(1)=-4326123.776773
delta(2)=-6.38456e-09, x(2)=3814754.755845
Aproximacion 5:
delta(0)=3.87411e-10, x(0)=-2704516.194212
delta(1)=1.74853e-10, x(1)=-4326123.776773
delta(2)=3.14945e-10, x(2)=3814754.755845
Aproximacion 6:
delta(0)=8.06127e-10, x(0)=-2704516.194212
delta(1)=1.01191e-09, x(1)=-4326123.776773
delta(2)=-1.46681e-09, x(2)=3814754.755845
Aproximacion 7:
delta(0)=-2.13883e-09, x(0)=-2704516.194212
delta(1)=-4.24745e-10, x(1)=-4326123.776773
delta(2)=1.63146e-09, x(2)=3814754.755845
lon=-122.0119431045, lat= 36.9704748491, h=-35.032541
E= 587948.615, N= 4092053.146, zona=10
Az(0)=128.586480, El(0)=55.990961, err(0)=-6.42052
Az(1)=46.195071, El(1)=14.694295, err(1)=1.0115
Az(2)=151.459800, El(2)=30.065000, err(2)=3.95192
Az(3)=12.620065, El(3)=45.842454, err(3)=0.252044
Az(4)=16.984671, El(4)=35.160621, err(4)=1.81378
Az(5)=-146.348686, El(5)=48.284266, err(5)=3.83558
Az(6)=-55.799859, El(6)=40.260082, err(6)=-0.594483
Az(7)=159.509465, El(7)=22.952303, err(7)=-1.95357
Az(8)=38.807928, El(8)=59.709312, err(8)=0.604969
Az(9)=-54.640677, El(9)=11.848354, err(9)=-1.84542
Suma de los cuadrados de los errores 83.870245
para el fichero
sat.txt que se adjunta.
Adjunto un fichero de ejemplo y un pdf explicando la aplicación del método de mínimos cuadrados a obtener la posición mediante GPS.
Gps.zip
A continuaciom indico las fórmulas para el paso de cartesianas a longitud, latitud y altura, y para convertirlas después a UTM:
El cálculo de las coordenadas UTM a partir de las geográficas puede hacerse con las fórmulas que se encuentran aquí:
https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system
en el apartado Simplified formulae.
El cálculo de las coordenadas geográficas a partir de las coordenadas cartesianas puede hacerse con las fórmulas que se encuentran aquí:
https://en.wikipedia.org/wiki/Geographic_coordinate_conversion
en el apartado From ECEF to geodetic coordinates, nótese que para obtener h y la latitud hace falta resolver un sistema de ecuaciones no lineales, en el que interviene una cantidad adicional, N, y para ello se debe emplear alguno de los métodos vistos en el ejercicio del cálculo de ceros de funciones. Se adjunta una hoja de cálculo en la que se usa un procedimiento iterativo, que parte de h=0, y la latitud calculada como si la Tierra fuese una esfera, y emplea un ángulo adicional (psi) para obtener, a lo sumo en 4 iteraciones, la latitud y la altura.
Car2geo.ods
Delivery term: June 19, 2023