- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 137

Thema: Minimallösung: Kamera für den RP6

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    15
    Die Kamera soll drei IR Laser Orten um die Landung eines Quadrocopters autonom erfolgen zu lassen. Wenn ich fertig bin werde ich mal ein Video posten (wahrcheinlich erst in den Sommerferien).
    Danke für den aktuellen Quellcode. Mit was hast du den denn Compiliert?

    LG Matthias

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.05.2010
    Ort
    Legau
    Alter
    29
    Beiträge
    58
    Hallo,

    ist es mit der von dir beschriebenen Methode denn auch möglich Farben zuverlässig zu unterscheiden?
    Wie kalibrierst du die Kamera? Machst du das manuell, indem du werte im Programm änderst oder geht das automatisch?

    Gruß

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Mit Farberkennung habe ich noch keine Versuche unternommen. Eventuell kann man mit Filterscheiben arbeiten?

    Da die Kamera einen automatischen Weisabgleich macht, braucht man eigentlich nichts kalibrieren. Zur Zeit spiele ich mal wieder mit einem Linienfolger, diesmal aber mit dem asuro und in Bascom:
    http://www.youtube.com/watch?v=usS3a3Ud_vo

    Es klappt zwar noch nicht so gut, aber es ist auch eher als Einstieg in eine echte Bildverarbeitung gedacht.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Gleich vorweg die Warnung: Dieser Beitrag ist nur für die wirklich harten Kamera-Fans geeignet.

    Zur Zeit versuche ich die Kamera auch mit Bascom in den Griff zu bekommen. Das klappt auch ganz gut:



    Basis ist der eigentlich schon getestete Code für den RP6. Wie üblich hangelt sich der Code an den Syncs zum Bildanfang und dann zur Zielzeile, in meinem Programm zur 50. Zeile. Dann wird laufend geprüft, ob die Helligkeit größer einer bestimmten Schwelle ist. Die Anzahl der Prüfungen wird mitgezählt und das Ergebnis ist dann der Wert für die Position der Kante der Linie:

    Code:
       Do                                                       ' Auf Bildanfang warten
       B = 0
          While Adch > 30                                       ' solange kein sync
          Wend
          While Adch < 50                                       ' solange sync
             Incr B                                             ' syncs zählen
          Wend
       Loop Until B > 40                                        ' mehr als 40 bedeutet Bildanfang
       B = 50                                                   ' die zu lesende Zeile
       While B > 0                                              ' Zeilen zählen
          While Adch > 30                                       ' solange kein sync
          Wend
          While Adch < 50                                       ' solange sync
          Wend
          Decr B
       Wend                                                     ' Zeile gefunden
       B = 0
       While Adch > 65                                          ' Hell/Dunkel-Schwelle
         Incr B                                                 ' warten und zählen bis Schwellwert erreicht wird
       Wend
       Linie = B                                                ' Rückgabewert kopieren
    Wichtig ist nun diese kleine und eigentlich unscheinbare Funktion:
    Code:
       B = 0
       While Adch > 65                                          ' Hell/Dunkel-Schwelle
         Incr B                                                 ' warten und zählen bis Schwellwert erreicht wird
       Wend
    Was mache ich da? Der Pegel des Videosignals in ADCH ist beim Sync deutlich unter 30, alles was größer als 50 ist, wird als Bildinformation interpretiert. Alle Werte über der Schwelle von 65 werden als "Hell" gewertet, ein Wert unter der Schwelle bedeutet die Kante der Linie ist gefunden.

    Eigentlich hätte ich nun erwartet, dass bei einem 8MHz-RISC-Kontroller der Zähler sofort in die Höhe schießt, denn die Ausführung der kleinen Scheife dauert nur ein paar Takte. Dem ist aber nicht so! Wenn ich mit Adch > 50, quasi alles was nicht Syncpegel ist, als Bildbereich gelten lassen, komme ich auf Zählerstände von maximal 27. Das ist auch das, was man im Video oben sieht und hört: Wenn der Linienwert >26 ist wird keine Linie erkannt, weil sie außerhalb des Sichtbereichs der Kamera ist. Aber warum ist der Wert so unerwartet niedrig? Ich vermute, Bascom wartet intern bis der ADC mit der Wandlung fertig ist bevor der Wert von ADCH gelesen werden kann. Das würde also 26 echte Positionen bedeuten, was allerdings zu den in C ermittelten maximalen 16 nicht ganz passt. Hier muss man noch etwas weiter forschen, aber ich schweife auch ab....

    Wirklich spannend ist nun folgendes: Wenn man die Schwelle nicht als absoluten Wert angibt sondern als Variable, dann verändern sich die gemessenen Werte:

    Dim Schwelle As Byte

    ...
    Adch > Schwelle
    ...

    So komme ich nur noch auf Maximalwerte von ca. 23! Irgendwas an der Art der Zuweisung scheint so länger zu dauern als in der Variante mit Konstanten. Sehr seltsam. Was Basom da übersetzt sollte man mal disassemblieren.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Da ich mal wieder an meiner ewigen Kamerabaustelle arbeite, kann ich nun quasi die Version 2.0 der Minimalkamera als Beta vorstellen.

    Bisher hatten wir das Problem, dass wir zwar die Syncs gefunden haben, aber die Flanken wurden nicht richtig erkannt. Deshalb "zitterte" der Zeilenanfang beim Einlesen der Bilddaten. Das sieht man deutlich bei den HiRes-Bildern:

    Bild hier   Bild hier   Bild hier  
    (Bilder aus https://www.roboternetz.de/community...l=1#post458253)

    Nun bin ich schon vor einiger Zeit im Datenblatt der AVRs über diesen Satz in der Beschreibung des analogen Komparators (Analog Comparator) gestolpert:

    The output of the Analog Comparator is synchronized and then directly connected to
    ACO. The synchronization introduces a delay of 1 - 2 clock cycles.
    Frei übersetzt: Der Status der Komparators wird innerhalb von 1 bis 2 Taktzyklen (!) im ACO-Bit dargestellt.

    Blöderweise sind aber die Pins des Komparators bei meinen Fertigrobotern schon belegt, deshalb habe ich diesen Ansatz bisher nicht weiterverfolgt. Eher zufällig ist mir nun aufgefallen, dass mein asuro-probot genau diese Pins nicht verwendet, wenn ich die Sensorplatine nicht einstecke. Dadurch kann ich nun AIN0 und AIN1 nutzen. Als zusätzliche Hardware erzeuge ich mit einem 10k-Poti eine einstellbare Spannung an AN0 als Schwelle für den Sync-Pegel, die Erweiterung der Software beschränkt sich auf das Umschalten zwischen ADC- und AC-Betrieb und der geänderten Sync-Erkennung:

    Code:
    Sub Readline(byval Zeile As Word)
       Local Znr As Word
    
       ' AC einschalten  Vergleich zwischen AIN0 (PD6) und ADC-Kanal 4 (PC4)
       Reset Adcsr.aden                     ' ADC dissable
       Reset Acsr.acd                       'enable analog comparator ACSR bit 7 = 0
    
       Portd.4 = Acsr.aco                   ' Status zeigen: Warten auf Bildstart
       Do                                   ' Auf Bildanfang warten
          Znr = 0
          While Acsr.aco = 0                ' solange kein sync (PC4 > PD6)
          Wend
          While Acsr.aco = 1                ' PC4 < PD6 = Sync
             Incr Znr                       ' syncs zählen
          Wend
       Loop Until Znr > 60                  ' mehr als 60 (mit AC!) bedeutet Bildanfang
    
       Znr = Zeile                          ' die zu lesende Zeile
       While Znr > 1                        ' Zeilen zählen
          While Acsr.aco = 0                ' solange kein sync
          Wend
          While Acsr.aco = 1                ' solange sync
          Wend
          Decr Znr                          ' eine Zeile vor dem Ziel...
       Wend
       While Acsr.aco = 0                   ' solange kein sync
       Wend
    
       ' ADC einschalten
       Set Adcsr.aden                       ' ADC Enable
       Set Adcsr.adsc                       ' ADC Start Conversion
       Portd.4 = Acsr.aco                   ' Status zeigen: Zeile gefunden
    
       Set Adcsr.adif                       ' ADIF-Bit rücksetzen !!! Nur schreibend zugreifen !!!
       While Adcsr.adif = 0                 ' warten bis ADC fertig mit Wandeln
       Wend
       Znr = Adch                           ' erste Lesung ist noch Sync
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(01) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(02) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(03) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(04) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(05) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(06) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(07) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(08) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(09) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(10) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(11) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(12) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(13) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(14) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(15) = Adch
       Set Adcsr.adif
       While Adcsr.adif = 0
       Wend
       Linienspeicher(16) = Adch
       Set Adcsr.adif
    End Sub
    Da der ADC wie gehabt im Dauerlauf gestartet wurde, schaltet die Funktion zuerst den ADC aus und den AC ein. Dann hangelt sich die Funktion durch die Syncs über den Bildanfang bis zu der Zeile, die sich vor der gesuchten Zeile befindet. Wenn am Ende dieser Zeile der Sync erkannt wird, schaltet die Funktion von AC auf ADC zurück und startet die erste Wandlung des ADC noch während des Syncs. So wird der Zeilenanfang mit einer bisher noch nicht gekannten Genauigkeit getroffen. Dieses einfache Demo

    Code:
    While X = X
       Readline 50
    
       For X = 1 To 16
          Print Linienspeicher(x) ; " ";
       Next X
       Print
    
       Waitms 300
    Wend
    erzeugt diese Ausgabe:

    Code:
    Bascom-Spielereien mit der Kamera
    96 102 103 103 103 103 99 79 57 99 99 96 96 46 6 35
    96 102 103 103 103 102 99 56 57 99 97 96 96 15 3 35
    96 103 103 103 103 102 99 56 60 99 97 96 96 9 3 35
    96 102 103 103 103 102 99 71 57 99 99 96 96 39 6 35
    96 102 103 103 103 102 99 57 57 97 97 96 96 39 6 35
    96 102 103 103 102 102 99 57 57 97 97 96 96 19 3 35
    96 102 103 103 103 102 99 57 56 99 97 96 96 39 6 35
    96 102 103 103 103 103 99 63 57 99 99 96 96 39 6 35
    96 102 103 103 103 102 99 56 56 97 97 96 96 39 6 35
    96 102 103 103 103 102 99 76 56 99 99 96 96 41 6 35
    97 103 103 103 103 102 99 60 60 99 97 96 96 15 3 35
    88 102 102 103 102 102 99 79 56 99 99 96 96 54 6 35
    97 103 103 103 103 102 99 56 62 99 97 96 96 9 3 35
    87 103 103 103 103 102 99 60 60 99 97 96 96 30 4 35
    96 102 103 103 103 103 99 76 56 99 99 96 96 44 6 35
    86 102 103 103 103 102 99 70 57 99 99 96 96 39 6 35
    96 102 103 103 103 102 99 78 56 99 99 96 96 44 6 35
    96 103 103 103 103 102 99 57 57 99 97 96 96 19 3 35
    96 102 103 103 103 102 99 56 57 99 97 96 96 14 3 35
    Werte<70 sind der Strich, <ca. 40 ist der Sync am Ende der Zeile. Es sind also ca. 13 Werte pro Zeile die gelesen werden.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress