Die einfachste Methode ist, das Rechtsabbiegen mitzählen. Nach vier mal rechts kommt man wahrscheinlich wieder zum ersten mal rechts. Dann entweder gerade aus fahren oder links. Sollte sich programmtechnisch leicht lösen lassen.
Hi,
ich will mit meinem Freund eine Asuro so programieren, dass er durch ein Labyrinth findet. Das Labyrinth hat mehrere Wege und die Rechte-hand-Methode kann nicht angewand werden, da es passieren kann,dass er nurnoch im Kreis fährt.
Der Freund hatte die Idee, dass man den Robo ein Koordinatensystem anlegen lassen soll. Doch dies ist führ zwei absolute C anfänger sehr schwer, auserdem kann der Robo keine Strecken messen und der Speicher ist nicht groß genug.
Vieleicht könntet ihr mir ein Paar Anregungen geben.
Danke
Die einfachste Methode ist, das Rechtsabbiegen mitzählen. Nach vier mal rechts kommt man wahrscheinlich wieder zum ersten mal rechts. Dann entweder gerade aus fahren oder links. Sollte sich programmtechnisch leicht lösen lassen.
Hallo!
@ µcFlo
Am einfachsten ist sich immer entlang einer Wand zu bewegen (siehe dazu: http://de.wikipedia.org/wiki/L%C3%B6...n_Gaston_Tarry .
Geändert von PICture (29.04.2012 um 21:06 Uhr)
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Hier gibt es was :
http://ornella.iwr.uni-heidelberg.de...Y/D/index.html
Könnte genau das sein was Du suchst
Moin µcFlo,
Ein Koordinatensystem ist für ein Labyrinth zu viel. I.Allg. braucht man das nicht, weil Du nur den Zusammenhang zwischen zwei Punkten im Labyrinth brauchst; also z.B. von Kruezung 12 geht's zu Kreuzung 14 und Kreuzung 23, etc. Such mal mit der Suchmaschine Deines Vertrauens (meine ist nicht google ) nach "Backtracking" oder "Tiefensuche".
viele Grüße
Andreas
#define true ('/'/'/')
#define false ('-'-'-')
Danke an alle die geantwortet haben, ich werde mir die verschieden Tipps mal zu Gemüte führen.
Danke
Du kannst einen rekursiven Labyrinthalgorithmus verwenden, der ist relativ leicht zu implementieren, sofern du weisst wie Rekursion funktioniert. Da du sagst dass du dich in C wenig auskennst, nehme ich an dass du auch nicht weisst wie man Rekursionen verwenden kann. Also informiere dich vielleicht erstmal was Rekursion bedeutet und wo/wie man es einsetzt.
Kurz zur Erklärung: Die Idee ist es das Labyrinth als Spielfeld(2D-Array) anzulegen und alle möglichen Wege(Nord/Süd/Ost/West) durchzulaufen und auf jedem Feld eine Markierung(im 2D-Array) zu hinterlassen, das solange bis du dein gewünschtes Ziel erreicht hast.
Allerdings weiss ich nicht ob Rekursionen auf deinem µC erlaubt/möglich sind und ob der Speicherplatz dafür reicht. Sollte das nicht der Fall sein könntest du z.B.: alle Berechnungen auf einem PC durchführen lassen und beide über eine Schnittstelle(WLAN, etc.) kommunizieren lassen.
Hier noch ein Link der dir vielleicht hilft: http://www.cs.bu.edu/teaching/alg/maze/
Hi,
Ich will den ASURO mithilfe der Taster durch ein einfaches Labyrinth führen. Dazu will ich ihn so programmieren, dass er zunächst immer gerade aus fährt bis er gegen eine Wand fährt und die Taster gedrückt werden. Anschließend soll er dann ein kleines Stück rückwärts fahren und sich um 90 grad in die eine Richtung drehen. Stößt er dann nicht erneut gegen eine Wand soll er gerade aus weiterfahren; andernfalls soll er sich wieder um 180 grad zurück drehen und seine fahrt fortsetzen. Da ich aber im Programmieren ein Anfänger bin, fällt mir das sehr schwer. Kann mir jemand von euch vielleicht einen grundsätzlichen Ansatz für diese Problematik nennen. Mir geht es dabei weniger um die exakte Drehung um 90 grad, sondern vielmehr um die Umsetzung dieses Algorithmus programmtechnisch
Liebe Grüße Philipp
Hallo,
kenne mich leider nicht mit dem ASURO aus aber ein einfacher algorithmischer Ansatz in Pseudocode könnte etwa so aussehen:
Was für einen Sensor zum entdecken der Wand benutzt du genau, ich nehme an sowas in der Art ?Code:Fahren(vorwärts, 999); //fahre vorwärts für 999 sekunden while(1){ //tue das unendlich (bzw hier könnte die Bedingung reinkommen wann er das Zeil erreicht hat) if(Taster == 1){ //Wand entdeckt! Fahren(rückwärts,1); //fahre rückwärts für 1 sekunde Drehen(90); //90° drehung Fahren(vorwärts, 1); //fahre vorwärts für 1 sekunde (um zu prüfen ob noch eine wand da ist) if(Taster == 1){ //2. wand entdeckt! -> umdrehen Fahren(rückwärts,1); Drehen(180); Fahren(vorwärts, 999); } } }
Hallo
Das return() befindet sich innerhalb der deshalb nicht mehr endlosen while-Schleife:
Ich würde es vielleicht so formulieren:Code:#include "asuro.h" int grad=0; int main(void) { Init(); while(1) { if(PollSwitch()==0) { MotorDir(FWD,FWD); MotorSpeed(100,100); } else if(PollSwitch()!=0) { if(grad==0) { MotorDir(FWD,FWD); MotorSpeed(100,0); Msleep(200); grad = 1 ; } } else if(PollSwitch()!=0 && grad==1) { if(grad==1) { MotorDir(FWD,FWD); MotorSpeed(0,100); Msleep(400); grad = 0 ; } } return 0; } }
(ungetestet)Code:#include "asuro.h" int grad=0; int main(void) { Init(); while(1) { if(PollSwitch()==0) { StatusLED(GREEN); MotorSpeed(100,100); } else { if(grad==0) { StatusLED(RED); MotorSpeed(100,0); Msleep(200); grad = 1; } else { StatusLED(YELLOW); MotorSpeed(0,100); Msleep(400); grad = 0; } } } return 0; }
Der Ansatz erscheint mir etwas zu einfach.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen