Touch kalibrieren Algorithmus

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von unix, 22. August 2013 .

  1. 22. August 2013
    Guten Tag,

    ich bin dabei eine Webseite zu erstellen mit deren Hilfe man die Touch Displays unserer Geräte kalibrieren kann.

    Da läuft ein Linux mit XServer drauf und ich muss für die config folgende Werte bestimmen:

    xMIN
    xMAX
    yMIN
    yMAX

    Das Display hat eine Auflösung von 1024x768 und der Touch 4096x4096.

    Ich hab jetzt schon ziemlich viel gegoogelt und einen Algorithmus gefunden
    An Easy-to-Understand Explanation of Calibration in Touch-Screen Systems - Application Note - Maxim

    Aber ich glaube der läuf intern im Controller ab um die Punkte zu übersetzen.

    Mein Kollege meinte ich soll einfach eine Geradengleichung erstellen von zwei berührten Punkten und damit dann die gesuchten Werte bestimmen.

    Hab ich auch versucht, haut jedoch nicht ganz hin...

    Ich hab mal hier eine Skizze mit den drei Kalibrierungspunkten, unten stehen jeweils die Werte vom Touch, oben die Positionen auf dem Display:

    Code:
     [X]100,100 [X]924,100
     860,644 76,636
    
    
     [X]924,668
     88,94
    
    Egal wie ich es versuche, ich komme nicht auf korrekte Werte...

    Hat einer eine Idee dazu oder vllt. schonmal was dazu gerechnet?
    Hab auch versucht einfach die Skalierung zu errechnen zwischen Display und Touch und dann die Punkte da hoch und runter zu rechnen, das kommt aber auch nicht hin...

    Im nutzbaren Zustand steht als Konfiguration folgendes drin:
    Code:
    # Option "MaxX" "-4" 
    # Option "MinX" "3784" 
    # Option "MinY" "4002" 
    # Option "MaxY" "234" 
    Habe mir auch mal den Code von xinput_calibrator angeguckt:
    Code:
     // Compute min/max coordinates.
     XYinfo axys;
     // These are scaled using the values of old_axys
     const float scale_x = (old_axys.x_max - old_axys.x_min)/(float)width;
     axys.x_min = ((clicked_x[UL] + clicked_x[LL]) * scale_x/2) + old_axys.x_min;
     axys.x_max = ((clicked_x[UR] + clicked_x[LR]) * scale_x/2) + old_axys.x_min;
     const float scale_y = (old_axys.y_max - old_axys.y_min)/(float)height;
     axys.y_min = ((clicked_y[UL] + clicked_y[UR]) * scale_y/2) + old_axys.y_min;
     axys.y_max = ((clicked_y[LL] + clicked_y[LR]) * scale_y/2) + old_axys.y_min;
    
     // Add/subtract the offset that comes from not having the points in the
     // corners (using the same coordinate system they are currently in)
     const int delta_x = (axys.x_max - axys.x_min) / (float)(num_blocks - 2);
     axys.x_min -= delta_x;
     axys.x_max += delta_x;
     const int delta_y = (axys.y_max - axys.y_min) / (float)(num_blocks - 2);
     axys.y_min -= delta_y;
     axys.y_max += delta_y;
    Die machen das auch mit der Skalierung und dann die Multiplikation, danach wird aber noch ein delta_x errechnet und dazu addiert, da weiß ich aber nicht was die Variable num_blocks bedeutet, bei der init ist diese 8?

    Danke
     
  2. 23. August 2013
    AW: Touch kalibrieren Algorithmus

    Bist du dir sicher dass die Touchwerte die du ermittelst richtig sind?

    Vor allem die oberen Werte erscheinen da suspekt, wenn du einen Wert von
    860 bekommst bei einer Auflösung von 12Bit kann da was nicht Stimmen.
    Da müsstest du was mit > 3000 erhalten.
    -> Sieht nach einem Shift/Dekodierung-Fehler aus.

    Mfg Rushh0ur
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.