www.mikrocontroller.net

Forum: Compiler & IDEs Roboter-Gegenständen ausweichen_Algorithmus


Autor: Andy S. (andy11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen Algorithmus geschrieben damit mein Roboter Gegenständen 
ausweicht.

Folgende Schritte werden wie folgt bearbeitet:

1. Fahre solange geradeaus bis Gegenstand 6cm vor dem Roboter steht.
2. Bremse, und fahre 3 Sekunden lang zurück
3. Mach eine zufällige Drehung nach links oder nach rechts
4. Fahr weiter wie vorher und starte US Messung erneut.

Der Code:
//Main-Loop:*********************************************************************
  while(1)
  {
    MotorLINKS = QuarterSpeed;
    MotorRECHTS = QuarterSpeed;
    ultraschall_StarteMessungSRF05(&PORTA, 7);
    _delay_ms(10); //Damit Messung vor der Auswertung schon Werte hat

    if(OBJEKTvorROBOTER == true)
    {
      PORTB |= MODUS_MotorenBREMSEN;

      _delay_ms(1500);

      PORTB &=~ MODUS_MotorenBREMSEN;
      PORTB |= MODUS_MotorenZUER;

      MotorLINKS = QuarterSpeed;
      MotorRECHTS = QuarterSpeed;
      _delay_ms(3000); //Rückwärtsgang einschalten für 3 Sekunge

      PORTB |= MODUS_MotorenBREMSEN;

      _delay_ms(1500);

      PORTB &=~ MODUS_MotorenBREMSEN;
      PORTB |= MODUS_MotorenVOR;

      if( (rand() % 2) > 0)   //Wenn der Rest einer Zufälligen Zahl/2 größer als 0 ist dann ist die zufällige Zahl ungerade
      {
        MotorLINKS = HalfSpeed;
        MotorRECHTS = OFF;
      }
      else          //Wenn gerade dann andere Richtung
      {
        MotorLINKS = OFF;
        MotorRECHTS = HalfSpeed;
      }

      _delay_ms(2000); // Drehe Roboter 2 Sekunden Lang in Zufällige Richtung

    }
  }
  //back***************************************************************************

Da ich diesen Algorithmus noch nicht austesten kann habe ich ihn 
reingestellt damit ich mögliche Denkfehler jetzt schon korrigieren kann 
falls jemand einen findet.

Ich bin jedem dankbar der mir hilft.

lg andy

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy S. schrieb:
> 1. Fahre solange geradeaus bis Gegenstand 6cm vor dem Roboter steht.
> 2. Bremse, und fahre 3 Sekunden lang zurück
> 3. Mach eine zufällige Drehung nach links oder nach rechts
> 4. Fahr weiter wie vorher und starte US Messung erneut.

Wenn du sowieso US verwendest, warum fährst du überhaupt so nah an das 
Hindernis heran, dass du wieder zurückfahren musst?
:-)

Autor: Andy S. (andy11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Wenn du sowieso US verwendest, warum fährst du überhaupt so nah an das
> Hindernis heran, dass du wieder zurückfahren musst?

Das soll am Tag der offenen Tür junge Hauptschüler beeindrucken und 
ihnen helfen sich für einen Zweig zu entscheiden. Außerdem gibt es für 
solche Sachen ja keinen Wettbewerb, da wirds beim Linienverfolgen mit 
Ausweichmodus schon interessanter. Da muss ich aber dann nahe abmessen, 
da zu lang dann Probleme mit Tunneln macht wo die linie vorher in die 
Kurve geht. (Robot-Challenge)

lg andy

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//Rückwärtsgang einschalten für 3 Sekunden

Und Du bist sicher, dass dort niemand steht?

Autor: Andy S. (andy11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
StinkyWinky schrieb:
> Und Du bist sicher, dass dort niemand steht?

Ok, aber von der Idee her spricht einmal nichts dagagen oder Bugs (wie 
zB dass der irgendwie hängen bleibt) sind nach meiner Überlegung weniger 
möglich.

lg andy

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy S. schrieb:
> StinkyWinky schrieb:
>
>> Und Du bist sicher, dass dort niemand steht?
>
>
>
> Ok, aber von der Idee her spricht einmal nichts dagagen

Ich nehme an StinkyWinky dachte an folgende Situation:

Du fährst in einen breiten, am Ende verschlossenen Tunnel. Vor dem Ende 
bleibst Du stehen und fährst zurück. Dann drehst Du um 90°. Da Du nun 
sofort (je nach breite des Tunnels) eine Hindernis hast, wird das 
Rückwärtsfahren nicht gehen...

Was macht Dein Algo in diesem Fall ?

VG

Marc

Autor: Andy S. (andy11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UBoot-Stocki schrieb:
> Was macht Dein Algo in diesem Fall ?

Also das ist eig kein richtiger Algo, sondern nur Schritterlweises 
vorgehen (vom Konzept her ganz einfach).

>Vor dem Ende
> bleibst Du stehen und fährst zurück. Dann drehst Du um 90°. Da Du nun
> sofort (je nach breite des Tunnels) eine Hindernis hast, wird das
> Rückwärtsfahren nicht gehen...

Mhm dann bräuchte ich jetzt nen Sensor für hinten.
Ok dann fahre ich weniger nach hinten.
while(cancel_mode == false)  //Solange bis auf cancel_mode taste gedrückt wird
    //mache den Ausweichmodus
  {
    MotorLINKS = QuarterSpeed;
    MotorRECHTS = QuarterSpeed;
    ultraschall_StarteMessungSRF05(&PORTA, 7);
    _delay_ms(10); //Damit Messung vor der Auswertung schon Werte hat

    if(OBJEKTvorROBOTER == true)
    {
      bremseMotoren();

      PORTB |= MODUS_MotorenZUER;

      MotorLINKS = QuarterSpeed;
      MotorRECHTS = QuarterSpeed;
      _delay_ms(1000); //Rückwärtsgang einschalten für 1,5 Sekunden

      bremseMotoren();

      PORTB |= MODUS_MotorenVOR;

      if( (rand() % 2) > 0)   //Wenn der Rest einer Zufälligen Zahl/2 größer als 0 ist dann ist die zufällige Zahl ungerade
      {
        MotorLINKS = HalfSpeed;
        MotorRECHTS = OFF;
      }
      else          //Wenn gerade dann andere Richtung
      {
        MotorLINKS = OFF;
        MotorRECHTS = HalfSpeed;
      }

      _delay_ms(2000); // Drehe Roboter 2 Sekunden Lang in Zufällige Richtung

    }
  }
  //back***************************************************************************

Danke für den Hinweis.

lg andy

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessant, dass du immernoch nichts über Zustantsautomaten gelernt 
hast und stattdessen immer noch mit delay(6Monate) Ablaufketten 
bastelst.

Autor: Andy S. (andy11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Interessant, dass du immernoch nichts über Zustantsautomaten gelernt
> hast und stattdessen immer noch mit delay(6Monate) Ablaufketten
> bastelst.

Ich glaube zu wissen was du meinst.
Könntest du mir trotzdem ein Beispiel geben?

PS: Alle meine Interrupts sind besetzt, incl timer und in meine ISRs da 
noch abfragen zu programmieren würde das gesamte Programm das 
mittlerweile aus 20 .c Datein besteht sehr unübersichtlich, außerdem 
kommt noch der Debug Modus, der das ganze nochmal um einiges fetter 
macht, da ist es schwer die Übersicht zu behalten, aber deswegen auch 
reichlich auskommentiert und siehe da nach 4 Tagen weiß ich noch genau 
wie jede Zeile funktioniert

lg andy

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Mir stellt sich die Frage wieso des Ding überhaupt rückwärts fahren 
muss. Kannst du den Roboter nicht einfach "Wenden" lassen, so das er in 
die gleiche Richtung zurückfährt aus der er gekommen ist? Dann hättest 
du das Problem mit den US für hinten vom Tisch.
Wie bestimmst du eigentlich die Geschwindigkeit von dem Ding? Mit 
Schlitzscheiben und Lichtschranken? Dann könntest du dir das mit den 
delays auch sparen. Du musst dann für die zufällige Richtungsänderung 
einfach nur eine zufällige ganze Zahl bestimmen, deren Betrag der Anzahl 
der Schlitze, die du mitzählst entspricht. Das Vorzeichen kann ja dabei 
einer Drehrichtung entsprechen. Beispielsweise '-' für Links und '+' für 
Rechts. Im c't-Bot wurde die Geschwindigkeit auch über Schlitzscheiben 
ermittelt. Du kannst dir ja mal angucken, wie die das gemacht haben.

-bla-

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.