- 12V Akku mit 280 Ah bauen         
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
    Wow danke, das hilft mir schon nen ganzes Stück weiter. Nur ein Problem hab ich:

    Wenn der Robo die Linksdrehung gemacht hat, fährt der bei deinem Code plötzlich rückwärts weiter. Das kann ich nicht ganz nachvollziehen. Kannst du mir da helfen?

    PS: "mitt" sollte ein Infrarotsensor sein, den ich zwischendrin eingebaut hatte, aber nicht funktionierte und daher wieder rausstrich(der muss aber noch rein!)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    Zitat Zitat von timmy19 Beitrag anzeigen
    Wenn der Robo die Linksdrehung gemacht hat, fährt der bei deinem Code plötzlich rückwärts weiter. Das kann ich nicht ganz nachvollziehen.
    Das kann ich auch nicht nachvollziehen... Es ist ja gar kein "robot.motors(xxx,yyy);" mit zwei negativen Werten im Programm drin

    [EDIT]
    Kann es sein, dass es sich bei deinem Robo um diesen hier handelt: http://en.wikipedia.org/wiki/Qfix_robot_kit ?
    Das Umfahren von Hindernissen ist nämlich mit mehreren Abstandssensoren deutlich einfacher/zuverlässiger..
    Geändert von -schumi- (30.12.2013 um 13:17 Uhr)

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Seltsam. Hab es jetzt mal anders gemacht, nämlich ihn manuell geradeaus fahren lassen, nicht mit dem Befehl "drehrichtung = geradeaus", dann klappt es komischerweise. Die Technik ist manchmal verwirrend.

    Ja, der Roboter ist es. Wir sollen das Hindernisumfahren aber mit einem Infrarotsensor regeln, denn wir haben ein Boden, der eingefärbt ist(dunkel zu hell zu dunkel). Zudem ist die Seitenbegrenzung nicht so hoch, dass man sie mit dem Ultraschall sehen könnte.

    Nun meine weitere Frage: Glaubt ihr, der folgende Code könnte im Prinzip funktionieren? Mein Problem war bisher, dass sich der Robo nur gedreht hat, da er sich beim dunklen Boden drehen sollte. Aber eigentlich wollte ich das erst, nachdem er das erste Hindernis entdeckt, die Drehung gemacht und richtung "freier" Seite gefahren ist. Wie kann ich das schreiben, sodass er sich nicht "verwirren" lässt?

    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        75
    #define freieSicht        120 // 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() 
    {
        int abstand=0;
    	//int infrarot= 0;
        unsigned char drehrichtung = geradeaus;    // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
        unsigned char schonNachLinksAusgewichen = False;    
      
        while(1)
        {
            abstand   = robot.analog(1);
    		//infrarot  = robot.analog(3);
            if( drehrichtung == geradeaus)
            {
                robot.motors(-250,-250); //geradeaus fahren
                if( abstand < hindernis)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
                robot.motors(-200, 200); // nach links drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(250,250)
                    schonNachLinksAusgewichen = True;
    				//msleep(500);
    				//if( infrarot > 185){
    				//robot.motors(100,-100);
    				//msleep(500);
    				
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(200, -200); // nach rechts drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(250,250)
                    schonNachLinksAusgewichen = False; 
    				//msleep(500);
    				//if( infrarot > 185){
    				//robot.motors(-100,100);
    	
    			// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
    			
    			
    			
    			
    			
    			}  
    		}		  
    	}	
    
    }

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.094
    Ich würde es in etwa so machen (nur die while Schleife als Pseudocode):

    Code:
    while(1)
    {
    Lese Ultraschall if (Ultraschall < Limit) {
    Hinderniss = true
    }
    if (Hinderniss == false) {
    Motoren (200,200)
    } else {
    if (drehung == links) {
    Motoren (-200, 200) drehung = rechts
    } else {
    Motoren (200, -200) drehung = links
    } Lese Linie if (Linie < Limit) {
    Hinderniss = false
    }
    }
    }
    Du musst vermutlich noch ein Delay (msleep) einfügen.

    MfG Hannes
    Geändert von 021aet04 (02.01.2014 um 19:07 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Wie geht das "Lese" ?

    Mir fehlt derzeit eigentlich nur noch der Infrarotsensor, also das von dir beschriebene "Lese Linie".... nur wie geht das? Der Rest klappt soweit.

    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() 
    {
        int abstand=0;
    	//int infrarot= 0;
        unsigned char drehrichtung = geradeaus;    // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
        unsigned char schonNachLinksAusgewichen = False;    
      
        while(1)
        {
            abstand   = robot.analog(1);
    		//infrarot  = robot.analog(3);
            if( drehrichtung == geradeaus)
            {
                robot.motors(-250,-250); //geradeaus fahren
                if( abstand < hindernis)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
                robot.motors(-200, 200); // nach links drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(250,250);
    				msleep(500);
                    schonNachLinksAusgewichen = True;
    				//msleep(500);
    				//if( infrarot > 185){
    				//robot.motors(100,-100);
    				//msleep(500);
    				
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(200, -200); // nach rechts drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(250,250);
    				msleep(500);
                    schonNachLinksAusgewichen = False; 
    				//msleep(500);
    				//if( infrarot > 185){
    				//robot.motors(-100,100);
    	
    			// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
    			
    			
    			
    			
    			
    			}  
    		}		  
    	}	
    
    }

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.094
    "Lese Linie" wäre bei dir "infrarot = robot.analog(3);", "Lese Ultraschall" wäre "abstand = robot.analog (1);"

    MfG Hannes

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Danke dir.
    Das Delay(msleep) muss NACH dem Infrarot oder davor? Hab es derzeit davor. Also 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 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() 
    {
        int abstand=0;
        unsigned char drehrichtung = geradeaus;    // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
        unsigned char schonNachLinksAusgewichen = False;    
      
        while(1)
        {
            abstand   = robot.analog(1);
    		
            if( drehrichtung == geradeaus)
            {
                robot.motors(-250,-250); //geradeaus fahren
                if( abstand < hindernis)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
                robot.motors(-200, 200); // nach links drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(250,250);
    				msleep(500);
                    schonNachLinksAusgewichen = True;
    				
    				infrarot  = robot.analog(3);
    				
    				//msleep(500);
    				if( infrarot > 185){
    		        robot.motors(100,-100);
    				int infrarot = 0;
    				
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(200, -200); // nach rechts drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(250,250);
    				msleep(500);
                    schonNachLinksAusgewichen = False; 
    				
    				infrarot  = robot.analog(3);
    				
    				//msleep(500);
    				if( infrarot > 185){
    				robot.motors(-100,100);
    				int infrarot = 0;
    				
    	
    			// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
    			
    			
    			
    			
    			
    			}  
    		}		  
    	}	
    
    }
    Edit: Der Robo möchte einfach nicht auf das infrarot reagieren. Alles andere macht er jetzt, nur das Infrarot nicht. Was mach ich um Himmels willen falsch? Ich verzweifle...
    Und noch was: Komischerweise fährt der Robo immer auf das Hindernis zu, dreht sich kurz zuvor und bleibt dann mit dem rechten Rad etwas hängen, dreht sich aber weiter. Das macht er, egal wie ich "Hindernis" und "freie Sicht" verändere. Woran liegt das und wie kann ich das ändern(also, dass er sich schon früher dreht)?
    Geändert von timmy19 (03.01.2014 um 12:58 Uhr)

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. Antworten: 2
    Letzter Beitrag: 15.06.2011, 21:18
  3. LPC1114 (Cortex M0): "sei()" und "cli()"
    Von Jaecko im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 1
    Letzter Beitrag: 02.07.2010, 12:25
  4. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02
  5. 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
  •  

LiFePO4 Speicher Test