Le robot cherche une porte ou un passage. La matrice LIDAR 8×8 mesure les distances devant lui.
Écris une fonction qui analyse une ligne horizontale (8 valeurs) et détecte une « ouverture » : une zone où la distance augmente soudainement (différence > 300 mm avec les voisins).
Retourne la position (colonne 0-7) et la largeur de l'ouverture détectée, ou -1 si aucune ouverture.
Bonus : gère le cas où l'ouverture est sur plusieurs lignes (porte vs trou dans le mur).
Prototype suggéré :
int detect_opening(uint16_t line[8], int *width);
Indices :
Solution :
#include <stdio.h>
#include <stdint.h>
/* Analyse une ligne de 8 mesures LIDAR.
Retourne la colonne de début de l'ouverture (0-7),
ou -1 si aucune ouverture. *width reçoit la largeur. */
int detect_opening(uint16_t line[8], int *width)
{
int debut = -1;
int fin = -1;
int seuil = 300; /* Différence minimale en mm */
for (int i = 1; i < 7; i++) {
/* Augmentation soudaine : début d'ouverture */
if (debut < 0 && (int)line[i] - (int)line[i - 1] > seuil) {
debut = i;
}
/* Diminution soudaine : fin d'ouverture */
if (debut >= 0 && (int)line[i - 1] - (int)line[i] > seuil) {
fin = i - 1;
break;
}
}
if (debut >= 0) {
if (fin < 0) {
fin = 7; /* L'ouverture atteint le bord droit */
}
*width = fin - debut + 1;
return debut;
}
*width = 0;
return -1;
}
void afficher_ligne(uint16_t line[8])
{
printf("Ligne : ");
for (int i = 0; i < 8; i++) {
printf("%4d ", line[i]);
}
printf("\n");
}
int main(void)
{
int width;
int pos;
/* Cas 1 : ouverture au milieu (colonnes 3-5 à 2000 mm,
murs à 400 mm de chaque côté) */
uint16_t ligne1[8] = { 400, 400, 400, 2000, 2000, 2000, 400, 400 };
afficher_ligne(ligne1);
pos = detect_opening(ligne1, &width);
if (pos >= 0) {
printf("=> Ouverture en colonne %d, largeur %d\n\n", pos, width);
} else {
printf("=> Aucune ouverture\n\n");
}
/* Cas 2 : ouverture jusqu'au bord droit */
uint16_t ligne2[8] = { 500, 500, 500, 500, 2500, 2500, 2500, 2500 };
afficher_ligne(ligne2);
pos = detect_opening(ligne2, &width);
if (pos >= 0) {
printf("=> Ouverture en colonne %d, largeur %d\n\n", pos, width);
} else {
printf("=> Aucune ouverture\n\n");
}
/* Cas 3 : mur uniforme, pas d'ouverture */
uint16_t ligne3[8] = { 600, 610, 590, 600, 610, 600, 590, 600 };
afficher_ligne(ligne3);
pos = detect_opening(ligne3, &width);
if (pos >= 0) {
printf("=> Ouverture en colonne %d, largeur %d\n\n", pos, width);
} else {
printf("=> Aucune ouverture\n\n");
}
return 0;
}