Roboter-Gegenständen ausweichen_Algorithmus

OP #1871630
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
Gast #1871647
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?
:-)
OP #1871674
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
Gast #1872649
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
OP #1872860
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
OP #1873067
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
Gast #1873260
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren