Sense - Act - Plan: 5 Abstandssensoren -> 2 Motoren



  • Ich versuche bei einem Experimental-Roboter - hobbymäßig - einen vernünftigen Algorithmus für ein Raumgefühl des - zugegebenermaßen primitiven - Roboters zu erreichen. Bild des Roboters: http://www.henkessoft.de/Roboter/Bilder/DSCF1899.JPG

    Der Roboter besitzt 5 Abstandssensoren, die Daten zwischen 0 (frei) und 255 (blockiert) liefern. Damit sollen zwei Motoren, die über ein 25:1-Getriebe jeweils eines der Räder antreiben, gesteuert werden (speed: ca. - 30 bis +30). Der Roboter fährt typischerweise "vorwärts", soll also nicht zu oft "rückwärts" fahren, damit er sich weiter bewegt.
    Bild: http://nibo.editthis.info/images/nibo/8/8a/Nibo_lageplan_unterseite.png (A = IR-Abstandsreceiver)

    Der wichtigste Sensor ist logischerweise der in der Mitte. Die Daten der danaben liegenden Abstandssensoren sollen bei der Entscheidung der Drehung nach links oder rechts einbezogen werden.

    Bei solchen Aufgaben verheddert man sich empirisch schnell in immer tieferen if/else-Verschachtelungen. Ein typisches Beispiel:

    if(irco_distance[1]>=250 || irco_distance[2]>=250 || irco_distance[3]>=250
    								 || irco_distance[4]>=250 || irco_distance[5]>=250)
    			motco_setSpeed(-25,-25);
    
    		else if(irco_distance[3]>230)
    			motco_setSpeed(-15,-15);
    
    		else if(irco_distance[3]<=150)
        		motco_setSpeed(25,25);
    
    		else
    		{
        		if(irco_distance[4]<irco_distance[2]) // 4: vorne links,  2: vorne rechts
    				motco_setSpeed(-25,25); // nach links drehen
    			else if (irco_distance[4]>irco_distance[2])
    				motco_setSpeed(25,-25); // nach rechts drehen
    			else
    				motco_setSpeed(20,20); // geradeaus
    		}
    

    Frage: Wie geht man solche Sensor-Aktor-Beziehungen (hier: Sicherheitsabstand zu Objekten einhalten, aber dennoch irgendwie "vorwärts" fahren) systematisch an? Gibt es diesbezüglich ein gutes Vorbild?



  • das kingt echt interesant (btw. kann man so nen robo irgendwo fertig kaufen?).

    vom ersten blick auf deinen source, frag ich mich,
    1.wieso du bei 5 sensoren schon mit 5 indizierst und nirgens mit 0, ueberindizierst du damit nicht dein array?
    2.es waere gut wenn du die magic numbers weglassen wuerdest, also statt

    if(irco_distance[4]<irco_distance[2]) // 4: vorne links,  2: vorne rechts
    

    eher

    if(irco_distance[DIR_LEFT]<irco_distance[DIR_RIGHT])
    

    nun zu deiner frage

    wenn du das geometrisch loesen willst, berechnest du den schwerpunkt der sensoren.
    du weisst die position bzw ausrichtung der sensoren
    z.b. vorne links -1 1 (bzw -0.71,0.71 normalisiert), vorne rechts 1 1, diese vektoren multiplizierst du mit dem wert vom sensor. am ende teilst du durch die sensor anzahl und bekommst die blockierende richtung und die laenge des vectors sagt dir wie stark blokiert wird.
    ist nun der schwerpunkt y positiv, gehst du auf ne wand zu, anhand von x kannst du nun entscheiden in welche richtung du ausweichst, x<0 ist das hinderniss links, je kleiner x ist (benutze den normalisierten vektor) desto staerker musst du nach rechts abbiegen, dafuer kannst du dir eventuell ne kleine lookup-table machen.

    ich weiss dass dividieren, normalisieren usw. eventuell etwas haevy fuer die keine cpu ist, aber du wolltest es ja wissen 😉



  • ..



  • @Erhard

    Wie macht sich der Nibo auf Teppich? Beim Überfliegen bekommt man ja schon fast Lust sich so einen kleinen zu organsieren. 😉

    tt



  • Dieser Roboter ist ein wirklich interessantes Gefährt. Durch den Erweiterungsport hat man Zugang zum I²C-Bus (bis zu 400 kHz betreibbar), so dass man noch weitere Sensoren oder Erweiterungsplatinen anbringen kann. Für µC-erfahrene Progammierer nicht uninteressant. Auf Teppich läuft der Nibo auch gut. Vorne hat er einen Teflongleiter (leicht austauschbar, da geschraubt), hinten leicht austauschbare (einfach abziehen) "Truck"-Räder.



  • ..


Anmelden zum Antworten