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: Benjamin Benz
Datum: Fr, 07.04.2006 10:41:10
In-reply-to:
<19816.1144360931@xxxxxxxxxxxxxx>
References:
<19816.1144360931@xxxxxxxxxxxxxx>
Hallo,
ich habe den Patch noch nicht im Detail studiert, halte aber eine
Kalibration und das Ablegen der Werte im EEPROM für sehr sinnvoll. Zu
Durchführung ist mir jedoch einiges aufgefallen:
1. Warum 2 neue sensor_abstand-Funktionen, die nahezu das selbe tun
(L/R), vielleicht wäre es sinnvoller die alte Funktion um eine
Übergabeparameter zu erweitern.
2. Warum eine lineare Interpolation zwischen den Werten, wo doch eine
Formel für die Kennlinie vorhanden ist? Dann kommt man auch mit weniger
Stützstellen aus.
3. Ich würde vorschlagen nicht ir_read() zu verwenden, sondern den
vorgesehenen Mechanismus mit rc5_control. Dann verschwindet auch das
Prell-Problem.
4. Der Code entspricht nicht den Coding-Conventions:
http://www.heise.de/ct/newsletter/archiv/ct-bot-entwickler/msg00039.html
http://www.heise.de/ct/newsletter/archiv/ct-bot-entwickler/msg00128.html
In den nächsten Tagen stellen wir diese auch nochmals gesammelt auf die
Webseite.
5. Dem Patch fehlt ein Changelog-Eintrag
6. Würde ich darum bitten, zu einem solchen Patch, der Bedienung und
Anleitung erfordert, eine kleine HTML-Seite mit Dokumentation in den
Documentation-Ordner einzufügen.
7. Man könnte konsequenter weise überlegen, ob man das Kalibrieren nicht
auch für den c't-Sim erlaubt, denn über kurz oder lang wird auch der
eine Sensorkennlinie erhalten.
MfG Benjamin Benz
P.S. Bitte lassen Sie sich von meinen Anmerkungen nicht entmutigen. Ich
denke der Patch geht schonmal in die richtige Richtung, braucht aber
noch etwas Schliff.
Peter Jonas wrote:
> 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
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ct-bot-entwickler Mailingliste
> ct-bot-entwickler@xxxxxxxxxxxxxxxxx
> http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler
--
Benjamin Benz
Heise Zeitschriften Verlag
Redaktion c't
eMail: bbe@xxxxxxxx
WWW : http://www.heise.de