- Reichelt Elektronik    Werbung      
Ergebnis 1 bis 10 von 52

Thema: "Hindernisfahrt"

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Also bisher macht der Robo folgendes:

    Er fährt geradeaus, bis er das Hindernis erkennt. Leider erkennt er dieses erst minimal davor, sodass er bei der Linksdrehung mit dem Rechten Rad hängenbleibt.
    Das Problem ist: Wenn ich den Wert des "Hinderniserkennens" erhöhe, erkennt er plötzlich NICHTS mehr und fährt gegen das Hindernis. Wo liegt dabei das Problem und wie bekomme ich es hin, dass er das Hindernis früher erkennt? Ein Messgerät habe ich leider nicht.

    Desweiteren hab ich nun was ausprobiert: Nachdem er linksgedreht hat, hab ich mal ein weiteres Hindernis hingestellt. Eigentlich sollte er nun ja rechtsdrehen, aber er dreht erneut links. Wo liegt nun hier das Problem?

    Und wie soll ich das mit dem If-Else machen? versteh ich leider nicht ganz, vllt. kannst du mir das noch etwas genauer erklären.

    ______

    Ja genau, er sollte geradeaus fahren, dann, wenn er das Hindernis erkennt nach links drehen. Nun soll er soweit nach links fahren, bis der Boden wieder eine bestimmte Farbe annimmt(etwa Wert 185, gemessen in der Schule), sich nun wieder rechts drehen und geradeaus auf das nächste Hindernis fahren. Dort nun das ganze in umgekehrter Richtung wieder durchführen. Verstanden? Leider scheitere ich schon an der ersten Rechtsdrehung mit Infrarot.

    Wäre euch sau dankbar, wenn ich mir da noch den ein oder anderen Tipp geben könntet, wie ich das weiter lösen könnte.

    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    
    
    const    int SENSOR3 = 3;
            int SENSOR1 = 1;
            int SENSOR2 = 2;
            int SENSOR = 0;
    
    MiniBoard robot;
    LCD lcd;
    
    #define geradeaus        0
    #define linksDrehung    1
    #define rechtsDrehung    2
    
    #define hindernis        85
    #define freieSicht       150 // Wenn der Robo etwas nach links fährt, aber dann gegen das Hindernis, ist dieser Wert zu klein
    
    #define True            1
    #define False            0
    
    int main() 
    {
       
    	unsigned char drehrichtung = geradeaus;    // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
        unsigned char schonNachLinksAusgewichen = False;    
      
        while(1)
        {
            int abstand   = robot.analog(1);
    		int infrarot  = robot.analog(3);
    		
            if( drehrichtung == geradeaus)
            {
                robot.motors(100,100); //geradeaus fahren
                if( abstand < 85)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
                robot.motors(-100, 100); // nach links drehen
    			msleep(300);
                if( abstand >= 120)
                {
                    robot.motors(100,100);
    				msleep(280);
    				schonNachLinksAusgewichen = True;
    				
    				msleep(1500);
    				if( infrarot > 185){
    		        robot.motors(100,-100);
    				
    				
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(200, -200); // nach rechts drehen
                if( abstand >= 120 )
                {
                    robot.motors(100,100);
    				msleep(280);
                    schonNachLinksAusgewichen = False; 
    				
    				int infrarot  = robot.analog(3);
    				
    				msleep(1500);
    				if( infrarot > 185){
    				robot.motors(-100,100);
    				
    				
    	
    			// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
    			
    			
    			
    			
    			
    			}  
    		}		  
    	}	
    
    }	
    }
    }

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    Du prüfst in deinem Programm auf geradeaus, linksdrehung und rechtsdrehung. Ich würde aber zuerst einmal nur prüfen ob du geradeausfährst oder ausweichen musst.

    Also nur die while Schleife. Die Variable musst du vorher initialisieren. Vor der While Schleife "int abstand",... Dann brauchst du die Variable nur verwenden.

    Code:
    while(1)
    {
    abstand = robot.analog (1); if (abstand < 85) {
    Hindernis = true;
    } if (Hindernis == false) {
    robot.motors (-250, -250);
    } else {
    if (Drehrichtung == links) {
    robot.motors (200, -200); Drehrichtung = rechts;
    } else {
    robot.motors (-200, 200); Drehrichtung = links;
    } infrarot = robot.analog (3); if ( infrarot < 85) {
    Hindernis = false;
    }
    } msleep(500);
    }
    Das Programm sollte so funktionieren. Was hast du als Hindernis genommen. Je nach Objekt könnte es Probleme geben. Glatte Objekte (z.B. Bücher) 90° zum Sensor ist optimal, sollte auch nicht zu klein sein. Flaschen o.Ä. ist nicht optimal, da eigentlich nur die Fläche den Schall Richtung Sensor wirft der 90° zum Sensor steht.

    Hast du Leds die du ansteuern kannst? So kannst du die Messwerte testen die vom Sensor kommen, du könntest auch die Motoren nehmen. Sensorwert direkt an den Motor geben.

    Code:
    i = robot.analog (1);
    robot.motors (i, 0);
    msleep(300);
    Am Besten wäre es dann wenn du den Roboter anheben kannst und ein Objekt vom oder zum Sensor bewegst. Dann sollte sich die Motordrehzahl ändern.

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Klingt im Prinzip völlig verständlich. Nur hab ich nun dasselbe Problem wie am Anfang: Der Robo macht nichts außer 2 cm vor und dann wieder zurück zufahren(also so nen ruckeln). Nach einer kleinen Änderung macht er immerhin die linksdrehung. Also muss das am "Geradeausfahren" liegen. Aber wo ist da der fehler?

    Letztes Mal lag es irgendwie an der Else-Steuerung. Wie kann es ich schaffen, dass ich die Else-Steuerung nutzen kann, ohne das dieser "Fehler" auftritt? Hast du da ne Ahnung?

    Edit: Warum erkennt der Robo meine Hand als Hindernis und dreht sich dann perfekt, aber jede andere Sache erkennt er nicht oder zu spät? Ich verzweifle... :/
    Geändert von timmy19 (05.01.2014 um 12:50 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    Du könntest versuchen das msleep zu verlängern.

    Ich vermute das das so abläuft:
    Das Hindernis wird erkannt, der Roboter dreht, fährt nach vor und erkennt das Objekt erneut, weicht wieder aus, fährt wieder nach vor erkennt das Hindernis wieder,....

    Somit würde sich das ruckeln erklären.

    Wie ich oben schon gefragt habe was nutzt du als Hindernis?

    Was du auch noch machen kannst das wäre das "abstand = robot.analog(1);" und die "if (abstand < 85)" Schleife in den "if (Hindernis == false)" Zweig geben.

    Du kannst auch versuchen ein komplettes Ausweichmanöver ins Programm zu integrieren. Z.B. Wenn Hindernis erkannt Abstandsmessung abschalten, fahre zurück, drehe seitlich, fahre vor, wenn neben dem Hindernis Abstandsmessung einschalten.

    MfG Hannes

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Der Ruckelt auch nur so rum, wenn gar kein Hindernis in Sicht ist.

    _______

    Meinst du es etwa so?(nur der if(Hindernis==false)-Pfad)

    Code:
    if (Hindernis == false)
    {
    Drehrichtung = geradeaus;
    }
    else
    {
    if (abstand < 85)
    {
    Hindernis = true;
    Drehrichtung = links;
    robot.motors (200, -200);
    Drehrichtung = rechts;
    }
    else
    {
    robot.motors (-200, 200);
    Drehrichtung = links;
    }
    Dann dreht der Robo sich nur nach links, auch wenn kein Hindernis in Sicht ist.

    Zu den Hindernissen: Ich benutzte 2 glatte Schachteln, etwa 15 cm hoch und 30 cm lang, bei beiden die selbe Reaktion, jeweils erst kurz vorher wird das Hindernis erkannt. Bei meiner Hand ist das komplett anders, da dreht er sich früh genug

    Wie meinst du das mit einem kompletten Ausweichmanöver? Kann mir gar nicht vorstellen, wie ich das schreiben sollte...(weiß z.B. gar nicht wie man die Messung ausschaltet, vllt. kannst mir ja kurz nen kleines Bsp. geben)

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    Das Programm sieht nicht annähernd so aus wie das was ich gescchrieben habe. Bei dir steht im "if (Hindernis == false)" Zweig "Drehrichtung = geradeaus;" bei mir steht "robot.motors (-250, -250);". "Drehrichtung = geradeaus;" habe ich gar nicht.

    Du hast das "if (abstand < 85)" in den else Zweig gegeben. Ich habe geschrieben das das in den "if (Hindernis == false)" Zweig soll.

    Poste einmal das Programm als *.c Datei (Datei hochladen).

    Einen Sensor ausschalten kannst du nicht, das war schlecht ausgedrückt. Du überprüfst den Sensor einfach nicht (du lässt das "abstand = robot.analog(1);" einfach weg.

    Das Ausweichmanöver kannst du später hinzufügen. Hast du schon die Entfernung getestet so wie ich es im Post 18 geschrieben habe?

    MfG Hannes

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Ach du meine Güte, sorry. Hab das komplett falsch verstanden und geändert. Aber auch nachdem ich es geändert habe, dreht sich der Robo einfach nur linksherum.
    Tut mir leid, aber meine Datei ist ne cc und die kann man hier scheinbar nicht hochladen...

    Ich habe leider kein LED, dementsprechend kann ich auch keine Werte messen, das hatten wir schon in der Schule gemacht.

    ____
    Achso, jetzt versteh ich, soweit bin ich aber glaub noch nicht, dass ich das könnte. Wie man denke ich merkt, bin ich blutiger Anfänger.

    Da ich es nicht hochladen kann, hier mal der Code so:

    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    
    
    const    int SENSOR3 = 3;
            int SENSOR1 = 1;
            int SENSOR2 = 2;
            int SENSOR = 0;
    
    MiniBoard robot;
    LCD lcd;
    
    #define geradeaus        0
    #define links		    1
    #define rechts          2
    
    #define hindernis        85
    #define freieSicht       150 // Wenn der Robo etwas nach links fährt, aber dann gegen das Hindernis, ist dieser Wert zu klein
    
    #define True            1
    #define False            0
    
    int main() 
    {
       
    	unsigned char Drehrichtung =  geradeaus; // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
    	int abstand = robot.analog(1);
    	int infrarot = robot.analog(3);
      
        while(1)
    {
    unsigned char Hindernis = false ;
    
    if (Hindernis == false)
    {
    abstand = robot.analog (1);
    robot.motors(250,250);
    if(abstand < 85)
    {
    Hindernis = true;
    }
    }
    else
    {
    if(Drehrichtung == links)
    {
    
    robot.motors (200, -200);
    Drehrichtung = rechts;
    }
    else
    {
    robot.motors (-200, 200);
    Drehrichtung = links;
    }
    
    infrarot = robot.analog (3);
    
    if ( infrarot < 85)
    {
    Hindernis = false;
    }
    }
    msleep(500);
    }
    }

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. LPC1114 (Cortex M0): "sei()" und "cli()"
    Von Jaecko im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 1
    Letzter Beitrag: 02.07.2010, 12:25
  3. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02
  4. ASM: was machen "swap" und "cbr" genau?
    Von RHS im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.08.2004, 17:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      LiFePO4 Speicher Test