wernerlicious
21.10.2009, 21:30
Guten Abend,
da ich mich mittlerweile mit der Standard Lib zufrieden gegeben habe und versuche alles darauf aufzubauen, bin ich (mal wieder) auf ein Problem gestoßen.
Ich versuche folgendes zu realisieren:
1. Mein Asuro soll auf einem Tisch geradeaus fahren.
2. Beim Losfahren soll er die momentanen Linedata[0] und [1] speichern
(aber nur die momentanen, da jeder Tisch unterschiedlich ist).
3. Kommt er zur Tischkante, macht er Halt,
4. fährt 100mm zurück,
5. dreht sich um 90° rechts um seine eigene Axe herum
6. und fährt dann rückwärts weiter oder so ähnlich
Bereits durchgeführte Umbauten:
Odometrie Sensor mit einer kleinen Karton Konstruktion vom Umgebungslicht abgeschirmt,
und die Zahnräder mit einer Unterlegscheibe (fast) ruckel frei gemacht.
Zuallerletzt die Axen geschmiert .
Erste programmierungstechnische Ideen:
Zu 1.
(ich weiß es gibt mit Sicherheit weit aus bessere Möglichkeiten das Geradeaus fahren zu realisieren, aber ich bin immer noch ein Anfänger und war echt stolz beim entwickeln dieses Programms) :
MotorDir(FWD,FWD);
while(1)
{ OdometrieData(data);
if (data [0] == data [1] )
{MotorSpeed(100,100);}
else if (data [0] > data [1] )
{MotorSpeed(100,120);}
else if (data [0] < data [1] )
{MotorSpeed(120,100);} }
Zu 2. :
Ich habe absolut keine Ahnung, wie ich solch eine Funktion in das Programm einbeziehen könnte.
Als Variable habe ich mir „a“ gedacht.
„Linedata[2] = a“ geht ja wohl nich, da sich die Daten immer ändern.
Zu 3. :
Ich wollte den im Punkt 2. Ermittelten Anfangs Wert nutzen um eine Anweisung zu erstellen die etwa so lauten könnte:
if (data [0], data [1] < a )
MotorDir(BREAK,BREAK);
else
„weiter gerade aus fahren aus Punkt 1"
Zu 4.
(Ich wollte die Wegmessung benutzen, und nich eine beliebige Zeit)
Ich habe mir auf dieser Seite Anregungen geholt:
http://www.cs.hs-rm.de/~linn/vpdv07/asuro3/asuro-website/files/position.html
Ich habe die 12er Musterscheibe drauf, also entspricht wohl folgendes:
U des Reifen = 120mm
120mm / 5 = 24mm
24mm / 12 = 2mm
100mm / 2mm = 50
Sprich, pro Hell-Dunkel-Übergang bewegt sich ein Rad um 2mm und um auf eine zurückgelegte Strecke von 100mm zu kommen bräuchte ich 50 Hell-Dunkelübergänge.
Da beide Musterscheiben (ungefähr) gleich schnell drehen, brauch ich ja nur eine zu kontrollieren theoretisch oder? Wo ich auch schon beim Problem bin.
Um genau das in die Tat umzusetzen habe ich nämlich ungefähr an so etwas gedacht:
„fährt rückwärts“
for ( b=0 ; b < = 50; b++)
{ ????Hell-Dunkel-Übergang???? }
Zu5. (Siehe Anhang)
Asuro hat einen Axenabstand von 105mm, was heißt, dass der Radius 52,5mm beträgt.
Der Umfang beträgt dann:
2*pi* 52,5mm = 329,87mm
Da jedes Rad bei einer 90° Kurve einen Viertel der Umfangsstrecke abfahren muss ergibt sich:
¼ * 329,87mm = 82,47mm
Da pro Hell-Dunkel-Übergang 2mm zurück gelegt werden ergibt sich:
82,47 / 2 = (ungefähr) 41
das heißt wohl, dass beide Räder gleichzeitig 41 Hell-Dunkel-Übergänge zurücklegen müssen.
Also auf der Axe drehen kriege ich hin, ich ändere lediglich aus Punkt 1
“MotorDir(FWD,FWD);” in “MotorDir(FWD,RWD);” um.
Jetzt entsteht aber wieder das gleiche Problem mit der Strecke wie in Punkt 4.
Zu6. :
Jetzt fährt er nur noch rückwärts oder so etwas, ist mir eigentlich egal, leg ich kurzfristig fest.
ZUM KOMPLETTEN PROJEKT:
Was haltet ihr von der Vorgehungsweise?
Ich würde mich wie immer sehr freuen, wenn mir jmd zu helfen versuchen würde.
Ich hoffe durch dieses Projekt versteh ich das ein oder andere etwas besser .
Mit freundlichen Grüßen, Marcel
da ich mich mittlerweile mit der Standard Lib zufrieden gegeben habe und versuche alles darauf aufzubauen, bin ich (mal wieder) auf ein Problem gestoßen.
Ich versuche folgendes zu realisieren:
1. Mein Asuro soll auf einem Tisch geradeaus fahren.
2. Beim Losfahren soll er die momentanen Linedata[0] und [1] speichern
(aber nur die momentanen, da jeder Tisch unterschiedlich ist).
3. Kommt er zur Tischkante, macht er Halt,
4. fährt 100mm zurück,
5. dreht sich um 90° rechts um seine eigene Axe herum
6. und fährt dann rückwärts weiter oder so ähnlich
Bereits durchgeführte Umbauten:
Odometrie Sensor mit einer kleinen Karton Konstruktion vom Umgebungslicht abgeschirmt,
und die Zahnräder mit einer Unterlegscheibe (fast) ruckel frei gemacht.
Zuallerletzt die Axen geschmiert .
Erste programmierungstechnische Ideen:
Zu 1.
(ich weiß es gibt mit Sicherheit weit aus bessere Möglichkeiten das Geradeaus fahren zu realisieren, aber ich bin immer noch ein Anfänger und war echt stolz beim entwickeln dieses Programms) :
MotorDir(FWD,FWD);
while(1)
{ OdometrieData(data);
if (data [0] == data [1] )
{MotorSpeed(100,100);}
else if (data [0] > data [1] )
{MotorSpeed(100,120);}
else if (data [0] < data [1] )
{MotorSpeed(120,100);} }
Zu 2. :
Ich habe absolut keine Ahnung, wie ich solch eine Funktion in das Programm einbeziehen könnte.
Als Variable habe ich mir „a“ gedacht.
„Linedata[2] = a“ geht ja wohl nich, da sich die Daten immer ändern.
Zu 3. :
Ich wollte den im Punkt 2. Ermittelten Anfangs Wert nutzen um eine Anweisung zu erstellen die etwa so lauten könnte:
if (data [0], data [1] < a )
MotorDir(BREAK,BREAK);
else
„weiter gerade aus fahren aus Punkt 1"
Zu 4.
(Ich wollte die Wegmessung benutzen, und nich eine beliebige Zeit)
Ich habe mir auf dieser Seite Anregungen geholt:
http://www.cs.hs-rm.de/~linn/vpdv07/asuro3/asuro-website/files/position.html
Ich habe die 12er Musterscheibe drauf, also entspricht wohl folgendes:
U des Reifen = 120mm
120mm / 5 = 24mm
24mm / 12 = 2mm
100mm / 2mm = 50
Sprich, pro Hell-Dunkel-Übergang bewegt sich ein Rad um 2mm und um auf eine zurückgelegte Strecke von 100mm zu kommen bräuchte ich 50 Hell-Dunkelübergänge.
Da beide Musterscheiben (ungefähr) gleich schnell drehen, brauch ich ja nur eine zu kontrollieren theoretisch oder? Wo ich auch schon beim Problem bin.
Um genau das in die Tat umzusetzen habe ich nämlich ungefähr an so etwas gedacht:
„fährt rückwärts“
for ( b=0 ; b < = 50; b++)
{ ????Hell-Dunkel-Übergang???? }
Zu5. (Siehe Anhang)
Asuro hat einen Axenabstand von 105mm, was heißt, dass der Radius 52,5mm beträgt.
Der Umfang beträgt dann:
2*pi* 52,5mm = 329,87mm
Da jedes Rad bei einer 90° Kurve einen Viertel der Umfangsstrecke abfahren muss ergibt sich:
¼ * 329,87mm = 82,47mm
Da pro Hell-Dunkel-Übergang 2mm zurück gelegt werden ergibt sich:
82,47 / 2 = (ungefähr) 41
das heißt wohl, dass beide Räder gleichzeitig 41 Hell-Dunkel-Übergänge zurücklegen müssen.
Also auf der Axe drehen kriege ich hin, ich ändere lediglich aus Punkt 1
“MotorDir(FWD,FWD);” in “MotorDir(FWD,RWD);” um.
Jetzt entsteht aber wieder das gleiche Problem mit der Strecke wie in Punkt 4.
Zu6. :
Jetzt fährt er nur noch rückwärts oder so etwas, ist mir eigentlich egal, leg ich kurzfristig fest.
ZUM KOMPLETTEN PROJEKT:
Was haltet ihr von der Vorgehungsweise?
Ich würde mich wie immer sehr freuen, wenn mir jmd zu helfen versuchen würde.
Ich hoffe durch dieses Projekt versteh ich das ein oder andere etwas besser .
Mit freundlichen Grüßen, Marcel