viernes, 3 de julio de 2015

Sesión 6: Formando la Cara Blanca

Si nos remitimos, años atrás, a nuestros primeros intentos de resolver el cubo de Rubik de 3x3x3, recordaremos que sólo éramos capaces de resolver una cara. Ésta se completaba ordenada de manera intuitiva, pero éramos incapaces de seguir haciendo las otras caras sin desmontar la primera.

Aquí empezaremos igual: con una primera cara que será la blanca. El problema es que, si bien la resolución manual de la primera cara era sencilla y al alcance de cualquiera, la programación informática de la resolución de esta primera cara resulta muy tediosa y, en varias ocasiones, necesitada de cierto esfuerzo mental. Es el tópico de que tareas intuitivas para el humano resultan tremendamente complicadas de programar para la máquina.

Volviendo a la resolución de la cara blanca, el procedimiento en líneas generales será el siguiente: vamos a estudiar  las ocho esquina de acuerdo a una secuencia y, si tienen un vértice blanco, colocarlo en su lugar correspondiente. En lo sucesivo nos referiremos a esquinas cuando nos refiramos a una de las ocho esquinas del cubo atendiendo a su posición en el cubo y vértices cuando nos refiramos a una de estas esquinas como pieza movible con tres caras de colores.

Podemos simplificar el proceso si partimos de una esquina o vértice del cubo como referencia. Escogemos como comienzo de partida de la resolución la esquina blanca- roja-azul, a la que nos referiremos en lo sucesivo como Esquina 1. El orden en que se mencionan los colores es importante: la primera cara es la superior de ese vértice, la segunda la frontal y la tercera es la derecha. Recordemos que la esquina del cubo que el lector triple de colores lee es la delantera-superior-derecha. El programa arranca y aparece un mensaje en pantalla que nos pide que pongamos el cubo en la bandeja con la esquina Bl-Ro-Az al alcance del lector triple de colores. Este comprueba que es la esquina deseada y con la orientación deseada y aparece un mensaje de "gracias" en la pantalla. Si no colocamos el cubo o lo colocamos con otra esquina en su lugar o con la esquina correcta con una orientación incorrecta (Az-Bl- Ro o  Ro-Az-Bl), volverá a pedirnos que coloquemos el cubo correctamente hasta que lo hagamos.

De todo esto se encarga el bloque personalizado Esquina1 que está al comienzo del programa.



Si abrimos el bloque Esquina1, vemos que en el interior de un bucle condicionado se encuentran:
  • varios bloques "pantalla": muestran el mensaje pidiendo que pongan el cubo con la esquina Bl-Ro-Az al alcance del lector triple de colores (como el mensaje es largo, hacen falta varios renglones para exponerlo: de ahí la necesidad de varios bloques configurados para no borrar lo que ya había en la pantalla).
  • un retardo de 5 segundos: para dar tiempo a poner el cubo en la bandeja manualmente.




  • el bloque personalizado Leeresquina: si abrimos este bloque, vemos lo que se muestra en la imagen siguiente: se acciona el brazo del lector triple de colores, éste lee los tres colores de la esquina, asignando los valores numéricos de los colores a las variables ColorArriba, Colorfrontal y Colorderecho (las variables aparecen como bloques con el símbolo de un maletín) y retira el brazo.



  • el bloque personalizado Proddiv: básicamente multiplica 60 (el maletín con el candado suele representar constantes) por las variables ColorArriba y por Colorfrontal y el resultado lo divide por la variable Colorderecho. El valor obtenido se la asigna a la variable Proddiv (del mismo nombre que este bloque personalizado).


Volviendo al bloque Esquina 1, se compara el valor de la variable Proddiv con la constante 900 (bloque que muestra un maletín con un candado), para ver si son iguales . Esta comparación genera un valor lógico que, si es positivo permite salir del bucle condicionado, y, si no, lo obliga a repetirse. Si sale del bucle, aparecerá en pantalla un mensaje de "Gracias" por haber puesto correctamente el cubo en la bandeja giratoria.




A continuación, la bandeja con el cubo gira 90 º a la derecha (Mesaderecha) para ofrecerle al triple sensor de colores la que llamaremos Esquina 2. Esta esquina es la que, si estuviera el cubo formado, ofrecería al triple sensor los colores blanco, verde y rojo.



Si abrimos este bloque Esquina2, vemos que aparece en pantalla el mensaje Esquina 2 (el programa está lleno de "chivatos" que nos indican por dónde va la ejecución del mismo, qué valor arrojan la lectura de los sensores, el valor de las variables, etc. Frecuentemente, vienen acompañados de retardos para que dé tiempo a leer estos mensajes en la pantalla del ladrillo e incluso por pitidos).


Dentro de un bucle que se repite tres veces (más adelante explicaremos por qué) se ejecuta el bloque Leeresquina y un nuevo bucle personalizado que se llama Hay Blanco.


Básicamente, en este bucle Hay Blanco se compara el valor de las variables Colorarriba, ColorFrontal y Colorderecha con la constante 6 (el correspondiente al color blanco). Se generan tres variables lógicas Okey1, Okey2 y Okey3 que, caso de dar afirmativo en la comparación, serán iguales a 1. A continuación generamos la variable lógica Hayblanco que será igual a la suma lógica de Okey1, Okey2 y Okey3. Dicho de otra manera, si una de las caras de la esquina 2 es blanca, Hayblanco será igual a 1, siendo ésta 0 en caso contrario.


Esta variable Hayblanco es la que decide la bifurcación siguiente: si en la esquina 2 hay un vértice con una cara blanca, procederemos a colocarlo en su sitio y orientación correcta mediante la combinación correspondiente de movimientos básicos B, B', F, F', etc. Pero si no hay una cara blanca en el vértice, lo ignoraremos. Por eso en la parte de abajo de la bifurcación no hay nada. No obstante, podríamos colocar un bloque pantalla con el mensaje "No hay blanco".




Para identificar ese vértice con una cara blanca con vistas a colocarlo en su posición y orientación correcta de la cara blanca del cubo, utilizamos el valor Proddiv. En la tabla siguiente se muestran los valores que arrojarían esos tres vértices posibles con las tres orientaciones posibles (las combinaciones blanco-rojo-azul no aparecen pues suponemos que ese vértice está ya situado en su posición correcta de la esquina 1).



Pues bien, estos 9 valores deciden el camino a seguir en la bifurcación múltiple gracias al cable de datos numéricos amarillo que conecta con la variable Proddiv. Para ello, configuramos el bloque bifurcación asignando a las posibilidades 1, 2, 3, 4, 5, 6, 7, 8 y 9 los valores numéricos 20, 30, 120, 150, 180, 216, 600, 720 y 1080 respectivamente.


El de la imagen superior tiene 10 posibilidades porque, cuando lo hice, no sabía bien programar el bucle y parecía que había que dejar una posiblidad primera "por defecto" (que asocié al valor 1) por si alguno de los otros casos no se cumplía. En todo caso y como se ve en el dibujo, si la esquina que está en el lugar de la esquina 2 es la azul (arriba)-negra (frontal)-blanca (derecha), Proddiv valdrá 20 y se ejecutará la secuencia 20 (la segunda en la imagen), esto es, F', F', D', D', F, F, L', D, L.

¿Cómo crear la secuencia de movimientos básicos que pongan un vértice con una cara blanca en su esquina correcta dejando el cubo con la orientación que tenían inicialmente y sin cambiar otras esquinas de la cara blanca que ya estuvieran colocadas en su sitio? Pues... puede llegar a ser todo un ejercicio mental.



Un método que yo usé consistía en tener dos cubos de Rubik de 2x2x2: uno estaba completamente resuelto y orientado de manera que ofreciera el vértice en estudio en su esquina correcta teniendo en cuenta la orientación que tiene el cubo cuando el sensor (en este caso la esquina 2); y el otro cubo con el vértice en la posición y orientación en la que encuentra el sensor. Se trata de llevar esta esquina del segundo cubo a la posición y orientación que debe tener en el primer cubo. Eso sí: primero, sin sacar de su sitio otros vértices que ya hubiéramos colocado en su sitio (de momento sólo la esquina 1); y, segundo, dejando el cubo en su bandeja con la orientación que tenía en el momento en que el lector triple de colores la estudió.

En este ejemplo que para llevar la esquina verde-blanca-negra a su sitio...



 ...basta con un movimiento R



Estas secuencia de movimientos que pueblan las bifurcaciones múltiples las diseñó el alumnado: a cada uno se le asignó una esquina (siete esquinas, descontando la primera) y debía diseñar nueve secuencias (tres vértices con tres orientaciones posibles mostradas como cada una de las combinaciones de colores de la tabla de colores de arriba).


En algunos casos bastaba con un movimiento (para colocar la verde-negra-blanca con valor Proddiv=30 en su sitio, basta con girar la cara frontal hacia la izquierda: F'), en otros hacían falta bastantes movimientos y en algunos otros casos no hacía falta hacer nada: la esquina estudiada estaba ya en su posición y orientación correctas y, sólo por dejar constancia, mostraba un mensaje en pantalla de que el vértice encontrado en la esquina 2 (blanca-verde-roja con valor Proddiv=216) ya estaba correctamente posicionado y orientado.


Tras esto lo lógico sería pasar a estudiar la siguiente esquina. Pero, cuando ensayamos el prototipo observamos que tras colocar un vértice en su sitio, a veces, otro vértice con una cara blanca ocupaba la esquina que aquella había abandonado. Entonces, y por no complicar la programación, metimos la secuencia Leeresquina-Proddiv-bifurcaciónmúltiple dentro de un bucle que se repetía tres veces. Probablemente habría sido más inteligente volver a leer los colores del vértice y condicionar la salida de este bucle a la suma lógica "no tiene blanco"OR"esquina ya colocada en su sitio". Pero había prisa en el momento en que detectamos el fallo y lo dejamos así. Por otra parte, repetir la secuencia tres veces venía bien en caso de que hubiera un fallo en la lectura de los colores del vértice.


Tras esto, volvemos a girar la bandeja con el cubo 90º  a la derecha (Mesaderecha) para ofrecerle al lector triple de colores la esquina 3. Esta esquina es la que, caso de estar el cubo completado, ofrecería los colores blanco-negro-verde. Le aplicamos el mismo tratamiento que a la esquina 2, pero teniendo en cuenta que las 9 secuencias son completamente diferentes que las aplicadas en la esquina anterior (8 en realidad, si descontamos la posibilidad de que el vértice bl-ne-ve esté ya en la esquina 3) y que necesitan de un diseño propio. De todo esto se encarga el bloque Esquinita31 (a veces hay que cambiar un bloque por otro igual con un nombre diferente: esto ocurre al encontrar fallos de compilado que no obedecen a un motivo evidente).

Dos bloques personalizados que nos pueden ayudar son Giresqhor y Giresqant. Éstos giran un vértice con una cara blanca en sentido horario y antihorario respectivamente sin afectar a otros vértices de la cara blanca superior.
Giresqhor = F + D + D + F' + R' + D + D + R
Giresqant = R' + D' + D' + R + F + D + D + F'

Pueden ser útiles si, por ejemplo, en esta esquina 3 nos encontramos con las lectura verde-blanco-negro (Proddiv = 1080: habría que girar el vértice en sentido horario) o negro-verde-blanco (Proddiv = 30: habría que girar el vértice en sentido antihorario).

A continuación volvemos a girar la bandeja con el cubo 90 a la derecha para ofrecerle al lector triple de colores la esquina 4. Esta esquina es la que, caso de estar el cubo completo, ofrecería los colores blanco-azul-negro. Le aplicamos lo ya dicho para la esquina 3. De esto se encarga el bloque personalizado esquina4.


Acto seguido, damos dos volteos al cubo para ofrecerle al lector triple de colores la esquina 5. Esta esquina es la que, caso de estar el cubo resuelto, ofrecería los colores amarillo-azul-rojo (de hecho, si el cubo estuviera resuelto, lo que veríamos sería la cara amarilla completada). Le aplicamos a la esquina 5 lo ya dicho para la esquina 3, con la salvedad de que hay que diseñar 9 secuencias de movimientos: ningún vértice con una cara blanca estaría en su sitio en la esquina 5. El bloque encargado de esto es esquinita51.




Nuevo giro de la bandeja 90º a derechas para ofrecerle al lector de triple de colores la esquina 6  que, caso de estar el cubo resuelto, ofrecería los colores amarillo-negro-azul. Le aplicamos lo ya dicho para la esquina 5. El bloque encargado de esto es Esqunita6.


Nuevamente el bloque Mesaderecha para ofrecer al sensor de color la esquina 7 que, caso de estar el cubo resuelto, ofrecería los colores amarillo-verde-negro. Le aplicamos lo ya dicho para la esquina 5 con la salvedad de que ya no es necesario repetir la secuencia tres veces: con dos ya tiene suficiente. El bloque Esquina7 se encarga de resolver la esquina.


Y un último giro de la bandeja a la derecha para ofrecerle al sensor la esquina 8, la que, caso de estar el cubo resuelto, ofrecería los colores amarillo-rojo-verde. Le aplicamos lo ya dicho para la esquina 7: ahora no sería necesario repetir la secuencia. No obstante, preferimos pecar de prudecia y la ejecutamos dos veces. Esto corresponde al bloque Esquinita8.

En total, es necesario diseñar 60 secuencias para las esquinas: 3 x 8 para las tres esquinas superiores y 4 x 9 para las cuatro esquinas inferiores. Probablemente haya errores en el diseño de varias de estas secuencias: de hecho aparecieron varios durante los ensayos que no he corregido: ha sido un trabajo que se ha repartido entre mucha gente y es fácil que se cuelen fallos. No es demasiado grave porque, en muchos casos, un vértice que se ha recolocado en una esquina errónea es finalmente colocada bien cuando le tocó el turno de procesar esta nueva esquina. Se aceptan correcciones en los comentarios de esta entrada.

Quizá sería mejor diseñar las 60 secuencias de la manera sistemática que nos propone el autor de esta página web. Básicamente se trata de poner el vértice con cara blanca en la cara inferior, concretamente bajo la esquina de debe ocupar,  y, dependiendo de la orientación de este vértice, ejecutar una de tres secuencias posibles. No olvidemos que hay que reorientar después el cubo como estaba en el momento de identificar la esquina.

En este vídeo vemos cómo forma la cara blanca completamente ordenada (y si no se llega a caer el teléfono móvil, habríamos visto también cómo resolvía el cubo entero)




Ahora tenemos el cubo con la cara blanca completada boca abajo y con la cara amarilla hacia arriba para completarla. Pero de eso ya hablaremos en la siguiente entrada.

No obstante, antes hablaremos de como les fue al resto de prototipos: es evidente que todo lo mostrado se está usando para la versión For Mindstorm NXT 2.1 Education Base Set.

Sólo teníamos tres sensores de color para Mindstorm NXT y se usaron en el prototipo anterior. En el prototipo For Mindstorm NXT Home Edition pensaba utilizar sensores de luz que pudiesen medir niveles de gris. Así,  a partir de unos valores prefijados con algo de tolerancia (estos sensores tienen su propia fuente de luz y no deberían depender demasiado de las condiciones de luz exterior), estos sensores identificarían los colores a partir de sus equivalentes en niveles de grises de 0 a 100. O, otra posibilidad, introducir una rutina inicial que asignara equivalencias colores-niveles de gris a partir del un vértice con tres colores y otro vértice con los otros tres colores, probando también las variaciones de los niveles de gris dependiendo de si se encuentran en la superficie superior, frontal o derecha y así, generar los valores máximos y mínimo de gris que asignaríamos a cada color.

Lamentablemente, a partir de la sesión 5, era evidente que el tiempo se nos echaba encima y que no había margen para estudiar las posibilidades antes comentadas. Este prototipo se desmontó y el grupo de trabajo se integró, a partir de la sesión 6 en otros grupos de trabajo.

El prototipo Tilted Twister, debido a lo bien que funcionaba (fallos en volteos aparte), estuvo un mes y medio sin tocarse más que para exhibirlo en ferias científicas y tecnológicas. Para cuando éstas terminaron, y debido al elevado margen de error en los movimientos de volteo y al poco tiempo fuera del programa (recreos y tardes de otros días lectivos) de que disponían los alumnos a estas alturas de curso para adaptarlo mecánicamente e informáticamente, se decidió desmontarlo a finales de mayo. La necesidad de hacerlo funcionar a partir de niveles de grises también pesó en su contra. Fue una lástima porque la sencillez del prototipo, y particularmente del mecanismo del sensor de color, lo hacían idóneo para la adaptación al 2x2x2. De todas formas, su grupo de trabajo llevaba ya tiempo integrado en otros grupos.