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)