2016-04-12 4 views
2

Ich habe einen mobilen Roboter, der einen Abstandssensor an einem Schwenkservomotor befestigt hat. Der Motor dreht sich kontinuierlich, um den Sensor von 0 bis 180 Grad und zurück zu bewegen.Auf der Suche nach einem Algorithmus für die Roboternavigation

Der Abstandssensor sendet alle paar Millisekunden ein Signal, um seine Umgebung auf Hindernisse zu untersuchen. Man kann die Daten, die von dem Abstandssensor wie diese erzeugt visualisieren:

enter image description here

Ich wünsche einen Algorithmus zu erstellen, die der Roboter ermöglicht in der Richtung zu bewegen, wo es am meisten Platz zur Verfügung steht (oder die am wenigsten Hindernisse) .

Formal I können die Ein- und Ausgänge darstellen, wie:

  • input: Array von Distanzen zum nächsten Objekt für jeden Winkel der Motordrehung.

  • Ausgabe: ein einzelner Wert, der den optimalen Winkel darstellt.

Die Anforderungen für den Algorithmus sind:

  • nicht zu Ausreißern in den Daten (die Sensoren manchmal unvorhersehbar Spike)
  • absolut optimal, müssen 1-2% nicht anfällig sein sollte off ist akzeptabel
  • effizient (das auf einem kleinen Mikroprozessor ausgeführt wird)
  • verständlich zu einem Bastler (ich bin kein Experte ML;))
+1

1-2% von was? was auch immer es ist, es wird ziemlich schwer zu erreichen sein. irgendwelche Ideen? Hast du irgendwas versucht? (Dies ist eine Voraussetzung, um Hilfe zu bekommen) – Piglet

Antwort

0

Ich weiß nicht, die Sprache, die Sie (Ich bin ein Java und C# Typ) verwenden, so dass ich nur Pseudo-Code verwenden:

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 
      } 
     } 
    } 

Sie auch mit dem Sensor tun zwei Sweeps könnten und Vergleichen Sie die Abstände an jedem Punkt, um zu sehen, ob es Spikes gibt, aber angesichts der Spezifikationen, die Sie aufgelistet haben, sollte dies funktionieren.

Verwandte Themen