Palantir — mapa interactivo del cielo y planificador de observaciones para el radiotelescopio RT4
Introducción
El radiotelescopio RT4 de Piwnice, cerca de Toruń, tiene una antena de 32 metros de diámetro y es el mayor radiotelescopio de Polonia. Trabaja prácticamente sin descanso, y en la cola de observación esperan cientos de fuentes de varios proyectos científicos.
El operador sentado junto al telescopio en plena noche tiene que responder rápido a unas cuantas preguntas:
- ¿Qué hay ahora sobre el horizonte y a qué altura?
- ¿Qué conviene observar? Es decir, ¿qué fuentes ya «tocan» para una nueva observación y cuáles se hicieron ayer?
- ¿Hacia dónde apunta la antena y cuánto tardará en desplazarse al siguiente objetivo?
- ¿Cuántas fuentes caben en el tiempo que queda hasta el final de la ventana temporal del proyecto?
Cuando trabajaba en el Departamento de Radioastronomía, esas preguntas se respondían con notas, tablas y la experiencia del observador. Así que escribí Palantir: un programa que lo muestra todo en una sola pantalla.
Sobre el proyecto
Palantir es una aplicación de escritorio escrita en Python. Dibuja el mapa actual del cielo sobre el observatorio, sitúa en él las fuentes de los catálogos de los proyectos, muestra en directo la posición de la antena RT4 y ayuda a elaborar el plan de observación.
El primer commit es de febrero de 2018. Desde aproximadamente mayo de 2018 el programa se usa a diario en el observatorio: funciona las 24 horas del día como visor de la posición del radiotelescopio y es la herramienta básica para planificar las observaciones. Hace más de cuatro años que ya no trabajo en plantilla en el Centro de Astronomía, pero sigo participando allí en las observaciones una vez cada semana o dos, y durante todo este tiempo he mantenido y desarrollado Palantir (además de muchos otros programas míos, más pequeños y más grandes, que funcionan allí).
[!NOTE]
El código fuente no es público. Estoy refactorizándolo según estándares más actuales y tengo previsto publicarlo algún día, probablemente junto con un artículo en una revista científica. Este texto describe las funciones del programa, su arquitectura y las decisiones de diseño.
Funcionalidades principales
🗺️ Mapa del cielo en dos proyecciones
El corazón del programa es un mapa del cielo calculado para las coordenadas del observatorio. Hay dos proyecciones disponibles, por separado o una junto a otra:
- cartesiana (acimut y altura), cómoda para valorar la altura de las fuentes sobre el horizonte,
- polar, es decir, una vista «desde el cenit» que corresponde a cómo se mueve realmente la antena.
Sobre el mapa se puede superponer una cuadrícula de coordenadas ecuatoriales (meridianos de ascensión recta y paralelos de declinación), además del Sol y la Luna. Las fuentes cercanas al horizonte se dibujan cada vez más transparentes. También hay un modo oscuro, útil de noche en la sala de control.
📡 Posición del radiotelescopio en directo
El sistema de control del RT4 difunde su estado en la red local mediante datagramas UDP. Palantir los recibe en un hilo aparte y dibuja en el mapa:
- la posición actual de la antena (un marcador rojo con una línea),
- la posición comandada, es decir, el lugar hacia el que la antena se está moviendo,
- un arco que muestra el acimut actual de la antena junto con su signo.
Así, de un solo vistazo se ve a qué mira el telescopio, hacia dónde va y qué tiene por el camino. Precisamente en este papel el programa funciona en el observatorio sin interrupción.
🎯 Modo de seguimiento (--track)
Al iniciar el programa con la opción --track se obtiene una «pantalla de guardia» lista para usar: modo oscuro, mapa polar con cuadrícula ecuatorial, actualización automática de la hora y posición de la antena visible. Es la configuración para un monitor que simplemente cuelga en la sala de control.
📚 Catálogos de fuentes y filtros
Las fuentes proceden de sencillos archivos de texto, uno por proyecto, para que los colegas científicos puedan aportar fácilmente las posiciones de sus fuentes. Cada catálogo tiene una cabecera (proyecto, software de observación, banda) y cada fuente tiene: coordenadas, velocidad radial, número de ciclos de observación y el intervalo mínimo y máximo entre observaciones, en días.
En el panel lateral el operador elige:
- la banda del receptor (L, C, M, X, K o continuo),
- un proyecto concreto o todos los proyectos de la banda,
- los calibradores de posición,
- el modo «solo pendientes».
Al hacer clic en una fuente del mapa, esta queda seleccionada y se imprimen sus parámetros: nombre del script, número de ciclos, fecha de la última observación y número de días transcurridos desde entonces.
🌈 Qué está «pendiente»: colores según la antigüedad de la observación
Palantir conoce el historial de observaciones de cada fuente y lo compara con los intervalos guardados en el catálogo:
- las fuentes observadas hace demasiado poco desaparecen del mapa,
- las fuentes de una sola observación desaparecen tras la primera,
- las demás reciben un color en una escala del azul al rojo, según lo cerca que estén del final de su ventana,
- las fuentes nunca observadas o con el plazo vencido se destacan con un marcador más visible.
El operador no tiene que recordar nada ni consultar tablas. El propio mapa muestra qué es urgente.
🗄️ Registro automático de observaciones
El historial no se introduce a mano. Un pequeño servidor TCP independiente funciona en el observatorio como servicio del sistema. El programa que archiva las observaciones en otro ordenador (tartar, otro de mis programas) le envía un único mensaje tras cada observación terminada (hora, software, receptor, proyecto, fuente), y el servidor lo guarda en una base de datos SQLite. Palantir lee de la misma base, así que el mapa se actualiza solo. La base recoge observaciones desde 2020.
⏱️ Navegación en el tiempo
El mapa se puede consultar para cualquier instante: escribir una fecha y una hora, desplazar el tiempo con botones (±10 minutos, ±1 hora), volver a «ahora» o activar la actualización automática. Esto permite comprobar cómo estará el cielo dentro de tres horas sin hacer ningún cálculo mental.
📈 Gráfico de visibilidad de la fuente
Para la fuente seleccionada el programa dibuja la altura sobre el horizonte en función del tiempo durante un día completo. Al pasar el cursor sobre una curva aparece el nombre de la fuente, por lo que en un mismo gráfico se pueden comparar varios objetos.
🗓️ Planificación de observaciones paso a paso
El planificador permite elaborar el horario directamente sobre el mapa. El operador hace clic en una fuente y la añade como siguiente paso, y el programa:
- estima el tiempo de observación a partir del número de ciclos y del modo en que se observa esa fuente,
- estima el tiempo de desplazamiento de la antena desde la posición anterior,
- adelanta el reloj del mapa hasta el final de ese paso, de modo que la siguiente fuente se elige ya sobre el cielo tal como estará cuando termine la observación anterior.
El plan aparece en una ventana aparte como una tabla con la hora de inicio, el tiempo de observación y de desplazamiento de cada paso, y el total. El plan terminado se puede imprimir en el terminal junto con un fragmento de script de shell que une los scripts de observación de las fuentes elegidas en un único archivo listo para ejecutar.
🌍 Interfaz multilingüe y disposición de ventana recordada
La interfaz está disponible en polaco, inglés y español. La ventana está formada por paneles acoplables que se pueden recolocar y redimensionar libremente. La disposición se recuerda entre ejecuciones.
Arquitectura y stack tecnológico
| Capa | Tecnologías | Responsabilidad |
|---|---|---|
| Interfaz | wxPython (AUI, FoldPanelBar), matplotlib integrado en wx | Paneles acoplables, mapa del cielo, gráficos, ventana del plan |
| Lógica | Python 3.12, dataclasses, funciones puras | Proyecciones del mapa, modelo del plan de observación, estimadores de tiempo |
| Astronomía | astropy, PyEphem, NumPy | Transformaciones de coordenadas, tiempo, posiciones del Sol y la Luna |
| Datos | SQLite, pandas, archivos de texto de los catálogos | Registro de observaciones, catálogos de fuentes |
| Red | sockets UDP y TCP, hilos | Recepción del estado del RT4, servidor del registro de observaciones |
| Configuración | python-dotenv, argparse | Coordenadas del observatorio, direcciones, idioma, modo de trabajo |
| Calidad | pytest, ruff, black, uv | 156 tests unitarios, linting, entorno reproducible |
| Despliegue | Docker, systemd | Contenedor con la GUI en el escritorio del host, servidor del registro como servicio |
Algunas decisiones que considero dignas de mención:
- Lógica separada de la GUI. Las proyecciones del mapa y todo el modelo de planificación de observaciones son módulos sin ninguna importación de wx ni de matplotlib. Gracias a ello se pueden probar sin pantalla, y los tests tardan unos segundos.
- Hilos sin congelar la interfaz. La recepción UDP y la actualización automática de la hora funcionan en hilos de trabajo, y todos los cambios en la GUI vuelven al hilo principal a través de decoradores propios.
- Configuración fuera del código. Las coordenadas del observatorio, las direcciones de red, las rutas y el idioma están en un archivo
.env, así que el mismo código funciona en el puesto del operador y en el portátil del programador. El programa se puede adaptar fácilmente a otro observatorio. - Refactorización de un sistema en funcionamiento. El programa nació cuando yo era un científico que escribía código. Tras casi cinco años de trabajo en el sector comercial lo estoy reescribiendo según los estándares que hoy me exijo: tipado, tests, linting, una división clara en módulos. Lo hago por etapas, porque el programa tiene que seguir funcionando en el observatorio todo el tiempo y yo tengo además muchísimas otras tareas: este proyecto no es comercial.
Palantir en cifras
- 2018: primer commit; en producción tras unos 3 meses de trabajo intenso
- 24/7: modo de trabajo como visor de la posición del radiotelescopio
- 6 bandas de recepción, más de una decena de catálogos de proyectos
- unas 5000 líneas de código, 156 tests, 150 commits
- 3 idiomas de interfaz
Planes de desarrollo
- [x] Paso a herramientas modernas (uv, ruff, pytest)
- [x] Separación de la lógica de la capa GUI y cobertura con tests
- [x] Interfaz multilingüe
- [x] Despliegue en contenedor
- [ ] Terminar la refactorización de la capa del mapa del cielo
- [ ] Publicación del código
- [ ] Artículo que describa el programa en una revista científica