Vehículos de Braitenberg en RobotC

FrontalLos vehículos de Braitenberg fueron concebidos por el investigador Italo-Autriaco Valentino Braitenberg para ilustrar de manera evolutiva las habilidades de agentes simples. Los vehículos representan la forma más simple de inteligencia artificial basada en comportamientos o conocimiento corporal, por ejemplo el comportamiento inteligente que surje de la interacción sensor-motor entre el agente y su entorno, sin necesidad de una memoria interna, representación del entorno, o inferencia. Hoy probamos los vehículos de Braitenberg en RobotC.

¿Qué es un vehículo de Braitenberg?:

Un vehículo de Braitenberg es un agente que puede moverse de forma autónoma por un entorno. Tiene sensores primitivos (capaces de medir estímulos), y ruedas (cada una manejada por su propio motor) que funcionan como actuadores o efectores. Un sensor, en su forma más simple, está directamente conectado a un efector, de manera que una señal o estímulo en dicho sensor produce una respuesta inmediata en el motor (moviendo la rueda, por ejemplo).

Dependiendo de la forma en que estén conectados los sensores y motores, el vehículo mostrará distintos comportamientos. Basándonos en esta idea podemos definir dichas conexiones con objeto de cumplir cierto objetivo o comportamiento. Parecerá que el vehículo intenta lograr llegar a ciertas situaciones y evadir otras, cambiando su trayectoria cuando la situación cambia.

Ejemplos de vehículos de Braitenberg:

Los siguientes ejemplos son algunos de los vehículos de Braitenberg más simples:

Un primer agente tiene un sensor detector de luz que estimula directamente a su única rueda, implementado las siguientes reglas:

  • Más luz produce un movimiento más rápido.
  • Menos luz produce un movimiento más lento.
  • La oscuridad produce que se quede quieto.

Este comportamiento puede ser interpretado como una criatura que teme a la luz y que se mueve rápido para salir de ella. Su objetivo es encontrar un hueco oscuro en el que ocultarse.

Un segundo agente algo más complicado tiene dos sensores de luz (izquierdo y derecho), cada uno estimulando a la rueda de su mismo lado. Obedece las siguientes reglas:

  • Más luz en la derecha → la rueda derecha gira más rapido → gira hacia la izquierda, fuera de la luz.
  • Más luz en la izquierda → la rueda izquierda gira más rapido → gira hacia la derecha, fuera de la luz.

Este es más eficiente como un comportamiento para escapar de la fuente de luz, ya que la criatura puede moverse en diferentes direcciones, y tiene a orientarse hacia la dirección desde la que procede menos luz.

En otra variación las conexiones son negativas o innovadoras:

  • Más luz en la derecha → la rueda derecha gira más lento → gira hacia la derecha, hacia la luz.
  • Más luz en la izquierda → la rueda izquierda gira más lento → gira hacia la izquierda, hacia la luz.

En este caso el agente huye de la oscuridad, moviéndose hacia la luz.

Configuración de motor y sensores mediante el menú de RobotC:

Una manera cómoda de configurar los sensores y motores en RobotC es mediante el menú de configuración de motores y sensores (Motors and Sensores Setup). Para acceder al mismo seguid la siguiente ruta: Robot → Motors and Sensores Setup y os saldrá el siguiente menú:

Braitenberg-conf1

En la pestaña de motores podremos elegir qué motores vamos a usar y ponerles el nombre que deseemos, y si queremos que tenga el PID (Controlador Proporcional Integral Derivativo) activado. En la pestaña de sensores podemos elegir qué tipo de sensores queremos anclar a cada puerto, así como el nombre que deseemos darles. Una vez configurado todo le dais a aceptar y ya os escribe el código directamente:

Braitenberg-conf2

Vehículo de Braitenberg en RobotC:

Como ya habréis supuesto los vehículos de Braitenberg no son problemas muy complejos de resolver con RobotC. En este caso vamos a implementar el último de los ejemplos que he puesto:

  • Más luz en la derecha → la rueda derecha gira más lento → gira hacia la derecha, hacia la luz.
  • Más luz en la izquierda → la rueda izquierda gira más lento → gira hacia la izquierda, hacia la luz.

Necesitaremos construir un robot con dos sensores de luz y dos motores. Es importante que los sensores de luz miren más o menos hacia los lados y no hacia adelante, o no podremos medir bien la cantidad de luz que proviene de cada lado. Con un ángulo de 45º es suficiente, como el robot que hemos construido nosotros:

lateral

A la hora de configurar los sensores de luz es importante que los pongáis en modo pasivo, o sea sin que emitan luz, ya que en este caso dicha luz nos entorpecería en nuestro cometido. Ponedle nombres intuitivos a los motores y a los sensores, como motorDerecho, sensorIzquierdo… Así se os hará mucho más fácil programarlos, y ver qué es lo que falla en caso de problemas. El código del programa sería así:


#pragma config(Sensor, S1, Sizq, sensorLightInactive)
#pragma config(Sensor, S4, Sder, sensorLightInactive)
#pragma config(Motor, motorB, Mder, tmotorNormal, PIDControl,)
#pragma config(Motor, motorC, Mizq, tmotorNormal, PIDControl,)
//*!Code automatically generated by ROBOTC configuration wizard!*//

#pragma platform(NXT)

task main(){
while(true){
nxtDisplayCenteredTextLine(2, “Sizq: %d”, SensorValue[Sizq]);
nxtDisplayCenteredTextLine(4, “Sder: %d”, SensorValue[Sder]);
if (SensorValue[Sizq] < SensorValue[Sder]){
motor[Mder] = 30;
motor[Mizq] = 70;
} else if (SensorValue[Sizq] > SensorValue[Sder]){
motor[Mder] = 70;
motor[Mizq] = 30;
} else {
motor[Mizq] = 70;
motor[Mder] = 70;
}
}
}

Y aquí os dejo un vídeo de muestra para que veáis como funciona:

Ante cualquier duda podéis visitar el foro.

Comments are closed.