heise online
  • c't
  • iX
  • Technology Review
  • Mac & i
  • mobil
  • Security
  • Netze
  • Open Source
  • Developer
  • c't-TV
  • Download
  • Telepolis
  • Resale
  • Foto
  • Autos
  • Preisvergleich
  • Stellenmarkt
  • Abo
  • weitere Angebote
    • Shop
    • Artikel-Archiv
    • Veranstaltungen
    • Whitepapers
    • heise-marktplatz
    • IT-Markt
    • Tarifrechner
    • Jobs bei Heise

c't Magazin
  • Startseite
  • Artikel
  • c't-Projekte
  • Hotline & FAQ
  • Treiber & mehr
  • Kolumnen
Software zu Projekten Allgemeine Hinweise
Archiv-Suche Newsletter RSS-FeedRSS

c't › c't-Projekte

Trac
  • Login
  • Help/Guide
  • About Trac
  • Preferences
  • Wiki
  • Timeline
  • Roadmap
  • Browse Source
  • View Tickets
  • Search

Context Navigation

  • Start Page
  • Index
  • History
  • Last Change

  1. Sensoren
    1. Distanzsensoren
      1. Kalibrierung der Distanzsensoren
    2. Liniensensoren
      1. Kalibrierung der Liniensensoren
    3. Abgrundsensoren
      1. Kalibrierung der Abgrundsensoren
    4. Helligkeitssensoren
    5. Maussensor
    6. Digitale Sensoren
    7. Radencoder
      1. Odometrie-Auswertung
    8. Analog-Digital-Wandlung
  2. Analyse des Maussensors und der Distanzsensoren

Sensoren

Die Sensoren des Bots werden in mcu/sensor-low.c ausgewertet und ihre Daten in globalen Variablen gespeichert. Für einige Sensoren gibt es eine Weiterverarbeitung der Daten auf höherer Ebene, sie erfolgt in sensor.c. Im Falle eines simulierten Bots bekommt dieser die Sensordaten vom Sim und der sensol-low-Part entfällt. Zu den Linien-, Helligkeits- und Abgrundsensoren gibt es noch nicht viel Dokumentation.

Distanzsensoren

Die Distanzsensoren werden alle 50 ms (denn öfter liefern sie keine neuen Messwerte) per ADC ausgewertet. Dabei werden die letzten vier Messwerte in einem Array gepuffert, wenn DISTSENS_AVERAGE in sensor_correction.h aktiviert ist. Aus dem Mittelwert bzw. dem letzten Messwert (DISTSENS_AVERAGE aus) berechnet sensor_dist_lookup() (sensor.c) dann die aktuelle Entfernung in mm. Die Umrechnung in die Entfernung erfolgt mit Hilfe von 15 Stützwerten aus dem EEPROM, die Funktion lin_interpolate() ermittelt aus zwei Stützwerten und dem aktuellen Sensorrohwert die exakte Entfernung durch lineare Interpolation.

Kalibrierung der Distanzsensoren

Kalibrieren lassen sich die Sensoren halbautomatisch (Bot auf angezeigte Entfernung stellen, Taste drücken, Bot auf die nächste Entfernung stellen, Taste drücken usw.) mit dem Verhalten behaviour_calibrate_sharps, das die erforderlichen Stützwerte dann anschließend auch ins EEPROM schreibt. Die Stützwerte und die minimale sowie maximale Entfernung lassen sich in include/sensor_correction.h einstellen.

  1. BEHAVIOUR_CALIBRATE_SHARPS_AVAILABLE in ct-Bot.h einschalten (siehe auch Übersicht der optionalen Codeteile)
  2. Code neu übersetzen und auf den Bot übertragen
  3. Fernbedienungstaste 6 drücken
  4. Den Anweisungen auf dem Display folgen (FB-Taste Mute)

Am besten lässt man sich das Ergebnis der automatischen Kalibrierung per LOG ausgeben und trägt es in sensor_correction.h ein. Dann erzeugt der Build-Vorgang neben der ct-Bot.hex auch eine ct-Bot.eep Datei, die die Sensorkalibrierung bereits enthält. Diese lässt sich per Programmer ins EEPROM schreiben. Letzteres ist nötig, wenn eine der im EEPROM liegenden Variablen geändert wurde oder weitere solcher Variablen hinzugekommen sind (siehe auch Übertragen von Firmware in den AVR-Mikrocontroller).

Die Datenablage im EEPROM wird nicht nur für die Distanzsensoren, sondern z.B. auch für das Verhalten bot_turn(), die Motorregelung und den Mini-FAT-Treiber der MMC genutzt.

Liniensensoren

Die Liniensensoren werden bei jedem Aufruf von bot_sens() ausgewertet und ihre Werte direkt in sensLineL und sensLineR gespeichert (Wertebereich von 0 bis 1023). Je dunkler die Linie ist, desto größer ist der gelieferte Sensorwert.

Kalibrierung der Liniensensoren

  1. Zur Kalibrierung der Liniensensoren stellt man den Bot zunächst auf die Fläche, auf der er normalerweise fahren soll (also keine Linie) und notiert sich die Werte der Liniensensoren aus dem Sensor-Display (L=...).
  2. Nun stellt man den Bot auf eine Linie und notiert sich ebenfalls die angezeigten Werte der Liniensensoren.
  3. Aus den beiden Messungen für Linie und keine Linie ermittelt man nun einen Wert, der größer als der für normale Flächen und kleiner als der für eine Linie ist, und benutzt diesen als Schwellwert zur Linienerkennung.
  4. Dazu passt man LINE_SENSE in bot-local.h an

Abgrundsensoren

Die Abgrundsensoren werden bei jedem Aufruf von bot_sens() ausgewertet und ihre Werte direkt in sensBorderL und sensBorderR gespeichert (Wertebereich von 0 bis 1023). Je dunkler die Fläche ist, desto größer ist der gelieferte Sensorwert.

Kalibrierung der Abgrundsensoren

  1. Zur Kalibrierung der Abgrundsensoren stellt man den Bot zunächst auf die Fläche, auf der er normalerweise fahren soll (also kein Abgrund) und notiert sich die Werte der Abgrundsensoren aus dem Sensor-Display (B=...).
  2. Nun hält man den Bot über einen Abgrund oder stellt ihn auf eine Fläche, die als Abgrund erkannt werden soll und notiert sich ebenfalls die angezeigten Werte der Abgrundsensoren.
  3. Aus den beiden Messungen für Abgrund und kein Abgrund ermittelt man nun einen Wert, der größer als der für normale Flächen und kleiner als der für einen Abgrund ist, und benutzt diesen als Schwellwert zur Abgrunderkennung.
  4. Dazu passt man BORDER_DANGEROUS in bot-local.h an.

Helligkeitssensoren

Die Helligkeitssensoren werden bei jedem Aufruf von bot_sens() ausgewertet und ihre Werte direkt in sensLDRL und sensLDRR gespeichert (Wertebereich von 0 bis 1023).

Maussensor

Der Maussensor wird bei jedem Aufruf von bot_sens() ausgewertet und dX und dY in sensMouseDX und sensMouseDY gespeichert. Die Daten werden in sensor_update() weiter verarbeitet, siehe Odometrie-Auswertung.

Für die maximale Genauigkeit des Maussensors, sollte man ihn tiefer legen

Zum optimalen Justieren des Maussensors hilft das "Mausbild" aus dem Sim oder Sim-Applet sehr, bei mir sieht das dort so aus:

Am besten druckt man dazu ein Kreuz mit möglichst feinen Linien aus, als Vorlage kann man z.B. diese Grafik verwenden:

Digitale Sensoren

Die digitalen Sensoren werden bei jedem Aufruf von bot_sens() ausgewertet. Die Werte von Transportfachklappe, Transportfach belegt und Stromversorgung okay werden direk in sensDoor, sensTrans und sensError gespeichert. sensError == 1 bedeutet kein Fehler.

Radencoder

Die Radencoder werden in bot_encoder_isr() ausgewertet, der Aufruf erfolgt im Gegensatz zu allen anderen Sensoren timergesteuert, damit die Encoderflanken rechtzeitig registriert werden können. Neben dem Zählen der Encoderstände werden für die Motorregelung Zeitstempel der Flanken gespeichert, die eine genauere Berechnung der Ist-Geschwindigkeit ermöglichen (siehe Motorregelung). Das Kapitel Kalibrieren der Radencoder finden Sie bei der Beschreibung der Motorregelung.

Odometrie-Auswertung

Die Daten von Radencodern und Maussensor werden in einer Reihe von Berechnungen für Position, Richtung und Geschwindigkeit des Bots verwendet (sensor_update()). Näheres dazu ist in diesem c't-Artikel ausführlich beschrieben.

Analog-Digital-Wandlung

Die Umwandlung der Spannungswerte der analogen Sensoren in digitale Werte erfolgt mit dem ADC des ATMegas. In bot_sens() werden gleich zu Beginn die ADC-Umwandlungen angestoßen, während diese ablaufen, werden die digitalen Sensoren ausgewertet, anschließend erst der linke und dann der rechte Distanzsensor, so dass möglichst viel Zeit nicht mit Warten auf den ADC sondern mit sinnvollen Berechnungen verbracht wird.

Analyse des Maussensors und der Distanzsensoren

Der folgende Test zeigt, wie es aussieht, wenn alle Kalibrierungen gut geklappt haben. Er dient eher der Information, man muss ihn nicht selbst machen.

Ein kleiner Test, der zeigen soll, ob die Auswertung von Maus- und Distanzsensor übereinstimmt. Der Bot ist einfach eine kurze Strecke auf eine Wand zugefahren, dabei wurde x_pos vom Maussensor und die von den Sharps gemessenen Entfernungen aufgezeichnet. Damit man es besser vergleichen kann, wurde x_pos anschließen von der Startdistanz zur Wand abgezogen. (Hinweis: Die Zeitachse ist nicht ganz linear und die Distanzsensoren sind in zwei Bereichen nicht optimal kalibriert)

Zur Auswertung wurde bot_base_behaviour() wie folgt erweitert:

void bot_base_behaviour(Behaviour_t * data){
        speedWishLeft = target_speed_l;
        speedWishRight = target_speed_r;
        LOG_DEBUG("\tMaus:\t%d\tSpeed:\t%d", (int16_t) x_pos, target_speed_r);
        LOG_DEBUG("\tDistL:\t%u\tDistR:\t%u", sensDistL, sensDistR);
        LOG_DEBUG("\tTime:\t%lu", TIMER_GET_TICKCOUNT_32);
}

Der Maussensor ist tiefer gelegt, der linke Distanzsensor um 180° gedreht eingebaut (Stecker umgelötet) und beide Sharps sind wie hier beschrieben  http://www.segor.de/L1Bausaetze/gp2d12.shtml stabilisiert. Die Distanzsensor-Linearisierung erfolgt per Lookup-Table. Zur Berechnung von x_pos war MEASURE_MOUSE_AVAILABLE an und MEASURE_COUPLED_AVAILABLE aus.

Attachments

  • cross.png Download (56.6 KB) - added by bbe 4 months ago.
  • dist.png Download (18.1 KB) - added by bbe 4 months ago.
  • maus.png Download (6.0 KB) - added by bbe 4 months ago.

Download in other formats:

  • Plain Text

Trac Powered

Powered by Trac 0.11.7
By Edgewall Software.

http://www.ctmagazin.de/
http://www.ctmagazin.de/projekte/

  • Datenschutzhinweis
  • Impressum
  • Kritik, Anregungen bitte an c't-WWW
  • Mediadaten
  • Copyright © 2011 Heise Zeitschriften Verlag
  • International: The H, The H Security, The H Open Source