- 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
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    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

  2. #2
    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)

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    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

  4. #4
    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);
    }
    }

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Was mir schon einmal auffällt ist das du in der while Schleife ("while(1)") "unsigned char Hindernis = false;" steht. Gehe einmal durch was das Programm macht. Normalerweise müsste sich der Roboter immer nach vorne bewegen. Du sagst vor der if Schleife immer das Hindernis falsch ist und somit wird nur der if... Zweig und nie der else Zweig ausgeführt.

    Gleichzeitig gibts du das "#define geradeaus 0" weg. Stattdessen weißt du links 0 zu und rechts 1.

    Wenn du vor dem links bzw rechtsdrehen noch zurückfahren willst kannst du so schreiben:
    Code:
    if (drehrichtung == links)
    {
    robot.motors (-100, -100); msleep(100); robot.motors (-200, 200); drehrichtung = rechts;
    }
    MfG Hannes

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Leider löst das mein Hauptproblem nicht. Der Robo dreht sich immer noch nur im Kreis...

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Kannst du mit deiner IDE simulieren? Da könntest du genau sehen wie das Programm funktioniert. Wenn du nicht simulieren kannst könntest du den Else Zweig auskommentieren und sehen was passiert.

    Das Programm sollte eigentlich passen (wenn die Limits passen).

    MfG Hannes

Ä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
  •  

Solar Speicher und Akkus Tests