2016-04-12 6 views
2

J'ai un robot mobile qui a un capteur de distance attaché à un servomoteur panoramique. Le moteur tourne continuellement pour déplacer le capteur de 0 à 180 degrés et vice versa.Recherche d'un algorithme pour la navigation robotisée

Le capteur de distance envoie un signal toutes les quelques millisecondes pour rechercher les obstacles dans son environnement. On peut visualiser les données générées par le capteur de distance comme ceci:

enter image description here

Je souhaite créer un algorithme qui permet au robot de se déplacer dans le sens où il y a le plus d'espace disponible (ou le moins d'obstacles) .

Plus formellement, je peut représenter les entrées et sorties comme:

  • entrée : tableau de distances à l'objet le plus proche pour chaque angle de rotation du moteur.

  • sortie: une seule valeur représentant l'angle optimal.

Les exigences de l'algorithme sont:

  • ne devrait pas être sensible aux valeurs aberrantes dans les données (les capteurs pic parfois imprévisiblement)
  • n'a pas besoin d'être absolument optimale, 1-2% off est acceptable
  • efficace (ce qui fonctionnera sur un petit microprocesseur)
  • compréhensible pour un amateur (je ne suis pas un expert ML;))
+1

1-2% de réduction de quoi? Quoi qu'il en soit, ce sera très difficile à réaliser. des idées? avez-vous essayé quelque chose? (Ceci est considéré comme une exigence ici pour obtenir de l'aide) – Piglet

Répondre

0

Je ne sais pas la langue que vous utilisez (je suis un Java et C# type), donc je vais juste utiliser le code pseudo:

EPSILON : Float = .02f -> this is our margin of error 

DIRECTION : Integer = 0 -> the best direction to go 

DISTANCE : Float = 0 -> the furthest distance from the robot 

DISTANCES : Float[181] -> the values you get from your sensor 

DISTANCE = DISTANCES[DIRECTION] // set the first distance 

    for(int index = 1; index < size_of(DISTANCES)-1; index++) { 
     //we are checking if the value is within 2% of the previous and next values 
     if((DISTANCES[index-1] * (1+EPSILON) >= DISTANCES[index] AND 
      DISTANCES[index-1] * (1-EPSILON) <= DISTANCES[index]) OR 
      (DISTANCES[index+1] * (1+EPSILON) >= DISTANCES[index] AND 
      DISTANCES[index+1] * (1-EPSILON) <= DISTANCES[index])) { 
     //if the distance at index is greater than the current max distance, 
     //we set that to be the new max distance 
     if(DISTANCES[index] > DISTANCE) { 
      DISTANCE = DISTANCES[index] 
      DIRECTION = index 
      } 
     } 
    } 

Vous pouvez également faire deux balayages avec le capteur et comparez les distances à chaque point pour voir s'il y a des pics, mais étant donné les spécifications que vous avez énumérées cela devrait fonctionner.