Accueil » Neurone artificiel avec le robot MR25 (Partie 2)

Neurone artificiel avec le robot MR25 (Partie 2)

Mise à jour : 02/06/26

Présentation

Dans cet article nous allons apprendre au robot MR25 à éviter les obstacles en utilisant un neurone perception avec 5 entrées. Avec les 5 capteurs du robot, il est préférable de ne plus simplement décider avance / stop comme dans la partie n°1, mais aussi de choisir une direction lorsque l’on détecte un obstacle.

Voici l’idée :

  • Capteurs 1 et 2 → surveillent la gauche.
  • Capteur 3 → surveille le centre.
  • Capteurs 4 et 5 → surveillent la droite.
  • Distance proche de 0 mm → obstacle très proche.
  • Distance proche de 80 mm → espace libre.

On peut entraîner un perceptron à 5 entrées qui décide si le robot peut avancer, puis utiliser les capteurs pour déterminer le sens de rotation lorsqu’il ne peut pas avancer.

#!/usr/bin/python3

import MR25
import time

# -----------------------------
# Perceptron
# -----------------------------

def activation(x):
return 1 if x >= 0 else 0

# 5 poids
w = [0.0, 0.0, 0.0, 0.0, 0.0]
b = 0.0
eta = 0.1

# -----------------------------
# Apprentissage
# -----------------------------
#
# [c1,c2,c3,c4,c5]
#
# 0 = obstacle
# 1 = avance
#

training_data = [

([0.1,0.1,0.1,0.1,0.1], 0),
([0.2,0.2,0.2,0.2,0.2], 0),
([0.3,0.2,0.1,0.2,0.3], 0),

([0.8,0.8,0.8,0.8,0.8], 1),
([0.9,0.8,0.9,0.8,0.9], 1),
([0.7,0.9,0.8,0.9,0.7], 1),
]

for epoch in range(100):

erreur_totale = 0

for inputs, target in training_data:

s = sum(wi * xi for wi, xi in zip(w, inputs)) + b

y = activation(s)

erreur = target - y

for i in range(5):
w[i] += eta * erreur * inputs[i]

b += eta * erreur

erreur_totale += abs(erreur)

if erreur_totale == 0:
break

print("Poids :", w)
print("Biais :", b)

# -----------------------------
# Pilotage
# -----------------------------

SEUIL_MAX = 80.0

while True:

c1 = min(MR25.proxSensor(1), SEUIL_MAX) / SEUIL_MAX
c2 = min(MR25.proxSensor(2), SEUIL_MAX) / SEUIL_MAX
c3 = min(MR25.proxSensor(3), SEUIL_MAX) / SEUIL_MAX
c4 = min(MR25.proxSensor(4), SEUIL_MAX) / SEUIL_MAX
c5 = min(MR25.proxSensor(5), SEUIL_MAX) / SEUIL_MAX

entree = [c1, c2, c3, c4, c5]

s = sum(wi * xi for wi, xi in zip(w, entree)) + b

avance = activation(s)

if avance:

MR25.forward(20)
print("AVANCE")

else:

gauche = c1 + c2
droite = c4 + c5

# côté le plus dégagé
if gauche > droite:

MR25.left(20)
print("TOURNE GAUCHE")

else:

MR25.right(20)
print("TOURNE DROITE")

time.sleep(0.1)