In My Mind
← inteligencia-artificial

46. Braitenberg vehicle

Un vehículo de Braitenberg es un concepto presentado como experimento mental por el cibernético italiano Valentino Braitenberg en su libro «Vehículos: Experimentos en Psicología Sintética» . El libro modela el mundo animal de forma minimalista y constructiva, desde comportamientos reactivos simples (como la fototaxis ), pasando por los vehículos más simples, hasta la formación de conceptos, el comportamiento espacial y la generación de ideas. En los vehículos más sencillos, el movimiento se controla directamente mediante sensores (por ejemplo, fotocélulas). Sin embargo, el comportamiento resultante puede parecer complejo o incluso inteligente.

Mecanismo

Un vehículo Braitenberg es un agente que puede desplazarse de forma autónoma gracias a la información de sus sensores. Cuenta con sensores primitivos que miden un estímulo en un punto y ruedas (cada una accionada por su propio motor) que funcionan como actuadores o efectores. En la configuración más simple, un sensor se conecta directamente a un efector, de modo que la señal detectada produce inmediatamente el movimiento de la rueda.

Vehículo 2a

Un agente ligeramente más complejo cuenta con dos sensores simétricos (izquierdo y derecho) (p. ej., detectores de luz), cada uno de los cuales estimula una rueda del mismo lado del cuerpo. Este vehículo representa un modelo de tropotaxis animal negativa . Obedece la siguiente regla:

  • Más luz a la derecha → la rueda derecha gira más rápido → gira hacia la izquierda, alejándose de la luz. Este es un comportamiento más eficiente para escapar de la fuente de luz, ya que la criatura puede moverse en diferentes direcciones y tiende a orientarse hacia la dirección de donde proviene menos luz.

En otra variante, las conexiones son negativas o inhibitorias: más luz → movimiento más lento. En este caso, los agentes se alejan de la oscuridad y se acercan a la luz.

Vehículo 2b

El agente tiene los mismos dos sensores simétricos (izquierdo y derecho) (p. ej., detectores de luz), pero cada uno estimula una rueda del otro lado del cuerpo. Obedece la siguiente regla:

  • Más luz a la izquierda → la rueda derecha gira más rápido → gira hacia la izquierda, más cerca de la luz. Como resultado, el robot sigue la luz y se mueve para estar más cerca de ella.

Código utilizado

Este es el código que utilice para pasar el examen, aunque el código no esta del todo correcto, si nos dirá el valor correcto del ultimo modulo que es el mas importante con un valor de 4/10. Las respuestas correctas son:

  • Parte 2 (0,0) (se juntan en la luz )
  • Parte 3 (-4.95 -4.91 4.95 4.91) (Se alejan y se juntan en el camino)

Figure_1.png

import numpy as np

import matplotlib.pyplot as plt

  

class VehiculoBraitenberg:

    def __init__(self, x, y, theta, c, nombre="Vehículo"):

        self.x = x

        self.y = y

        self.theta = theta  # Orientación en radianes

        self.c = c          # Constante (positiva para 2b, negativa para 3b)

        self.nombre = nombre

        self.sensor_dist = 1.0  # Distancia entre sensores

        self.historia_x = [x]

        self.historia_y = [y]

  

    def actualizar(self, pos_luz, dt=0.1):

        # 1. Posición de sensores (frontales a 45 grados)

        lx = self.x + self.sensor_dist * np.cos(self.theta + np.pi/4)

        ly = self.y + self.sensor_dist * np.sin(self.theta + np.pi/4)

        rx = self.x + self.sensor_dist * np.cos(self.theta - np.pi/4)

        ry = self.y + self.sensor_dist * np.sin(self.theta - np.pi/4)

  

        # 2. Intensidad de luz percibida (Ley de cuadrado inverso suave)

        def intensidad(sx, sy):

            d2 = (sx - pos_luz[0])**2 + (sy - pos_luz[1])**2

            return 100 / (d2 + 1)

  

        l_i = intensidad(lx, ly)

        l_d = intensidad(rx, ry)

  

        # 3. Lógica de conexión cruzada

        # v_i = c * l_d  |  v_d = c * l_i

        v_i = self.c * l_d

        v_d = self.c * l_i

  

        # 4. Cinemática diferencial

        v_lineal = (v_i + v_d) / 2.0

        v_angular = (v_d - v_i) / self.sensor_dist

  

        self.theta += v_angular * dt

        self.x += v_lineal * np.cos(self.theta) * dt

        self.y += v_lineal * np.sin(self.theta) * dt

        self.historia_x.append(self.x)

        self.historia_y.append(self.y)

  

    def imprimir_final(self):

        print(f"{self.nombre} finalizó en: x = {self.x:.2f}, y = {self.y:.2f}")

  

# --- EJECUCIÓN DEL PROYECTO ---

  

# Partes 1 y 2: Luz Estática en (0,0)

print("--- RESULTADOS PARTES 1 Y 2 ---")

plt.figure(figsize=(12, 5))

  

# Parte 1: Vehículo 2b (Fototaxis)

v2b = VehiculoBraitenberg(10, 10, np.pi, c=0.8, nombre="Vehículo 2b")

for _ in range(500): v2b.actualizar((0, 0))

v2b.imprimir_final()

  

v3b = VehiculoBraitenberg(10, 10, np.pi, c=-0.5, nombre="Vehículo 3b")

for _ in range(500): v3b.actualizar((0, 0))

v3b.imprimir_final()

  
  

plt.subplot(1, 2, 1)

plt.plot(v2b.historia_x, v2b.historia_y, label="Trayectoria 2b (Atrae)")

plt.plot(v3b.historia_x, v3b.historia_y, label="Trayectoria 3b (Aleja)")

plt.scatter(0, 0, c='gold', marker='*', s=200, label="Luz (0,0)")

plt.title("Partes 1 y 2: Luz Estática")

plt.legend(); plt.grid(True)

  
  

print("\n--- RESULTADOS PARTE 3 ---")

va = VehiculoBraitenberg(-10, 0, np.pi/2, c=0.5, nombre="Vehículo A")

vb = VehiculoBraitenberg(10, 0, -np.pi/2, c=0.5, nombre="Vehículo B")

  

for _ in range(1000):

    pos_a = (va.x, va.y)

    pos_b = (vb.x, vb.y)

    va.actualizar(pos_b)

    vb.actualizar(pos_a)

  

va.imprimir_final()

vb.imprimir_final()

  

plt.subplot(1, 2, 2)

plt.plot(va.historia_x, va.historia_y, label="Vehículo A")

plt.plot(vb.historia_x, vb.historia_y, label="Vehículo B")

plt.title("Parte 3: Luces en movimiento")

plt.legend(); plt.grid(True)

  

plt.tight_layout()

plt.show()

relatedInteligencia Artificial