Hallo,
Ich versuche momentan einen kapazitiven Touchscreen mit einem ATMega32
auszuwerten. Dabei benutze ich die QTouch Lib von Atmel um die Signale
der Sensoren auf einer Folie zu erfassen. Der nächste Schritt ist die so
gewonnene Matrix zu interpolieren um die Auflösung der Folie zu erhöhen.
Momentan interpoliere ich linear auf das 10-Fache.
Danach stecke ich aber fest. Ich habe keine Idee wie ich nun die x/y
Koordinate in der interpolierten Matrix finde (wird zb zwischen 2 oder 4
tasten gedrückt ist kein Maximalwert vorhanden bzw der maximalwert in
der Matrix entspricht nicht der Fingerposition) bzw ob ich überhaupt die
ganze Matrix interpolieren muss?
Und bei dem Wetter ist es auch schwer einen kühlen Kopf zu bewahren um
klar zu denken ;-)
Vielleicht hat hier jemand eine Idee oder kann mich wenigstens in die
richtige Richtung schubsen?
Gruß Markus
Markus schrieb:> Das sieht alles Toll aus, die Werte stimmen so weit, die lineare> Interpolation ist genau genug aber wie man sieht ist die 11 immer noch> der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen,> was der 8 entspricht.
Ich verstehe noch nicht so ganz, was du machst, aber wenn du in der
Mitte eine 11 hast und links eine 6, wird eine lineare Interpolation
dazwischen niemals einen Wert liefern, der größer als 11 ist.
Markus schrieb:> Das sieht alles Toll aus, die Werte stimmen so weit, die lineare> Interpolation ist genau genug aber wie man sieht ist die 11 immer noch> der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen,> was der 8 entspricht.
Ich denke, da wirst du nicht viel dagegen machen können.
Du hast nun mal nur 3*3 Sensorwerte. Alles andere, was du dazwischen
reinrechnest beruht nun mal auf der Annahme, dass bildlich gesprochen,
eine Bergspitze nur in der Mitte eines der Sensorfelder sein kann.
Hast du mal ein paar 'Spielchen' probiert:
alle Werte rund um einen Wert addieren
| 4 | 4 | 5 | 6 | 4 | 2 | 0 |
| 4 | 5 | 6 | 7 | 5 | 2 | 0 |
| 5 | 6 | 8 | 9 | 6 | 3 | 0 |
| 6 | 7 | 9 | 11 | 7 | 3 | 0 |
| 4 | 5 | 6 | 7 | 4 | 2 | 0 |
| 2 | 2 | 3 | 3 | 2 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Als zb für den 8-er links von der 11: 5 + 6 + 7 + 9 + 11 + 9 + 7 + 6
Mit ein wenig Glück kriegst du so eine Verschiebung des Maximums in
Richtung linke obere Ecke hin.
Aber grundsätzlich: Information die in den Ausgangsdaten nicht vorhanden
ist, ist weg. Und wenn du dich Kopf stellst, sie ist trotzdem weg.
Deine Ausgangsdaten sind nun mal 9 Sensorwerte und nicht mehr. Aus
deinen Seonsorwerten kann man noch ablesen, dass der Druckpunkt nicht
zentral in der Mitte war, sondern eher links von der Mitte und oberhalb
der Mitte. Aber zu recht viel mehr wirds nicht reichen.
Genau!
Das ist mein Problem :-)
Ich hab nur keine Ahnung wie ich das so Interpoliere das zwischen der 6
und der 11 ein Anstieg ist, und drumherum ein Abstieg.
also im mittleren Feld drücken, kann eine den höchsten Wert in einem
anderen erzeugen?
Schade ich hätte sonst ausgehend vom maximalen Wert, also Feld gedrückt
geschaut in welche Richtung die Differenzen geringer sind, um die
Tendenz in dem Feld festzustellen.
Im Folgenden nur weiterlesen, wenn du dich mit Geometrie und Mathe nicht
auf Kriegsfuss befindest.
Man könnte versuchen einen Bi-quadratischen Patch in die Daten
hineinzurechnen und dessen Maximum zu bestimmen.
Hintergrund:
Wenn man 3 Punkte kennt, kann man eine Gleichung 2ten Grades in diese
Punkte hineinrechnen, so dass alle 3 Punkte auf dieser Gleichung liegen.
Dasselbe kann man auch mit 9 Punkten und einer Fläche machen, die in 2
Achsrichtungen jeweils aus einer Gleichung 2ten Grades besteht.
Das müsste ungefähr so aussehen
du hast 9 bekannte Punkte, damit lassen sich 9 Gleichungen dieser Form
aufstellen und die Koeffizienten a bis j berechnen.
Aus der dann bekannten Formel, kann man wiederum mittels Differentiation
die Position des Maximums (von z) berechnen.
Vorrausgesetzt der kapazitive Einfluß des Fingers genügt auch einer
quadratischen Funktion, das wüsst ich jetzt physikalisch nicht.
Dann wärs schon beliebig präzise.
hm schrieb:> Vorrausgesetzt der kapazitive Einfluß des Fingers genügt auch einer> quadratischen Funktion, das wüsst ich jetzt physikalisch nicht.
Ich auch nicht.
Im Zweifelsfall würd ich aber sagen: eher nicht
Aber das ist so ziemlich das einzige was mir einfällt um aus einem Satz
unvollständiger Daten Kaffeesatzleserei zu betreiben.
Im Grunde gehts darum, von einem Messpunkt auch noch ein wenig seiner
Umgebung zu berücksichtigen.
Anschaulich gesagt ist klar, dass bei
| 3 | 6 | 0 |
| 6 | 11 | 0 |
| 0 | 0 | 0 |
*) der Druckpunkt nicht in der Mitte war
*) sondern etwas weiter links
*) und etwas oberhalb der Mitte
*) aber auch nicht soweit links/oberhalb, dass man schon am Rand wäre
*) sondern eher näher der Mitte als näher am Rand
Nur: Wie giesst man das in Formeln?
Andere Idee wäre zu gucken, wenn vielleicht schon die Tools da sind, ob
man einem mehrschichtiges Perzeptron beibringen kann, von der 3x3 auf
eine höhere Auflösung zu abstrahieren. GANZ ähnliches Problem habe ich
so mal gelöst.
Falls eine Funktion über die Fläche gelegt werden kann, könnte man die
auch lernen und spart sich das Lösen. Verbraucht sicher nciht
unwesentlich Rechenzeit. Zweiten Grades bräuchte auch nciht so viele
Neuronen.
Sollte das nicht einfach über eine Schwerpunktsberechnung gehen? Die wär
jedenfalls recht einfach zu machen und irgendwie klingts für mich
logisch ^^
Sebastian
Ja... eben da bin ich auch mit meinem Latein, was auch noch nicht allzu
groß ist, am Ende... Vielleicht hilft es das ich das Maximum das ein
Feld erreichen kann kenne und weiß wie groß der Radius einer Berührung
ca. ist? Könnte man da nicht was mit einer Gausschen Glocke basteln? Das
Problem ist nur das ich den Mittelpunkt nicht kenne, den die Formel aber
verlangt.
Mit der Schwerpunktberechnung solltest du dir sogar die Interpolation
sparen können. Dann dürfte auch die Genauigkeit steigen, weil du auf dem
Weg weniger Rundungsfehler hast. Der Rechenzeit tuts sowieso gut.
Schwerpunkt ist wahrscheinlich wegen der Linearitär bischen ungenauer
als der quadratische Ansatz, aber ja auch unschlagbar einfach.
Würd ich definitiv als Gewinner ansehen, wenn reicht.
Markus schrieb:> Das heisst Schwerpunktberechnung. Du sagst ja auch nicht Bratswurst
... oder Weihnachtszeit, Rotationsmatrix, Spannungsspitze, Essensreste,
Heizungsinstallateur, Geschäftsmann, Tageszeitung, ...
Dann will ich mich mal bei allen bedanken!
Allein die Schwerpunktsberechnung ;-) reicht nicht, wenn ich vorher
interpoliere bekomme ich aber recht genaue Ergebnisse.
Markus schrieb:> Dann will ich mich mal bei allen bedanken!> Allein die Schwerpunktsberechnung ;-) reicht nicht, wenn ich vorher> interpoliere bekomme ich aber recht genaue Ergebnisse.
Wie genau denn? Würde mich mal interessieren. Wie groß ist denn dein
Touchpad und wie groß die Elektroden? Welchen Abstand hat dein Finger zu
den Elektroden?
Viele Grüße,
Arne
Hi Leute, ich bin gerade auch dabei einen ATmega32 für ein touch pad zu
programmieren. Ich bin recht unerfahren was die Programmierung in C
angeht. Wie ich die Interpolation und Schwerpunktberechnung auf dem
Papier mache ist mir klar, nur krieg ich das nicht in Code gegossen :\
@ Markus (Gast): Es wäre mir eine große Hilfe, wenn du vielleicht ein
kleines Codebeispiel o.Ä. hättest.
Gruß