Briantenberg

This is an implementation of Braitenberg robot described in the following book :

Valentino Braitenberg, Vehicles: Experiments in Synthetic Psychology, 1st MIT Press pbk. ed., 1986.

Overview

A Braitenberg vehicle is a simple reactive agent that demonstrates how basic sensor-to-motor connections can lead to seemingly intelligent behavior.

In its basic form, the vehicle consists of:

  • Sensors (e.g., light, distance)

  • Motors (e.g., for wheels or movement)

  • Direct connections between sensors and motors

The behavior of the vehicle depends on how the sensors are connected to the motors. For example:

  • A sensor on the left connected to the right motor will cause the vehicle to turn toward the stimulus (e.g., light), simulating attraction.

  • Reversing the connection or inverting the signal can simulate avoidance.

Code

import os
import matplotlib.pyplot as plt
from brian2 import *
from brian2ros import *

set_device("ros_standalone", directory="src/src/brian_project", debug=True)

f = 2 * Hz
tau = 20 * ms
A = 150 / second
sig = 0.5
f = 2 * Hz
N = 90
taum = 30 * ms

list_angle = np.concatenate(
    (
        np.linspace(360 - (N // 2), 359, N // 2, dtype=int),
        np.linspace(0, N // 2, N // 2, dtype=int),
    )
)

sub = LaserScanSubscriber(
    name='sub',
    output={"ranges": list_angle}
)

eq_s = """
dv/dt = -(v/tau) + (40/x_o)*Hz : 1
x_o = sub(t, i, 0) : 1
"""

sensor = NeuronGroup(
    N, eq_s, threshold="v>1", reset="v=0", method="euler", name="sensor"
)

eq_c = """
dv/dt = -v/tau : 1
motor = x*v : 1 (constant over dt)
x = (-1)**i: 1
"""

control = NeuronGroup(2, eq_c, method="exact", name="control")

S = Synapses(sensor, control, "w : 1", on_pre="v_post += w", name="S_1")
S.connect(j="i//45")
S.w = 0.2

motor_commands = TwistPublisher(
    rate=200,
    input={"linear.x": 0.26, "angular.z": control.motor},
    reset_values={"linear.x": 0.0, "angular.z": 0.0}
)
get_device().add_publisher(motor_commands)  

S_sensor = SpikeMonitor(sensor)

M = StateMonitor(sensor, variables=True, record=True)

P = PopulationRateMonitor(sensor)
run(100000 * ms)