|
 |
 |
 |
|
|
c't Projekte - c't-Bot und c't-Sim -
Mailinglisten
[Voriger (Datum)]
[Nächster (Datum)]
[Voriger (Thread)]
[Nächster (Thread)]
[Nach Datum][Nach Thread]
Absender: Timo Sandmann
Datum: Fr, 25.01.2008 02:22:43
Hallo,
ich wollte die Genauigkeit der Positionsbestimmung durch die
Radencoder-Daten etwas verbessern, aber dabei fiel mir folgendes im
Code (sensor.c :: sensor_update()) auf:
Es wird aus den zurückgelegten Strecken der beiden Räder der Vektor
(dessen Betrag im Code mit "deltaY" bezeichnet ist) zwischen alter und
neuer Bot-Position berechnet und anschließend mit
x_enc += deltaY * cos(heading_enc*DEG2RAD);
y_enc += deltaY * sin(heading_enc*DEG2RAD);
die neue X- / Y-Position bestimmt.
Die Sinus- / Kosinus-Zerlegung in die Komponenten ist klar, aber was
ich dabei nicht verstehe:
Warum wird als Winkel die aktualisierte Blickrichtung des Bots benutzt?
Für den Spezialfall, dass der Bot exakt geradeaus gefahren ist, stimmt
die Richtung des Vektors natürlich mit der Bot-Richtung überein, das
wird aber praktisch fast nie vorkommen, weil die Flanken der beiden
Radencoder wohl selten gleichzeitig eintreffen.
Im allgemeinen Fall ist der Bot eine Kurve gefahren und heading_enc
ist der Winkel zwischen X-Achse und Bot-Blickrichtung am Ende der
Kurve. Dann kann aber doch der Winkel zwischen dem Vektor und der X-
Achse nicht gleich heading_enc sein, so wie es im Code steht, denn
dann wäre die Kurve ja eine Gerade (oder eine "Schlangenlinie", die
aber zwischen zwei Auswertungszeitpunkten mit den Encodern gar nicht
messbar ist).
Oder anders gesagt: Für den Fall, dass der Bot eine Kurve gefahren
ist, wird seine Blickrichtung am Ende der Kurve ungleich der Richtung
des Vektors zwischen Kurvenanfang und Ende sein (wovon der Code aber
ausgeht?), oder habe ich da einen Denkfehler? *verwirrt*
Viele Grüße,
Timo
|
|
|