Robot con Fototaxis

Robot con Fototaxis

FunCostaRica
5 min readFeb 16, 2017

Una de las cosas más interesantes de los robots, es que los podemos utilizar no solo para imitar a los seres vivos para que hagan nuestro trabajo difícil, sino también para poder entender varios aspectos del funcionamiento de ellos.

En este proyecto, trataremos de entender el movimiento de una bacteria, y luego ver si logramos hacer que nuestro robot se mueva de manera similar y resuelva un problema de “ascenso de gradiente”. Las bacterias tienden a moverse hacia químicos como aminoácidos y azucares, y para hacerlo, deben detectar gradientes de concentración de esos químicos, para moverse hacia donde haya mayor concentración. Ese proceso se conoce como quimiotaxis. Mas generalmente, el movimiento hacia un estímulo en un organismo vivo, se le conoce como taxis.

Movimiento de la bacteria E. coli

Escherichia coli es una bacteria que vive en el tracto intestinal y que, bueno, muchas sepas de E.coli que son patógenas, causan diarreas severas (ouch!). Acá nos interesa su movimiento. Veamos el siguiente video de verdaderas bacterias moviendose,

Se ve E.Coli nadando. Si observan bien, hay dos tipos de movimiento que hace: nadar y “revolver” (tumble en inglés). Con solamente esos dos movimientos, y detectando la cantidad de químicos, la bacteria se puede mover hacia donde hay más químico o, como diríamos técnicamente, ascender un gradiente químico.

Para realizar esta escalada de gradiente, la bacteria resuelve:

  1. Detectar el gradiente
  2. Procesar esa información
  3. Controlar del movimiento

¿Increíble verdad? que una pequeña bacteria haga todo esto!, y además casi como si fuera un computador. Bueno, como veremos en realidad hacerlo es bastante simple, y vamos a programar un robot que funcione como esta bacteria.

Con flagelos, la bacteria entonces puede nadar y revolver como se ven en el siguiente esquema,

Imagen tomada de Prof. Mehran Kardar del MIT

Cuando nada es porque rota en contra de las manecillas del reloj, cuando revuelve es porque rota en dirección de las manecillas del reloj (como se ve en la foto). Entonces,

  1. Nadar (CCW) en una dirección si el gradiente mejora, es decir la concentración del químico antes de moverse es menor a la después del movimiento.
  2. Revolver (CW) a cualquier dirección aleatoria si va en contra del gradiente, dicho de otro modo, si la concentración del químico es menor después del movimiento.

¿funciona? allí es donde entra el robot. Hagamos uno que detecte la luz, y veamos si al aplicar estas reglas el robot efectivamente se va a mover hacia el punto de mayor cantidad de luz.

El Robot Bacteria

Tenemos que programar el RobotKit (o cualquier robot) para que haga lo siguiente:

  1. Que tenga un sensor de luz
  2. Que recuerde la lectura de luz y tome una decisión con esas lecturas
  3. Que mueva los motores de acuerdo a esa decisión

El robot entonces hace una lectura del sensor, y almacena esa lectura. Luego hace un movimiento, lee el sensor nuevamente, compara con la lectura anterior y toma una decisión para hacer cualquier de estos dos movimientos:

  1. Direccional, hacia adelante
  2. Revolverse, es decir, que rote en un punto por un tiempo aleatorio (pivotear)

Vamos a utilizar el sensor de luz y el RobotKit para hacerlo. Para conectar el sensor de luz simplemente conecta el cable al sensor y luego al controlador como se ve en la siguiente foto,

Fijar el sensor al robot con una tira de plástico.

El Algoritmo de la bacteria

Según lo que describimos, el algoritmo quedaría de la siguiente manera

  1. Crear una variable luzAhora y luzAnterior
  2. Leer el sensor de luz y almacenar en luzAhora
  3. Si el valor de luzAhora es mayor que luzAnterior rotar por un algún tiempo
  4. Mover hacia adelante
  5. Almacernar luzAhora en luzAnterior
  6. Repetir 2.

El código completo es el siguiente:

1   #include <RobotKit.h>
2 int luzAntes, luzAhora;
3 void setup() {
4 setMotors();
5 setSensor(A0);
6 }
7 void loop() {
8 luzAhora = readSensor(A0);
9 if (luzAhora >= luzAntes) {
10 int t = random(600);
11 pivotLeft(100, t);
12 }
13 forward(150, 50);
14 luzAntes = luzAhora;
15 }

Explicación:

  • la línea 1 llama a la librería del RobotKit
  • en la línea 2, declaramos las variables que vamos a utilizar (paso 1 del algoritmo)
  • De las líneas 3 a 6 inicializamos motores, y el puerto donde está conectado el sensor de luz
  • línea 8, leemos el sensor de luz (paso 2 del algoritmo)
  • En la línea 9 se compara la lectura actual de luz con la anterior
  • En las líneas 10 y 11, hace el movimiento aleatorio de rotación. Noten como se hace un movimiento a la izquierda por t milisegundos, donde t se escoge al azar pora cada iteración. (paso 3 del algoritmo)
  • Línea 13 mover hacia adelante (paso 4)
  • Guardar la información leída en la variable luzAnterior (paso 5)

El código lo pueden descargar en el github, o buscarlo en ejemplos RobotKit>RobotKit_Fototaxis.

Funcionando

Lo mejor es colocar una fuente de luz potente e iniciar con el robot en una zona oscura. Prender el robot, y observar el resultado,

Acá un video de dos robots detectando el gradiente y avanzando hacia la luz,

Que hay más allá

La naturaleza a través de los procesos de evolución logra encontrar soluciones muy prácticas a diferentes problemas. Al entender la naturaleza, podemos programar robots que traten de utilizar esas soluciones, tanto para entenderlas, como para usos prácticos de la robótica. Como vemos el movimiento de la bacteria en realidad es bastante sencillo y funciona, es una excelente manera de detectar gradientes de cualquier cosa y caminar hacia ellos de manera bastante confiable.

Este tipo de algoritmos son de mucha importancia para búsquedas de diferente índole, imaginen una tropa de robots buscando sobrevivientes en un desastres, o la fuente de derrames de gas. Tadavía son mucho más útiles cuando los robots forman parte de una colectivo grande de robots (muchos robtos que se comunican). Vean por ejemplo los kilobots de la Universidad Harvard,

Vean incluso como el algoritmo de movimiento es similar, hay movimiento hacia adelante pero con movimientos de rotación determinando la dirección del gradiente. ¿Que pasaría si hacemos esto con muchos robots como el nuestro?

Retos

  • Poner varios robots y una fuente de luz ¿cuál es el comportamiento?
  • Colocar obstáculos ¿funciona con obstáculos?
  • ¿Qué otro algoritmo se puede utilizar para seguir la luz?
  • hacer de la variable t una constante en lugar de un valor aleatorio.

Material adicional

Video de este proyecto

--

--

FunCostaRica

Somos una fundación open source que promueve el desarrollo de una ciudadanía capás de construir sus propias soluciones tecnológicas y generar innovación