Supongo que recordareis el artículo que publicamos en su momento sobre los robots LEGO NXT lograban resolver el cubo de Rubik, bien de forma completamente autónoma o bien con ayuda de un PC y una webcam. Hans Anderson fue uno de los genios que logró hacerlo mediante un MINDSTORMS sin ayuda externa. Cuando construyó su primera versión el robot NXT existente era el 8527 y uno de los méritos adicionales fue el plantearse el reto de conseguirlo con las piezas de una sola de estas cajas. En la actualidad el 8527 está descatalogado, y ha sido sustituido por el 8547… Hans ha creado un nuevo robot con el nuevo surtido.
Una de las limitaciones que tenía el 8527 era que para reconocer los colores del cubo sólo podíamos hacer uso del sensor de luminosidad 9844. Para ello podemos hacer que este sensor emita una luz y nos devuelva un entero que representa la intensidad de luz reflejada. Este valor depende de las condiciones de iluminación (que necesitamos que sean constantes) pero sobre todo del color de la superficie en la que se refleja. Desafortunadamente algunas de las colores del cubo de Rubik original devuelven valores muy similares, por lo que no podían ser discriminados con este sensor. Para resolver esta incertidumbre Hans optó en su momento por usar pegatinas cuyos colores sí fueran discriminados por el sensor.
Pero la llegada del nuevo LEVO MINDSTORMS 8547 ha permitido otras posibilidades. En el 8547 el sensor de luminosidad 9844 ha sido reemplazado por un nuevo sensor de color, por lo que el algoritmo para resolución ha sido modificado.
Tilted Twister
El procedimiento para llegar a la resolución del cubo consta de varias etapas:
- Reconocimiento inicial del cubo. En esta primera fase descubrimos en qué posiciones están los cuadrados. Esta primera etapa es la que más se ha visto influenciada por el cambio al nuevo sensor. A pesar de la precisión del nuevo sensor de color, hay algunos colores que resultan difíciles de distinguir entre sí, como el rojo y el naranja. Para adivinar el color del cuadrado podemos disponer de información adicional, dependiendo de la posición del cuadrado cuyo color queremos adivinar:
– en el caso de los cuadrados situados en las esquinas se puede emplear la información de las otras dos esquinas para adivinar la de la tercera.
– Los cuadrados situados en el centro de la cara también tienen una posición prefijada entre sí. En este caso el cuadrado de mayor dificultad puede ser el que tiene el logo, cuya lectura es indefinida.
– El color más difícil de discriminar es el de los cuadrados situados en los flancos. Para determinar los casos más problemáticos, como decidir entre si estamos ante un flanco rojo-azul o naranja-azul, Hans ha convertido los valores RGB a los valores equivalentes de de tinte y saturación, mucho más diferenciados: el naranja tiene un valor bastante superior de tinte/saturación que el rojo. - Cálculo de la secuencia de movimientos. Una vez tenemos el mapa de la situación inicial de cada uno de los colores del cubo, calculamos la secuencia de movimientos a seguir para completar las caras. La solución propuesta por Hans permite la implementación de forma completamente independiente, lo cual implica -dadas las limitaciones del NXT- optimizar el código y el uso de memoria. El tiempo empleado en la resolución del cubo es de 20 a 40 segundos: si queremos reducir el tiempo empleado en este cálculo debemos hacer uso de un PC, al que le enviamos el mapa inicial mediante bluetooth. En este caso el cálculo de la solución se reduce a 1 sg.
- Desarrollo físico de la solución. La última parte consiste en realizar físicamente la secuencia de movvimientos calculada en la etapa anterior.
El resultado es igual de espectacular que en la primera versión. Enhorabuena de nuevo!!
Conversión de colores entre RGB y HSB
La tríada RGB (Red, Green, Blue) es una forma muy común de representar la información de color, y estos valores suelen representarse con enteros cuyos 3 valores entre 0 y 255 representan a cada una de las intensidades de rojo, verde y azul respectivamente.
Hay otras alternativas a la representación de colores, entre las cuales se halla el modelo HSV (Hue, Saturation, Value), también denominado HSB (Hue, Saturation, Brightness). El valor del tinte (Hue) tiene un rango de 0 a 360, mientras que la saturación y el brillo varían de 0 al 100%. Se trata de un sistema de coordenadas cilíndrico que fue desarrollado en 1978 por A.R. Smith.
Para convertir entre las dos representaciones anteriores debemos emplear una función de conversión. En nuestro caso, el algoritmo en C para transformar de RGB a HSV es el siguiente:
// Los valores R,G,B están en un rango entre 0 y 1 // h = [0,360], s = [0,1], v = [0,1] // Si s = 0, entonces h = -1 (indefinido) void rgb2hsv(float r,float g,float b,float *h,float *s,float *v) { float min, max, delta; min = MIN(r, g, b); max = MAX(r, g, b); *v = max; delta = max - min; if (max != 0) { *s = delta / max; } else { // r = g = b = 0 // s = 0, v es indefinido *s = 0; *h = -1; return; } if (r == max) { *h = (g - b) / delta; // entre yellow y magenta } else if (g == max) { *h = 2 + (b - r) / delta; // entre cyan y yellow } else { *h = 4 + (r - g) / delta; // entre magenta y cyan } *h *= 60; // grados if (*h < 0) { *h += 360; } }
Información adicional:
- Resolvedor cubo de Rubik.
- Tilted Twister.
- Algoritmo de 2 fases para la resolución del cubo de Rubik.
- Algoritmos de conversión de colores.
- NXC