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: Peter Jonas
Datum: Fr, 07.04.2006 00:02:11
Hallo zusammen,
bevor ich in den Osterurlaub gehe, möchte ich noch einen Patch zur Verfügung
stellen, der mittels einer EEPROM-Tabelle die Kalibrierung der
Distanzsensoren durchführen kann.
Die Kalibrierung wird über zwei defines in der Datei ctbot.h gesteuert:
#define CALIBRATE_DIST_SENSOR:
Wenn diese Zeile aktiviert ist, geht der Roboter in den Kalibrierungsmodus
#define USE_SENSOR_TABLE:
Wenn diese Zeile aktiviert ist, wird im normalen Roboterbetrieb eine im
EEPROM abgelegte Tabelle für die Linearisierung der Distanzsensoren benutzt.
Im Kalibriermodus sieht man auf dem Display zunächst ein Menü. Man wird
aufgefordert, den Roboter auf eine Distanz von 5cm zur Wand zu stellen. Wenn
man das gemacht hat, drückt man die Taste "2" auf der Fernbedienung. Es wird
nun aus den folgenden 100 Meßwerte pro Sensor ein Mittelwert gebildet.
Dieser Wert wird dann in den beiden Tabellen (links und rechts) im EEPROM
abgelegt. Danach wird man aufgefordert, die Distanz 10cm einzustellen und
der Vorgang beginnt von vorn.
Mit der Distanz 80cm ist die Kalibrierung abgeschlossen. Die Sensorwerte für
die Distanzen 5, 10, 50 ... 80 cm sind nun im EEPROM.
Mit der Taste "0" kommt man in den normalen Roboterbetrieb zurück und kann
die Kalibrierung gleich testen (USE_SENSOR_TABLE muss dafür definiert sein).
Wenn die Sensoren Distanzen messen, die außerhalb des eingestellten
Distanzbereiches liegen, werden die Werte 0 bzw. 999 ausgegeben.
Bei den Kalibrierungsschritten kann es noch passieren, dass die Tasten
prellen. Die "Entprellung", die bei der Standard-Tastaturabfrage bereits
eingebaut ist, funktioniert hier nicht, da ich direkt auf die Funktion
ir_read() zugreife. Der Workaround in meiner Routine unterdrückt zwar das
Prellen, bewirkt aber auch, dass man manchmal beim Weiterschalten der zu
messenden Distanz die Taste "2" erneut drücken muss.
Im EEPROM werden für den Distanzbereich 5-80cm 16 Messwerte pro Sensor
gespeichert. Da die Sensoren jedoch auch Werte für Distanzen zwischen den
gemessenen Distanzen ausgeben, muß man zwischen den Stützwerten
interpolieren, um für jeden Sensorwert einen cm-Wert liefern zu können.
Dafür gibt es zwei Lösungsansätze:
1. Die Interpolation findet schon vor der Speicherung der EEPROM-Tabellen
statt. Nachteil: Die Tabellen werden sehr groß, und man muß evt. auf
int16-Werte übergehen, um eine ausreichende Genauigkeit zu erzielen.
2. Man speichert nur die gemessenen 16 Werte pro Sensor ab und interpoliert
erst beim normalen Betrieb, wenn ein neuer Distanzwert benötigt wird.
Vorteil: Die EEPROM-Tabellen sind sehr kurz. Nachteil: Die Interpolation muß
im normalen Roboterbetrieb erfolgen. Für einen aktuellen Sensorwert muß die
Tabelle durchsucht werden, festgestellt werden, zwsichen welchen zwei
gespeicherten Stützstellen der Messwert liegt, und dann interpoliert werden.
Bislang habe ich aber noch keine Probleme durch diese notwendigen
Prozessoraufgaben feststellen können.
Ich habe die 2. Methode verwendet, weil mir bei 1) die Tabellen zu groß
wurden oder aber die Genauigkeit zu gering war.
Wenn man die EEPROM-Tabelle geschrieben hat, muss man später beim Flashen
mittels PonyProg aufpassen. Ein Write-All bügelt die gemessenen Werte wieder
über. Die Messwerte liegen im Adreßbereich ab 0x8000.
Gruß
Peter Jonas
--
Echte DSL-Flatrate dauerhaft für 0,- Euro*!
"Feel free" mit GMX DSL! http://www.gmx.net/de/go/dsl