Después de
experimentar con inteligencia artificial, el piloto automático de
mi tanque decidió dar un paso atrás y aprender a navegar por los viejos satélites.
La imagen está organizada, insinuando que cualquier transporte GPS puede autocalentarse bajo el control de un navegador.

Raspberry Pi + GPS
Primero, se compró un módulo GPS USB simple.
Guiado por el artículo sobre
Adafrukt , comencé la implementación.
A pesar de que el artículo fue escrito hace 6 años, nada ha cambiado mucho en el mundo de la navegación de la vieja escuela.
Solo algunos matices no coincidían:
- la pieza de hierro se descubrió como / dev / ttyACM0 en lugar de / dev / ttyUSB0
- al instalar gpsd no encontré el dispositivo yo mismo, resultó necesario registrarse en / etc / default / gpsd:
DEVICES="/dev/ACM0"
- para python-3 gps, el paquete debe entregarse a mano, no va con gpsd
El dispositivo en sí se parece a una unidad flash USB normal:

Y luego me quedé atascado por mucho tiempo, porque mi GPS no veía las coordenadas.
El dispositivo funcionó, informó la versión, el fabricante y otra información útil, pero nada más.
Al principio pensé que todavía estaba defectuoso. De experimentos anteriores, todavía tengo una tarjeta SD de Raspbian 2017, en la que funcionaba el GPS.
Arrancado desde allí y, he aquí, el GPS cobró vida y parpadeó una bombilla, y se duchó en las coordenadas del registro.
Me arranqué el cerebro durante una semana, comparé todas las configuraciones, comencé a pecar en un nuevo buggy Raspbian y me estaba preparando para reconstruir gpsd en la depuración, cuando de repente en el foro Raspberry en uno de los temas sobre problemas de GPS (y hay muchos de ellos allí) encontré consejos para sacar el dispositivo en la calle cuando hace buen tiempo y deja que encuentre satélites, lo que puede demorar hasta media hora.
Se me ocurrió esta idea, pero aparentemente el clima no era lo suficientemente claro, pero luego todo coincidió y el dispositivo cobró vida. Si profundiza un poco más, resulta que la información necesaria sobre los satélites está almacenada en caché en el firmware del dispositivo y Raspbian no puede controlarla.
¿Cómo puede mi aplicación obtener datos de almanaque / efemérides / pseudorango?
Lo sentimos, todavía no hay una manera fácil de hacer estas cosas a través de GPSD. La razón es que no hay una manera consistente de hacer que los receptores GPS reporten esta información.
Muchos no lo envían en absoluto. Otros (incluidos algunos pero no todos los dispositivos que envían paquetes binarios SiRF) lo envían ocasionalmente en información de SUBFRAME, pero debe saber exactamente cómo avanzar por los campos de SUBFRAME para obtenerlo y la documentación de aquellos en IS-GPS-200E (el -el protocolo aéreo utilizado por los satélites GPS) es extremadamente oscuro. Aún otros informes varían Crear subconjuntos de datos de almanaque / efemérides / pseudorango de manera razonablemente sencilla, pero en oraciones propias del proveedor que son extremadamente específicas para los tipos de receptores individuales, mal documentadas o indocumentadas, y que a menudo necesitan ser activadas por secuencias de control que son igualmente específicas e incluso peores. documentado
El complicado mecanismo ha funcionado y es hora de aprovecharlo.
El script para leer datos de gpsd en python es muy simple:
import gps gs = gps.gps("localhost", "2947") gs.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) for i in range(0,10): report = gs.next() print (report)
API de Google Maps
Yo controlo el tanque desde el teléfono, así que tuve que estudiar trabajando con Google Maps.
Google hizo un buen trabajo simplificando el trabajo con mapas, por lo que no hubo problemas.
Android Studio puede crear un proyecto vacío con un mapa, desde donde es necesario transferir cuidadosamente todos los detalles importantes al proyecto principal.
Google requiere un registro de
clave para trabajar con la API de Maps, se hace de forma gratuita (por ahora).
Expandí la interfaz REST del tanque para que diera sus coordenadas, transfiriera las coordenadas al mapa, dibujara un icono de tanque y todo parezca bastante decente.
Luego debes allanar el camino.
Un punto en el mapa selecciona el objetivo y lo alimenta en la
API de indicaciones .
Indicaciones es un servicio web que toma las coordenadas de dos puntos y en respuesta arroja un montón de información sobre la ruta tomada, incluidas las direcciones, los nombres notables y las explicaciones. Pero solo necesitaba una secuencia de pasos. Seleccionamos las coordenadas y las dibujamos en el mapa.
Ahora hay todo lo necesario para el control visual y la gestión.

Navegación GPS
Más allá del teléfono al tanque se transmite el primer punto de la ruta.
El tanque tiene un pequeño problema: en el momento inicial, no conoce su dirección.
La brújula resuelve fácilmente el problema, pero cualquiera puede manejar la brújula ...
Fue posible salir por el hecho de que durante los primeros segundos el tanque pasa simplemente por delante, recibiendo las coordenadas del comienzo y el final del camino y calculando su dirección a partir de ellos. Vale la pena señalar que los mismos datos se pueden obtener directamente del GPS, hay un campo de seguimiento, que muestra la desviación del ángulo al polo norte.
Pero en cualquier caso, para que esto se llene después, se necesita movimiento.
Cálculo de dirección:
def azimuth(pos1, pos2): lat1 = toRadians(pos1["lat"]) lon1 = toRadians(pos1["lon"]) lat2 = toRadians(pos2["lat"]) lon2 = toRadians(pos2["lon"]) dlat = lat2 - lat1 dlon = lon2 - lon1 x = math.sin(dlon) * math.cos(lat2) y = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dlon) return math.atan2(x, y)
Observo que el GPS no siempre funciona con precisión, y puede resultar que las coordenadas del comienzo y el final de la ruta de prueba estarán con un error que hace que las mediciones no tengan sentido (incluso en la medida en que al avanzar, la coordenada del final de la ruta está detrás).
En este caso, el GPS da la dirección a través de la pista de manera bastante confiable, por lo tanto, este campo se usó por defecto, y si no estaba allí, tenía que navegar por la diferencia en las coordenadas.
Después de orientarse sobre el terreno, el tanque gira aproximadamente donde sea necesario (aproximadamente, porque es difícil determinar con precisión la dirección sin una brújula o giroscopio) y se mueve durante varios segundos. Luego, nuevamente recibe las coordenadas, verifica la dirección, gira, monta. Y así sucesivamente hasta que el objetivo esté dentro del radio de error.
En general, el mayor problema es el error en las coordenadas GPS, por lo que el tanque pierde dirección y comienza a precipitarse en diferentes direcciones.
Todo se debe al hecho de que sin una brújula no puedes sobrevivir.
Referencias
- Artículo introductorio sobre la configuración de un módulo GPS para Raspberry Pi
- Servicio para trabajar con GPS en Linux
- Sitio útil con fórmulas para calcular la distancia y la dirección por las coordenadas de dos puntos.
- Código fuente del firmware del tanque GPS
- Documentación de Google Maps para Android