NGC7331 y el Quinteto de Stephan

Siguiendo con las pruebas de la Atik 383L+, esta vez con unas cuantas galaxias.

La de mayor tamaño es NGC7331, y a su alrededor se pueden ver un grupo de galaxias satélites de ésta. En la esquina inferior derecha se encuentra el Quinteto de Stephan.


NGC7331 y el Quinteto de Stephan

La idea era realizar fotografías hasta acumular un total de 3 horas aproximadamente, ya que aunque NGC7331 tiene una magnitud aproximada de \(9.48\), relativamente brillante para una galaxia, las galaxias del Quinteto son mucho más débiles (magnitudes entre \(13\) y \(16\)) y pequeñas, por lo que necesitan mucha más luz para obtener detalles. Sin embargo, una serie de problemas que fueron surgiendo hicieron que sólo pudiera tomar 1 hora en total.

Espero poder dedicarle otra noche para acumular más tomas y conseguir sacar más detalle.

Equipo

  • Telescopio: Celestron C8 + reductora de focal x0.63.
  • Montura SkyWatcher EQ6.
  • Guiado: QHY5-IIM en tubo Lunático (60mm diámetro, 230mm focal)
  • Cámara: Atik 383L+, refrigerada a \(-20 ^\circ C\).
  • Filtro de contaminación lumínica IDAS.
  • RaspberryPi con INDI para control de todo el equipo.

Datos de la imagen

  • 6 tomas de 10 minutos de exposición (total acumulado: 1h)
  • Bias: \(30 \times 0.001 \; \text{s}\)
  • Dark: \(6 \times 10 \; \text{min}\)
  • Flat: \(30 \times 1 \; \text{s}\), colocando un difusor en el tubo y disparando un flash.
  • Fecha: 2019/08/03

Software

  • Control del telescopio, guiado y captura de imágenes: KStars.
  • Preprocesado, alineado, apilado y procesado básico de imágenes: Siril.
  • Post procesado en GIMP.

M27 - Nebulosa de Dumbbell

El pasado fín de semana, aprovechando que daban buena noche, me escapé a León para probar la nueva cámara CCD, una Atik 383L+, de 8.3 Mpx y que con el C8 y la reductora de focal x0.63 me da un campo aproximado de \(48' \times 36'\) (minutos de arco), bastante grande para una CCD comparado con los \(62' \times 42'\) que obtenía con la Canon 50D.

Decidí probar con M27, la nebulosa planetaria Dumbbell, una "pelota" grande y luminosa que suele salir bien en las fotos.

La cámara es monocromo, para poder usar en el futuro filtros de banda estrecha para capturar emisiones de \(\text{H}_{\alpha}\) (hidrógeno) o el \(\text{OIII}\) (oxígeno)


M27, nebulosa de Dumbbell.

Equipo

  • Telescopio: Celestron C8 + reductora de focal x0.63.
  • Montura SkyWatcher EQ6.
  • Guiado: QHY5-IIM en tubo Lunático (60mm diámetro, 230mm focal)
  • Cámara: Atik 383L+, refrigerada a \(-20 ^\circ C\).
  • Filtro de contaminación lumínica IDAS.
  • RaspberryPi con INDI para control de todo el equipo.

Datos de la imagen

  • 12 tomas de 10 minutos de exposición (total acumulado: 2h)
  • Bias: \(30 \times 0.001 \; \text{s}\)
  • Dark: \(10 \times 10 \; \text{min}\)
  • Flat: \(30 \times 1 \; \text{s}\), colocando un difusor en el tubo y disparando un flash.

Software

  • Control del telescopio, guiado y captura de imágenes: KStars.
  • Preprocesado, alineado, apilado y procesado básico de imágenes: Siril.
  • Post procesado en GIMP.

Simulación de circuto para lectura de tensión

Para un proyecto de robótica que estoy comenzando, basado en versiones de los rover marcianos de NASA, necesitaba diseñar un circuito para hacer la lectura de la corriente que circula por un motor controlado mediante un driver Allegro A4953. Este driver tiene un pin LSS en el que se puede conectar una resistencia \(R_S\) para medir la corriente del motor, que se obtiene simplemente dividiendo la tensión \(V_S\) en la resistencia por el valor de la misma:

\begin{equation*} I_{motor} = \frac{V_S}{R_S} \end{equation*}

Las conexiones del chip se muestran en la hoja de datos:

Conexiones del A4953

El esquema del circuito se hizo en KiCad y se simuló con ngspice. La tensión en la resistencia \(R_S\), \(V_S\), se simula usando una fuente de tensión (\(V_1\) en el esquema) cuyo valor se hace variar entre los valores máximo y mínimo.

Esquema

Cálculos

Resistencia \(R_S\)

En la hoja de datos del driver se especifica que el valor de la tensión en la \(R_S\) debe ser menor, en valor absoluto, que \(0.5V\). Para calcular esta resistencia, se da una expresión en función de \(I_{max}\), la corriente máxima que puede circular por el motor, \(A\), una ganancia interna que se define con el valor \(10\), y \(V_{ref}\), la tensión que se aplique en el pin VREF:

\begin{equation*} I_{max} = \frac{V_{ref}}{A R_S} \end{equation*}

Para una corriente máxima de \(1.1A\) y \(V_{ref} = 5V\):

\begin{equation*} R_S = \frac{V_{ref}}{A I_{max}} = \frac{5V}{10 \times 1.1A} = 0.45 \Omega \end{equation*}

Eligiendo \(R_S = 0.4 \Omega\), la tensión máxima que se tendrá en LSS es, en valor absoluto, \(V_S = 0.4 \Omega \times 1.1A = 0.44V < 0.5V\), por lo que la tensión en LSS estará comprendida entre \(-0.44V\) y \(+0.44V\).

Adaptación de tensiones

Este rango de tensiones será leído mediante el conversor analógico/digital (ADC) de un Arduino Nano, que registra tensiones entre \(0\) y \(5V\) con una resolución de 10 bit (1024 cuentas), por lo que es necesario adaptar estas tensiones a valores adecuados para tener una resolución decente en la lectura. Idealmente, se intentaría usar todo el rango \((0V, 5V)\) del ADC, pero conviene dejar márgenes de seguridad para asegurar que no se alcanzan los máximos y para evitar que el amplificador operacional que hará la adaptación trabaje en los extremos (\(0V\) y \(VCC\)), lo que puede producir valores erróneos.

La adaptación de tensiones se realiza usando un amplificador operacional LM358 configurado como amplificador no inversor. En esta configuración, la ganancia es positiva, por lo que el primer obstáculo está en transformar el rango de tensiones en LSS para que todas sean positivas. Para ello se coloca en serie con la tensión \(V_S\) un diodo alimentado desde el pin de \(3.3V\) del Arduino que sumará su tensión de codo, unos \(0.66V\) de promedio, al valor de \(V_S\), por lo que se pasa a tener un rango de tensiones \((Vd-Vs, Vd+Vs) = (0.23V, 1.09V)\), todas positivas. Estas tensiones, \(V_M\) en el esquema y en la gráfica, se pasan como entrada a la etapa amplificadora para adaptarlas al rango \((0V, 5V)\) del ADC.

Amplificador operacional

La ganancia del amplificador no inversor viene dada, en este circuito, por

\begin{equation*} A_v = 1 + \frac{R_4}{R_2+R_3} \end{equation*}

y la tensión en la salida será

\begin{equation*} V_{OUT} = A_v V_M \end{equation*}

Según las especificaciones del LM358, en la salida de este operacional se pueden obtener tensiones entre \(0V\) y \(VCC-1.5V\), por lo que si fijamos un valor máximo aproximado de tensión en el ADC de \(4.5V\) se tiene que VCC debe ser igual a \(6V\), que es una de las tensiones que se va a usar en la placa definitiva. Ese valor máximo también da un margen de seguridad en la tensión medida en el ADC.

Para obtener \(4.5V\) en la salida cuando se tienen \(1.09V\) enla entrada necesitamos una ganancia de tensión igual a

\begin{equation*} \frac{4.5V}{1.09V} = 4.13 = 1 + \frac{R_4}{R_2+R_3} \end{equation*}

por lo que la relación \(\frac{R_4}{R_2+R_3}\) tiene que ser menor o igual a \(3.13\) para no sobrepasar los \(4.5V\). Seleccionando \(R_2+R_3 = 110 \: k \Omega\) y \(R_4 = 330 \:k \Omega\) se obtiene una relación de \(3\) y una ganancia \(A_v = 4\).

Con esta ganancia el rango de tensiones en la salida del amplificador será

\begin{equation*} V_{OUT} = (A_v \times 0.23, \: Av \times 1.09) = (0.90V, \: 4.35V) \end{equation*}

que se corresponden con valores medidos en el ADC de \((184, 890)\), utilizando un \(69 \%\) del rango del ADC.

Simulación

La gráfica siguiente muestra el resultado de la simulación para los parámetros \(V_S\), \(V_M\) y \(V_{OUT}\) cuando \(V_S\) se hace variar entre \(-0.44V\) y \(+0.44V\).

Plot

La simulación devuelve los siguientes valores de las tensiones \(V_M\), tras sumar la tensión de codo del diodo, y \(V_{OUT}\), a la salida del amplificador, para los casos en que \(V_S\) toma los valores mínimo, \(0\) y máximo:

\(V_S\) \(V_M\) \(V_{OUT}\)
\(-0.44\) \(0.23\) \(0.90\)
\(0.00\) \(0.66\) \(2.63\)
\(+0.44\) \(1.09\) \(4.35\)

Se puede ver cómo \(V_M\) toma valores siempre positivos, por lo que no hay problemas en el amplificador. También se ve que la tensión a la salida está en el rango del conversor ACD.

Resolución en corriente

Se puede calcular la resolución de la medida de corriente por el motor, es decir cuánto cambia la corriente por cada cuenta del ADC.

La tensión de salida del amplificador es:

\begin{equation*} V_{OUT} = A_v(R_S i_S + V_d) \end{equation*}

siendo \(i_S\) la corriente que circula por \(R_S\) (se desprecia la corrientes que circula por el diodo, del orden de \(1 mA\)) y \(V_d\) la tensión de codo en el diodo.

Expresado como cuentas del ADC:

\begin{equation*} N = \frac{1024}{5} V_{OUT} \end{equation*}

Si tomamos dos medidas consecutivas del ADC, \(N1\) y \(N2 = N1 + 1\):

\begin{equation*} N2 - N1 = \frac{1024}{5} Av (R_S i_2 + V_d) - \frac{1024}{5} Av (R_S i_1 + V_d) \end{equation*}

Operando:

\begin{equation*} 1 = \frac{1024}{5} Av R_S (i_2 - i_1) \end{equation*}

y se tiene:

\begin{equation*} i2 - i1 = \Delta i = \frac{5}{1024 \: A_v R_S} = 3.05 \dfrac{mA}{cuenta} \end{equation*}

Es decir, se tiene una resolución en la medida de corriente que circula por el motor de unos \(3 \: mA\).

Turtlebot3 y ROS Melodic en Ubuntu 18.04

Al empezar a hacer pruebas con el Turtlebot3 empezaron a aparecer algunos problemas de compatibilidad relacionados con las diferentes versiones de ROS y Ubuntu, que se resumen en:

  1. El código del Turtlebot3 está escrito para la versión Kinetic de ROS.
  2. Kinetic es compatible con las versiones Wily (15.10) y Xenial (16.04) de Ubuntu.
  3. En mi ordenador tengo instalado Ubuntu Bionic (18.04), versión para la que Kinetic no es compatible.
  4. ROS Melodic, la versión que tiene soporte para Ubuntu 18.04, no tiene soporte completo para Turtlebot3 (algunos de los módulos y funciones necesarios para el Turtlebot3 aún no se han portado a Melodic)

TL;DR: La versión de ROS que puedo instalar “fácilmente” en mi sistema operativo no da soporte completo al Turtlebot3, y a la vez la versión de ROS que da soporte a Turtlebot3 no es compatible con mi sistema operativo. Incompatibilidad en ambos sentidos.

Esto me dejaba varias posibles soluciones:

  1. Crear una máquina virtual corriendo Ubuntu 16.04 e instalar ROS Kinetic.
  2. Usar Docker para crear un contenedor con Ubuntu 16.04 e instalar ROS Kinetic.
  3. Usar una de las imágenes de Docker con ROS preinstalado con la versión Kinetic.
  4. Usar Ubuntu 18.04 y ROS Melodic e ir solucionando los problemas a medida que surjan.

La máquina virtual la descarté de mano, por ser más práctico usar los contenedores de Docker. Sin embargo, como en los grupos de usuarios de ROS se habla de que todo el código del Turtlebot3 se está portando poco a poco a Melodic, opté por probar con la última opción e ir resolviendo los problemas a medida que se iban amontonando produciendo.

Si eso más terde me pongo...

Instalación de módulos no portados a Melodic

Instalar los módulos que no estan aún portados resulta más fácil de lo podría pensarse. Aunque no estén disponibles para ROS Melodic, los repositorios de cada uno de ellos están disponibles en GitHub; muchos ya tienen una rama lista para ser integrada en futuras actualizaciones de Melodic, y el resto pueden descargarse y compilarse con las características del sistema que se emplee. Los módulos necesarios para hacer funcionar el Turtlebot3 y que no están disponibles en Melodic pero pueden instalarse desde GitHub son:

  • openslam_gmapping
  • slam_gmapping: módulo de creación de mapas mediante SLAM (Simultaneous Localization and Mapping)
  • hector_slam, slam_karto: otros métodos de cartografiado utilizados por el Turtlebot.
  • frontier_exploration: módulo de exploración de mapas.
  • teleop_twist_joy: utilización de joystick para controlar el robot.

Estos paquetes se pueden descargar o clonar en el directorio src del proyecto y compilar con catkin_make o catkin build. El resto de paquetes disponibles para Melodic se instalan mediante el gestor de software de Ubuntu, o mediante apt-get o similar.

Mapas globales y locales

Un error que aparece por cambios en Melodic respecto a Kinetic se produce por diferencia del criterio usado a la hora de definir la ruta a los mapas en el paquete de navegación del Turtlebot3.

[Reproducción del error] [Explicación del problema]

Para solucionarlo hay que editar dos archivos dentro del directorio src/turtlebot3_navigation/params, en los que se definen algunos parámetros necesarios para la navegación.

Uno de los archivos que hay que modificar en dicho directorio es global_cost_map_params.yaml, eliminando las barras en/map y /base_footprint:

global_costmap:
  global_frame: /map
  robot_base_frame: /base_footprint

para que queden del siguiente modo (nótese la ausencia de barras delante de los parámetros):

global_costmap:
  global_frame: map
  robot_base_frame: base_footprint

El segundo archivo a modificar es local_costmap_params.yaml, eliminando las barras para que queden del siguiente modo:

local_costmap:
  global_frame: odom
  robot_base_frame: base_footprint

Con esto los parámetros map, base_footprint (tanto para los parámetros globales como locales) y odom se definen como relativos al propio paquete, y no como absolutos como ocurre con el caso de colocar la barra (/) delante.

Bola extra: problemas de visualización en rviz

Otro problema derivado de la pantalla de alta resolución de mi portátil, un Dell XPS 13, son los problemas de visualización en rviz, el visualizador que usa ROS; además, al intentar redimensionar la ventana o al colocar otra ventana encima, no se actualiza el contenido, por lo que no es utilizable.

Problemas de visualización en rviz

Para solucionarlo, basta con exportar (para dejarlas en blanco) dos variables de entorno:

export QT_AUTO_SCREEN_SCALE_FACTOR=
export QT_SCREEN_SCALE_FACTORS=

Con estos pasos, el entorno está plenamente funcional.

Turtlebot3

Este año los Reyes Magos se han puesto espléndidos y me han traído un Turtlebot3, el modelo Burger para ser más exactos. Bueno, en realidad no han sido los Reyes, sino que me lo he auto-regalado.

turtlebot3

Aunque también sirve para pasar un buen rato jugando con él, en realidad es una plataforma de desarrollo de robótica, ya que es un robot modular y totalmente personalizable. Es un robot de dos ruedas y una bola que actúa como rueda castor o giratoria. Se organiza en 4 niveles mediante plataformas:

  • Nivel 1: aloja los motores y la batería.
  • Nivel 2: en él se encuentra la placa OpenCR, basada en Arduino, y que incluye el hardware necesario para implementar el Turtlebot3: sensores, drivers para motores, interfaces de comunicaciones, etc.
  • Nivel 3: en él se coloca la Raspberry Pi 3 en la que se ejecuta ROS, el sistema operativo del robot. También tiene espacio suficiente para añadir más sensores o componentes.
  • Nivel 4: es el nivel superior y sobre el que se coloca el LIDAR, que se emplea para medir distancias y que a grandes rasgos es similar al RADAR pero usando la luz de un láser.

Como cada nivel es idéntico a los demás, se pueden añadir más niveles si se necesitan.

El proyecto es código abierto, u open source, tanto el hardware como el software, por lo que es posible modificarlo, adaptarlo y configurarlo a medida. Todas las partes que forman los niveles, los mecanismos de sujeción, etc. se pueden imprimir en una impresora 3D usando los diseños que están disponibles en la web.

De momento estoy haciendo pruebas, ya que el Turtlebot3 se desarrolló para la versión de ROS Kinetic Kame, que a su vez es compatible con Ubuntu 16.04, mientras que yo tengo instalado Ubuntu 18.04, para la que Kinetic no es compatible; sí lo es la última versión disponible de ROS, Melodic Morenia, a la que se está portando el código de Turtlebot3.

Hasta ahora he conseguido que funcionen sin demasiados problemas los modos básicos de teleoperación del robot, mediante teclado y joystick, y las funciones básicas de SLAM y cartografiado, así como la navegación autónoma básica usando el mapa creado.

Júpiter

Esta temporada Júpiter se encuentra en oposición, lo que viene a significar que desde la Tierra lo vemos en el punto opuesto al Sol.

En la fotografía se pueden apreciar, a la izquierda, tres puntos que se corresponden con tres de las lunas de Júpiter; de izquierda a derecha, son Ganimedes, Calisto (un punto más débil que los otros) e Ío, tres de las cuatro lunas galileanas.

Jupiter y lunas

Como bonus, se puede también apreciar la cuarta luna galileana, Europa, como una pequeña zona circular algo más brillante sobre el disco de Júpiter, así como la sombra que proyecta dicha luna sobre el planeta. En el recorte ampliado de abajo se puede ver algo mejor.

Jupiter, Europa y su sombra

Datos de la toma

La cámara es una QHY5-II-M en un Celestron C8, sobre montura Skywatcher EQ6.

La imagen se obtuvo el día 13 de mayo de 2018, a las 4:08 de la madrugada, desde León, mediante apilado de un video de 30 segundos, compuesto por 386 frames, capturado usando oaCapture en Ubuntu.

El apilado y procesado se realizó íntegramente usando Siril 0.9.9 en Ubuntu.

El recorte y añadido de texto se hizo usando GIMP en Ubuntu.

BeagleBone Black, una alternativa a la Raspberry Pi

Introducción

La BeagleBone Black es una computadora open hardware similar a la más conocida Raspberry Pi. Es la versión de bajo costo de la familia BeagleBoard, fabricada por la mítica Texas Instruments. Entre sus características más interesantes están:

  • Procesador Sitara AM3358 a 1 GHz.
  • 512 MB de RAM DDR3L a 800 MHz.
  • Memoria interna eMMC de 4 GB.
  • 3 canales PWM.
  • 7 entradas de Conversor Analógico/Digital (ADC) de 10 bit.
  • 3 canales I2C.
  • 2 canales SPI.
  • 5 puertos serie UART (uno de ellos sólo con función de trasferir datos, no de recibir)
  • 3 módulos descodificadores de encoder de cuadratura (enhanced quadrature encoder pulse, eQEP), aunque para usarlos todos es necesario deshabilitar otros módulos que causan interferencia en los pines.
  • 2 Unidades en Tiempo Real Programables (PRU).
  • Conexión WiFi y Bluetooth integradas en la versión [Wireless.

A nivel hardware existen más elementos para algunos de los dispositivos anteriores, aunque sólo parte de ellos están disponibles debido a interferencia entre pines y multiplexado; por ejemplo, el procesador tiene 6 canales UART, de los que sólo están disponibles desde los pines 5 de ellos.

Este post resume los pasos que han sido necesarios para poner en funcionamiento la Beaglebone Black, tanto en su versión original (revisión C.1) como la versión Wireless. A partir de ahora, me referiré a la BeagleBone Black como BBB y a su versión Wireless como BBBW.

Todos los pasos se harán para un sistema GNU/Linux Ubuntu 16.04, preferentemente usando la línea de comandos.

Leer más…

Nikola - Añadir una página de wikis

Uno de los objetivos de crear la web era disponer de una página de wikis, en la que poder ir anotando todas aquellas cosas que, por trabajo, hobby, ocio, o cualquier otro motivo, voy aprendiendo y que resulta práctico, si no recordar, tener archivado en algún lugar a mano.

Estas notas serían, por ejemplo, flujos de aplicación de algoritmos de Machine Learning, los principales usos de las expresiones regulares, pequeños fragmentos de código, o cualquier otra cosa.

El fin es tener una portada, accesible desde la barra de navegación, que enlazará a otras páginas, cada una de las cuales contendrá información sobre un tema, aplicación, etc.

Leer más…

Nikola + GitHub Pages - Instalación

Después de mucho pensar, de mucho mirar, y de mucho probar, al fin conseguí empezar a montar el blog. Partía con algunos requisitos:

  • Alojamiento gratuito.
  • Escritura de posts en Markdown (opción futurible: ReStructuredText)
  • Posibilidad de publicar posts con expresiones matemáticas.
  • Posibilidad de publicar notebooks de iPython/Jupyter.
  • Facilidad de uso.

La opción que más me ha gustado es la combinación de Nikola como sistema de blogging y GitHub Pages para el alojamiento.

Nikola está escrito en Python y permite crear posts desde archivos Markdown, ReStructuredText o incluso notebooks de iPython. Se integra perfectamente con Mathjax para generar expresiones matemáticas.

Leer más…