Forum: Compiler & IDEs Roboter-Gegenständen ausweichen_Algorithmus


von Andy S. (andy11)


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:
1
//Main-Loop:*********************************************************************
2
  while(1)
3
  {
4
    MotorLINKS = QuarterSpeed;
5
    MotorRECHTS = QuarterSpeed;
6
    ultraschall_StarteMessungSRF05(&PORTA, 7);
7
    _delay_ms(10); //Damit Messung vor der Auswertung schon Werte hat
8
9
    if(OBJEKTvorROBOTER == true)
10
    {
11
      PORTB |= MODUS_MotorenBREMSEN;
12
13
      _delay_ms(1500);
14
15
      PORTB &=~ MODUS_MotorenBREMSEN;
16
      PORTB |= MODUS_MotorenZUER;
17
18
      MotorLINKS = QuarterSpeed;
19
      MotorRECHTS = QuarterSpeed;
20
      _delay_ms(3000); //Rückwärtsgang einschalten für 3 Sekunge
21
22
      PORTB |= MODUS_MotorenBREMSEN;
23
24
      _delay_ms(1500);
25
26
      PORTB &=~ MODUS_MotorenBREMSEN;
27
      PORTB |= MODUS_MotorenVOR;
28
29
      if( (rand() % 2) > 0)   //Wenn der Rest einer Zufälligen Zahl/2 größer als 0 ist dann ist die zufällige Zahl ungerade
30
      {
31
        MotorLINKS = HalfSpeed;
32
        MotorRECHTS = OFF;
33
      }
34
      else          //Wenn gerade dann andere Richtung
35
      {
36
        MotorLINKS = OFF;
37
        MotorRECHTS = HalfSpeed;
38
      }
39
40
      _delay_ms(2000); // Drehe Roboter 2 Sekunden Lang in Zufällige Richtung
41
42
    }
43
  }
44
  //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

von Floh (Gast)


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?
:-)

von Andy S. (andy11)


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

von StinkyWinky (Gast)


Lesenswert?

//Rückwärtsgang einschalten für 3 Sekunden

Und Du bist sicher, dass dort niemand steht?

von Andy S. (andy11)


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

von UBoot-Stocki (Gast)


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

von Andy S. (andy11)


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.
1
while(cancel_mode == false)  //Solange bis auf cancel_mode taste gedrückt wird
2
    //mache den Ausweichmodus
3
  {
4
    MotorLINKS = QuarterSpeed;
5
    MotorRECHTS = QuarterSpeed;
6
    ultraschall_StarteMessungSRF05(&PORTA, 7);
7
    _delay_ms(10); //Damit Messung vor der Auswertung schon Werte hat
8
9
    if(OBJEKTvorROBOTER == true)
10
    {
11
      bremseMotoren();
12
13
      PORTB |= MODUS_MotorenZUER;
14
15
      MotorLINKS = QuarterSpeed;
16
      MotorRECHTS = QuarterSpeed;
17
      _delay_ms(1000); //Rückwärtsgang einschalten für 1,5 Sekunden
18
19
      bremseMotoren();
20
21
      PORTB |= MODUS_MotorenVOR;
22
23
      if( (rand() % 2) > 0)   //Wenn der Rest einer Zufälligen Zahl/2 größer als 0 ist dann ist die zufällige Zahl ungerade
24
      {
25
        MotorLINKS = HalfSpeed;
26
        MotorRECHTS = OFF;
27
      }
28
      else          //Wenn gerade dann andere Richtung
29
      {
30
        MotorLINKS = OFF;
31
        MotorRECHTS = HalfSpeed;
32
      }
33
34
      _delay_ms(2000); // Drehe Roboter 2 Sekunden Lang in Zufällige Richtung
35
36
    }
37
  }
38
  //back***************************************************************************

Danke für den Hinweis.

lg andy

von Klaus (Gast)


Lesenswert?

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

von Andy S. (andy11)


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

von bla (Gast)


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-

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.