Navigation décentralisée d'une flotte de six robots : algorithme de consensus en position, influence de la topologie du graphe de communication, architecture leader-suiveur avec maintien de formation, puis intégration d'un évitement d'obstacles pour une mission complète validée sur Robotarium. Projet réalisé en équipe avec Tikhon Chernyshev, Steeve Mbock et Guilhem Perret-Bardou.
PDF Rapport complet11 pages · consensus, leader-suiveur, évitement d'obstacles Télécharger →Démonstration de la flotte de robots en formation sur Robotarium.
Chaque robot calcule sa commande à partir de l'écart entre sa position et celle de ses voisins directs, sans consigne globale : si le graphe de communication est connexe, tous les robots convergent vers le barycentre pondéré des positions initiales. Un graphe complet à six nœuds garantit une convergence rapide mais coûteuse en canaux de communication (croissance quadratique) ; un graphe en anneau ne nécessite que 6 liaisons contre 15, au prix d'une convergence plus lente. Supprimer une deuxième liaison peut rompre la connexité du graphe et rendre le consensus global impossible.
# Loi de consensus du robot i u_i = sum(kp * a_ij * (x_j - x_i) for j in voisins(i)) # Robot leader guidant la flotte vers (xr, yr) u_0 = sum(kp * a_0j * (x_j - x_0) for j in voisins(0)) + kt * (x_ref - x_0)
La flotte de six robots (dynamique simple intégrateur) est organisée en formation en croix, le leader suivant une trajectoire circulaire (rayon 0,3 m, vitesse angulaire 0,25 rad/s) avec saturation de vitesse à 0,15 m/s et certificat de barrière pour l'évitement inter-robots. Sur 15 000 itérations, la flotte converge et maintient sa formation tout au long de la trajectoire, avec un léger décrochage d'un robot lors des phases de forte accélération du leader, dû à la saturation de vitesse.
dxi[:, 0] = kL * (x_ref - xi[:, 0]) dxi[:, i] = kF * (xi[:, 0] + rRef[i] - xi[:, i]) dxi = si_barrier_cert(dxi, xi) dxu = si_to_uni_dyn(dxi, poses)
Une force d'évitement par champ potentiel mixte combine répulsion radiale et contournement tangentiel dès qu'un robot entre dans un rayon de détection de 2,0 m autour d'un obstacle rectangulaire, avec un poids de 0,4 pour la répulsion et 0,6 pour la tangente vers la destination.
def compute_avoidance_ctrl(robot_state, rects, detection_radius, k_avoid=1.5):
ctrl = np.zeros((2, 1))
pos = robot_state.flatten()
for (rx, ry, w, h) in rects:
obs = closest_point_on_rect(pos[0], pos[1], rx, ry, w, h)
d = float(np.linalg.norm(pos - obs))
if d < detection_radius:
repulse = (pos - obs) / (d + 1e-6)
intensity = max(k_avoid * (1.0/d - 1.0/detection_radius), 0.0)
# + choix du sens de contournement (horaire / antihoraire) vers la destination
ctrl += intensity * (0.4 * repulse + 0.6 * tangent).reshape(2, 1)
return ctrl
| Topologie / mode | Compromis observé |
|---|---|
| Graphe complet (consensus) | Convergence rapide et robuste, coût de communication quadratique |
| Graphe en anneau (consensus) | Coût linéaire, convergence plus lente, plus fragile aux suppressions de lien |
| Consigne leader en position | Simple, mais génère une vitesse variable qui perturbe les suiveurs |
| Consigne leader en vitesse | Formation plus stable, exige une compatibilité de dynamique |
La mission finale intègre l'ensemble de ces briques : consensus initial, transition vers le mode leader-suiveur, navigation multi-waypoints et maintien de formation, en présence d'obstacles, offrant une introduction concrète aux méthodes de contrôle décentralisé multi-agents, de la théorie des graphes à la validation sur simulateur.
← Retour au portfolio