Comunicaciones con Stellarium

 

En este post realizaremos un programa en Python que simule la conexión con un telescopio para Stellarium, de forma que podamos tanto recibir coordenadas desde él, como enviárselas para que muestre el visor en dichas coordenadas, indicando así hacia dónde apunta, supuestamente, el telescopio simulado.

Las coordenadas que se reciben (o se esperan) desde Stellarium son coordenadas ecuatoriales. En otro post entraré en las cuestiones de conversión de coordenadas, pero por el momento nos limitaremos a mostrar los valores recibidos desde Stellarium, y a enviarle otros valores (o los mismos..) para que muestre el visor en pantalla.

 

En la página oficial de Stellarium podemos encontrar información acerca de cómo controlar telescopios. Para este proyecto optaremos por la alternativa cliente-servidor sobre TCP/IP, de forma que implementaremos un servidor en Python para el “Stellarium Telescope Protocol”.

En principio, sólo necesitamos gestionar una sola conexión de forma asíncrona, por lo que usaremos una implementación simple de un socket ayudándonos del módulo asyncore de Python.

Este protocolo se basa en dos tipos de mensajes, uno en el sentido servidor→cliente, y otro para el sentido contrario, cliente→servidor, con la siguiente estructura:

 

Esquema básico de un mensaje servidor→cliente

LENGTH (2 bytes, entero): tamaño de mensaje
TYPE (2 bytes, entero): 0
TIME (8 bytes, entero): tiempo actual en el servidor en 
microsegundos desde 01/01/1970 UT.
RA
(4 bytes, entero sin signo): Ascensión recta (J2000)
un valor de 0x100000000 = 0x0 significa 24h=0h,
un valor de 0x080000000 significa 12h
DEC (4 bytes, entero con signo): Declinación (J2000)
un valor de -0x40000000 significa -90 grados,
un valor de 0x0 significa 0 grados,
un valor de 0x40000000 significa 90 grados
STATUS (4 bytes, entero con signo): estado.
0 significa ok, < 0 significa algún error


Esquema básico de un mensaje cliente→servidor

LENGTH (2 bytes, entero): tamaño de mensaje
TYPE (2 bytes, entero): 0
TIME (8 bytes, entero): tiempo actual en el servidor en 
microsegundos desde 01/01/1970 UT.
RA
(4 bytes, entero sin signo): Ascensión recta (J2000)
un valor de 0x100000000 = 0x0 significa 24h=0h,
un valor de 0x080000000 significa 12h
DEC (4 bytes, entero con signo): Declinación (J2000)
un valor de -0x40000000 significa -90 grados,
un valor de 0x0 significa 0 grados,
un valor de 0x40000000 significa 90 grados

 

Todos los valores se transmiten en formato little-endian, y para su tratamiento usaremos el tipo ConstBitStream de la biblioteca python-bitstring. Esta biblioteca se encuentra disponible en code.google.com bajo licencia del MIT y su Open Source Initiative, y permite un tratamiento flexible e intuitivo de los datos a nivel de bits en Python.

El siguiente fragmento de código muestra por la terminal las coordenadas recibidas desde Stellarium, y se las vuelve a enviar para mostrar el visor en pantalla:

 

 

Heredamos de la clase QtCore.QThread porque más adelante este código (con algunas modificaciones…) se usará como módulo en una interfaz desarrollada en Qt. Se puede observar también que se usan algunas funciones auxiliares para los cambios en el formato de los datos, como coords.rad_2_stellarium_protocol o coords.hourStr_2_rad. Estas funciones se definen en un archivo a parte, en este caso “coords.py”, y se importan como módulo con “import coords”:

 

 

Ponemos los dos archivos en el mismo directorio (telescope_server.py y coords.py), le damos permiso de ejecución (chmod +x telescope_server.py) y ejecutamos en consola:

 

./telescope_server.py 
telescope_server.py: run - INFO: Telescope_Server disponible.

 

Ya sólo quedaría conectarnos desde Stellarium, para lo que debemos configurar primero la conexión a un telescopio. Se puede acceder al menú correspondiente mediante las opciones:

 

Configuración > Complementos > Telescope Control > Configure Telescope

 

Configuración Stellarium.

 

A continuación se deben indicar el modo de conexión, nombre, IP y Puerto, especificando los valores:

  • Modo de conexión: External Software or a remote computer
  • Nombre: Telescopio Virtual
  • IP: localhost
  • Puerto: 10001

 

Una vez conectado, y asumiendo que sólo tengamos un dispositivo configurado, para enviar las coordenadas desde Stellarium pulsaremos las teclas “Ctrl + 1” (el número 1 alude al primer dispositivo configurado), de modo que se mostrarán por consola las coordenadas recibidas (entre otros datos de depuración que pueden resultar de interés):

 

./telescope_server.py
telescope_server.py: run - INFO: Telescope_Server disponible. 
telescope_server.py: handle_accept - DEBUG: Conectado: ('127.0.0.1', 37023) 
telescope_server.py: handle_read - DEBUG: Size: 20, Type: 0, Time: 1342975913635132, RA: 1932791525 (e50e3473), DEC: 17943536 (f0cb1101) 
coords.py: rad_2_stellarium_protocol - DEBUG: (horas, grados): (10.800277, 1.503900) -> (10h48m1.0s, 1º30'14'')

 

El código implementado devuelve de nuevo las coordenadas recibidas a Stellarium, de forma que éste mostrará el visor en el lugar correspondiente, como se ve en la siguiente captura:
Conexión de Telescopio Virtual con Stellarium

 

Y bueno, partir de este punto, ya disponemos en nuestro programa de las coordenadas ecuatoriales de cualquier objeto celeste, además de una vía de comunicación con Stellarium.

En otro post usaremos estas coordenadas en la implementación de un método para calcular las coordenadas locales (horizontales) a partir de éstas, en Arduino.

Salud! y Saludos..

)
exp2 = re.compile(‘^-?[0-9]{,3}\.[0-9]{,6}(º|ᵒ) 

Ponemos los dos archivos en el mismo directorio (telescope_server.py y coords.py), le damos permiso de ejecución (chmod +x telescope_server.py) y ejecutamos en consola:

 

 

Ya sólo quedaría conectarnos desde Stellarium, para lo que debemos configurar primero la conexión a un telescopio. Se puede acceder al menú correspondiente mediante las opciones:

 

 

Configuración Stellarium.

 

A continuación se deben indicar el modo de conexión, nombre, IP y Puerto, especificando los valores:

  • Modo de conexión: External Software or a remote computer
  • Nombre: Telescopio Virtual
  • IP: localhost
  • Puerto: 10001

 

Una vez conectado, y asumiendo que sólo tengamos un dispositivo configurado, para enviar las coordenadas desde Stellarium pulsaremos las teclas “Ctrl + 1” (el número 1 alude al primer dispositivo configurado), de modo que se mostrarán por consola las coordenadas recibidas (entre otros datos de depuración que pueden resultar de interés):

 

 

El código implementado devuelve de nuevo las coordenadas recibidas a Stellarium, de forma que éste mostrará el visor en el lugar correspondiente, como se ve en la siguiente captura:
Conexión de Telescopio Virtual con Stellarium

 

Y bueno, partir de este punto, ya disponemos en nuestro programa de las coordenadas ecuatoriales de cualquier objeto celeste, además de una vía de comunicación con Stellarium.

En otro post usaremos estas coordenadas en la implementación de un método para calcular las coordenadas locales (horizontales) a partir de éstas, en Arduino.

Salud! y Saludos..

 
Tagged . Bookmark the permalink.

One Response to Comunicaciones con Stellarium

  1. Hector Santini says:

    Saludos JuanRa y feliz año Nuevo 2017:
    Tu Proyecto me interesa y me gustaría saber si tienes una version para controlar la montura usando sólo (Sin Arduino) el Raspberry PI-3. Este tiene 4 USB y Wifi integrado.
    Mi interes es poder controlar el telescopio usando Stellarium remotamente y sólo usar las cordenadas que envia Stellarium y dirigirlas a travez del USB-serial a la montura en formato “Celestron Protocol”.

    Si me puedes ayudar te lo agradeceré.
    Gracias,
    Desde Puerto Rico.

    Hector

Leave a Reply

Your email address will not be published. Required fields are marked *