{"id":922,"date":"2026-04-20T09:23:47","date_gmt":"2026-04-20T07:23:47","guid":{"rendered":"https:\/\/thurow.de\/?p=922"},"modified":"2026-04-21T12:46:57","modified_gmt":"2026-04-21T10:46:57","slug":"kalibrierungsbeispiel-teil-1-device","status":"publish","type":"post","link":"https:\/\/thurow.de\/?p=922","title":{"rendered":"Kalibrierungsbeispiel Teil 1 &#8211; Device"},"content":{"rendered":"\n<p>Je nach zu kalibrierendem Messger\u00e4t kann es sinnvoll sein, die Kalibrierung im Ger\u00e4t selbst zu realisieren oder auszulagern. Dieses Beispiel zeigt einen Anwendungsfall f\u00fcr die zweite Variante.<\/p>\n\n\n\n<p>Ein Vermessungsger\u00e4t nutzt u.a. eine taktil erfasste Entfernung. Die Zielgenauigkeit liegt bei 0,2mm Absolut. Messungen m\u00fcssen nur einzeln erfolgen, bei denen keine Bewegungen am Ger\u00e4t erfolgen.<\/p>\n\n\n\n<p>Das Ger\u00e4t ist batteriebetrieben, der Einsatz f\u00fcr einen Arbeitstag mit einer Batterief\u00fcllung optimiert. Daher wurden Sensoren und SoC des Ger\u00e4tes u.a. auf geringen Verbrauch ausgesucht. Beim SoC hei\u00dft dies, geringere Rechenkraft zugunsten geringerer Leistungsaufnahme.<\/p>\n\n\n\n<p>Aufgrund von Kosten, Arbeitsbereich und Gr\u00f6\u00dfe kam keine L\u00f6sung mittels Magnetband in Frage. Statt dessen wurde die Messung optisch realisiert, mit einem Ma\u00dfband mit je zus\u00e4tzlicher Takt- und Signalspur.<\/p>\n\n\n\n<p>Die Takt- und Signalspur erlauben eine absolute Bestimmung der Entfernung, sind allein aber zu ungenau. Ihre Auswertung erfolgt mittels Reflektionslichtschranken und anschlie\u00dfend analog realisierter Aufbereitung, an deren Ende nur noch bereinigte Flanken f\u00fcr den SoC generiert werden. Dieser Teil konnte damit sehr stromsparend umgesetzt werden.<\/p>\n\n\n\n<p>Um die Zielgenauigkeit zu erreichen, wird zus\u00e4tzlich die Millimeterspur als differentielles Entfernungsma\u00df, optisch erfasst, einbezogen. Da die Messungen nur einzeln bei Stillstand erforderlich sind, werden mit einem Bildsensor Einzelaufnahmen des Bandes in einer Messkammer vorgenommen. Die Messkammer dient der kontrollierten Ausleuchtung, welche im IR-Bereich erfolgt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"2121\" height=\"1590\" src=\"https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi.png\" alt=\"\" class=\"wp-image-899\" srcset=\"https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi.png 2121w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-300x225.png 300w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-768x576.png 768w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-1536x1151.png 1536w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-2048x1535.png 2048w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-1000x750.png 1000w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-230x172.png 230w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-350x262.png 350w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/Kalibrierungstool_Maszi-480x360.png 480w\" sizes=\"(max-width: 2121px) 100vw, 2121px\" \/><\/figure>\n\n\n\n<p>Das Bild zeigt einen Ausschnitt der UI eines Kalibrierungstools, realisiert in <a href=\"https:\/\/www.qt.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Qt<\/a>. Zu sehen ist ein einzelnes Messbild des Vermessungsger\u00e4tes. Dieses Bild entstand bei der Entwicklung des Ger\u00e4tes, die Messkammer hatte noch starke Defizite in der Ausleuchtung. F\u00fcr die Erkennung solcher Problematiken ist ein <a href=\"https:\/\/de.wikipedia.org\/wiki\/Histogramm\" target=\"_blank\" rel=\"noreferrer noopener\">Histogramm<\/a> (rechts oben), wie auch ein Graph der Verteilung der Helligkeit \u00fcber den Bildverlauf (cyane Linie unten) wertvoll. Eine leichte Unsch\u00e4rfe der Fokussierung ist dagegen als &#8222;nat\u00fcrlicher Weichzeichner&#8220; gew\u00fcnscht.<\/p>\n\n\n\n<p>Das Beispiel ist hinsichtlich der Trennung Kalibrierung und Betrieb aussagekr\u00e4ftig, da die Bestimmung der Kalibrierungsparameter algorithmisch aufwendig ist, w\u00e4hrend auf diesen aufbauend die Messwerterfassung im Betrieb stark optimiert werden kann.<\/p>\n\n\n\n<p>Zun\u00e4chst zur Messwerterfassung im Betrieb auf dem Device: hier muss nur die Millimeterspur als <a href=\"https:\/\/de.wikipedia.org\/wiki\/Region_of_Interest\" target=\"_blank\" rel=\"noreferrer noopener\">ROI<\/a> erfasst werden.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"140\" src=\"https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik.png\" alt=\"\" class=\"wp-image-924\" srcset=\"https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik.png 1600w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-300x26.png 300w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-768x67.png 768w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-1536x134.png 1536w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-1000x88.png 1000w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-230x20.png 230w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-350x31.png 350w, https:\/\/thurow.de\/wp-content\/uploads\/2026\/04\/grafik-480x42.png 480w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n\n\n\n<p>Die Strichlinie ist ein quasi-periodisches Helligkeitssignal in horizontaler Richtung. Die lokale Periode \\(P(x)\\) (Pixel pro mm) ist dabei ortsabh\u00e4ngig. Sind die Parameter zur Berechnung der lokalen Periode \\(P(x)\\) an \\(x\\) bekannt, k\u00f6nnen robuste Verfahren zur Bestimmung der Phasenverschiebung zum Einsatz kommen.<\/p>\n\n\n\n<p>Die Parameter zur Berechnung der lokalen Periode werden im Zuge der Kalibrierung auf einem Desktop Rechner bestimmt und anschlie\u00dfend im Messger\u00e4t persistent abgelegt. Auf ihrer Grundlage berechnet das Messger\u00e4t bei jeder Messung aus dem ROI die Phasenverschiebung. <\/p>\n\n\n\n<p>Die ersten Fehler im System entstehen bereits technologisch bedingt bei der Herstellung der Ma\u00dfb\u00e4nder in der Beschichtung. Der Ausschnitt zeigt Ungenauigkeiten im Druck der Linien. Kleine Besch\u00e4digungen und Verschmutzungen kommen im Laufe der Zeit hinzu. <\/p>\n\n\n\n<p>Messkammer und Optik sind daher so ausgelegt, dass immer &gt;20 Striche pro Einzelbild auswertbar bleiben, ein Kompromiss aus Bildbreite und Aufl\u00f6sung (1600 Pixeln Breite Sensor). Durch die gleichzeitige Auswertung von &gt;20 Perioden wirkt die Korrelation wie ein breit wirkendes Matched-Filter, wodurch lokale St\u00f6rungen gegen\u00fcber dem dominanten Grundanteil unterdr\u00fcckt werden.<\/p>\n\n\n\n<p>Optik und Bildsensor sind so ausgerichtet, das im Kalibrierungsmodus bei Vollbild einerseits Ziffern und Taktspur in den Messbildern enthalten sind, die Millimeterspur jedoch ann\u00e4hernd parallel zur Sensorebene verl\u00e4uft. Hierdurch verlaufen die Striche der schmalen Millimeterspur ann\u00e4hernd senkrecht. Weiter ist ihre Entfernung von der Mittelachse des Sensors klein genug, so das die radialsymmetrische Verzeichnung die Linien noch nicht relevant kippt.<\/p>\n\n\n\n<p>Dies sind die Voraussetzungen, um durch einfaches Aufsummieren der Spalten des ROIs ein 1D-Helligkeitsprofil gewinnen zu k\u00f6nnen.<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>I<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>y<\/mi><mo>=<\/mo><msub><mi>y<\/mi><mtext>s<\/mtext><\/msub><\/mrow><msub><mi>y<\/mi><mtext>e<\/mtext><\/msub><\/munderover><\/mrow><mtext>image<\/mtext><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo separator=\"true\">,<\/mo><mi>y<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo separator=\"true\">,<\/mo><mspace width=\"2em\"><\/mspace><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><mo separator=\"true\">,<\/mo><mn>1<\/mn><mo separator=\"true\">,<\/mo><mo>\u2026<\/mo><mo separator=\"true\">,<\/mo><mi>W<\/mi><mo>\u2212<\/mo><mn>1.<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">  I(x) = \\sum_{y = y_\\text{s}}^{y_\\text{e}} \\text{image}(x, y),\n  \\qquad x = 0, 1, \\ldots, W-1.<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Durch die Summation \u00fcber die Zeilen steigt das Signal-zu-Rausch-Verh\u00e4ltnis um den Faktor \\( \\sqrt{y_\\text{e} &#8211; y_\\text{s} + 1} \\) (unkorreliertes Rauschen vorausgesetzt) und es erfolgt eine Mittelung.<\/p>\n\n\n\n<p>Bewusst wird dabei z.B. auf eine Normierung verzichtet, also <strong>KEIN<\/strong><\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>I<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mfrac><mn>1<\/mn><mi>h<\/mi><\/mfrac><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>y<\/mi><mo>=<\/mo><msub><mi>y<\/mi><mi>s<\/mi><\/msub><\/mrow><msub><mi>y<\/mi><mi>e<\/mi><\/msub><\/munderover><\/mrow><mtext>image<\/mtext><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo separator=\"true\">,<\/mo><mi>y<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">I(x) = \\frac{1}{h} \\sum_{y=y_s}^{y_e} \\text{image}(x, y)<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Diese und folgende Entscheidungen resultieren aus den Einschr\u00e4nkungen des SoCs, z.B. nur float hardwarem\u00e4\u00dfig zu unterst\u00fctzen. Die Verfahren sind so ausgelegt, wo m\u00f6glich auf Ganzzahlen zur\u00fcckzugreifen und bei Operationen, die Flie\u00dfkommazahlen bedingen, den Einfluss von Rundungsfehlern zu minimieren,<\/p>\n\n\n\n<p>Auf diesem Helligkeitsprofil wurde nun eine Lock-in-Phasendetektion mit positionsabh\u00e4ngiger Referenzfrequenz (in der Signaltheorie: Matched Filter f\u00fcr ein chirp-\/warped-sinusf\u00f6rmiges Signal) umgesetzt. Und dieses Verfahren ist sowohl robust im Sinne von St\u00f6rungen als auch algorithmisch effizient umsetzbar.<\/p>\n\n\n\n<p>Im Kern wird der Phasenwinkel \\(\\theta\\) berechnet mittels<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03b8<\/mi><mo>=<\/mo><mrow><mtext><\/mtext><mi>atan2<\/mi><\/mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>S<\/mi><mo separator=\"true\">,<\/mo><mi>C<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>\u2208<\/mo><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mo form=\"prefix\" stretchy=\"false\">\u2212<\/mo><mi>\u03c0<\/mi><mo separator=\"true\">,<\/mo><mi>\u03c0<\/mi><mo form=\"postfix\" stretchy=\"false\">]<\/mo><mi>.<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\theta = \\mathrm{atan2}(S, C) \\in (-\\pi, \\pi].<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>wobei<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mtable displaystyle=\"true\" columnalign=\"right left\" class=\"tml-jot\"><mtr><mtd class=\"tml-right\" style=\"padding-left:0em;padding-right:0em;\"><mi>S<\/mi><\/mtd><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mrow><mi>W<\/mi><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/munderover><\/mrow><mi>v<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mspace width=\"0.1667em\"><\/mspace><mrow><mspace width=\"0.1667em\"><\/mspace><mi>sin<\/mi><mo>\u2061<\/mo><mspace width=\"0.1667em\"><\/mspace><\/mrow><mi>\u03c6<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><mtr><mtd class=\"tml-right\" style=\"padding-left:0em;padding-right:0em;\"><mi>C<\/mi><\/mtd><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mrow><mi>W<\/mi><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/munderover><\/mrow><mi>v<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mspace width=\"0.1667em\"><\/mspace><mrow><mspace width=\"0.1667em\"><\/mspace><mi>cos<\/mi><mo>\u2061<\/mo><mspace width=\"0.1667em\"><\/mspace><\/mrow><mi>\u03c6<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><annotation encoding=\"application\/x-tex\">\\begin{aligned}\nS &amp;= \\sum_{x=0}^{W-1} v(x)\\,\\sin\\varphi(x)\\\\ \nC &amp;= \\sum_{x=0}^{W-1} v(x)\\,\\cos\\varphi(x)\n\\end{aligned}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>\\(W\\) stellt dabei die Bildbreite, \\(v(x)\\) das 1D-Helligkeitsprofil zentriert, und \\(\\varphi(x)\\) die kumulative Phase dar. Hier wird ein weiteres Potential des Ansatzes sichtbar:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03c6<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><msubsup><mo movablelimits=\"false\">\u222b<\/mo><mn>0<\/mn><mi>x<\/mi><\/msubsup><mfrac><mrow><mn>2<\/mn><mi>\u03c0<\/mi><\/mrow><mrow><mi>P<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03be<\/mi><mo form=\"postfix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">)<\/mo><\/mrow><\/mfrac><mspace width=\"0.1667em\"><\/mspace><mi>d<\/mi><mi>\u03be<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\varphi(x) = \\int_{0}^{x} \\frac{2\\pi}{P(\\xi)} \\, d\\xi<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>ist in unsererem Anwendungsfall diskret (wir haben das 1D Helligkeitsprofil eines Pixelbildes):<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03c6<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>k<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mi>x<\/mi><\/munderover><\/mrow><mfrac><mrow><mn>2<\/mn><mi>\u03c0<\/mi><\/mrow><mrow><mi>P<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>k<\/mi><mo form=\"postfix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">)<\/mo><\/mrow><\/mfrac><\/mrow><annotation encoding=\"application\/x-tex\">\\varphi(x) = \\sum_{k=0}^{x} \\frac{2\\pi}{P(k)}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>und kann somit berechnet werden als<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mrow><mi mathvariant=\"normal\">\u0394<\/mi><\/mrow><mi>\u03c6<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mfrac><mrow><mn>2<\/mn><mi>\u03c0<\/mi><\/mrow><mrow><mi>P<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">)<\/mo><\/mrow><\/mfrac><\/mrow><annotation encoding=\"application\/x-tex\">\\Delta\\varphi(x) = \\frac{2\\pi}{P(x)}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>\\(P(x)\\) resultiert aus der Verzeichnung der Optik und der Neigung der optischen Achse zur Millimeterspur. In diesen Genauigkeitsbereich reichen Verkippung und radialsymmetrische Verzeichnung zusammengefasst und reduziert zur 2. Ordnung: <\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>P<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><msub><mi>P<\/mi><mn>0<\/mn><\/msub><mo>+<\/mo><mfrac><mrow><mi>d<\/mi><mi>P<\/mi><\/mrow><mrow><mi>d<\/mi><mi>x<\/mi><\/mrow><\/mfrac><mspace width=\"0.1667em\"><\/mspace><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo>\u2212<\/mo><msub><mi>x<\/mi><mn>0<\/mn><\/msub><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>+<\/mo><mfrac><mrow><msup><mi>d<\/mi><mn>2<\/mn><\/msup><mi>P<\/mi><\/mrow><mrow><mi>d<\/mi><msup><mi>x<\/mi><mn>2<\/mn><\/msup><\/mrow><\/mfrac><mspace width=\"0.1667em\"><\/mspace><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo>\u2212<\/mo><msub><mi>x<\/mi><mn>0<\/mn><\/msub><msup><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mn>2<\/mn><\/msup><mspace width=\"2em\"><\/mspace><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mfrac><mtext>px<\/mtext><mtext>mm<\/mtext><\/mfrac><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mrow><annotation encoding=\"application\/x-tex\">P(x) = P_0 + \\frac{dP}{dx}\\,(x &#8211; x_0)\n             + \\frac{d^2P}{dx^2}\\,(x &#8211; x_0)^2\n  \\qquad \\left[\\frac{\\text{px}}{\\text{mm}}\\right]<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>So ergeben sich vier Kalibrierungsparameter \\(P_0\\) (Basisperiode bei \\(x_0\\)), \\(dP\/dx\\) (linearer Koeffizient), \\(d^2P\/dx^2\\) (quadratischer Koeffizient) und \\(x_0\\) (Referenzposition). Diese werden von der Kalibrierungssoftware auf dem Desktop-System berechnet, an das Device \u00fcbertragen und dort persistent gespeichert.<\/p>\n\n\n\n<p>Da diese Parameter zwischen Kalibrierungen als konstant angesehen werden k\u00f6nnen, reduzieren sich \\(S\\) und \\(C\\) zu<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mtable displaystyle=\"true\" columnalign=\"right left\" class=\"tml-jot\"><mtr><mtd class=\"tml-right\" style=\"padding-left:0em;padding-right:0em;\"><mi>S<\/mi><\/mtd><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mrow><mi>W<\/mi><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/munderover><\/mrow><mi>v<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mspace width=\"0.1667em\"><\/mspace><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><mtr><mtd class=\"tml-right\" style=\"padding-left:0em;padding-right:0em;\"><mi>C<\/mi><\/mtd><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mrow><mi>W<\/mi><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/munderover><\/mrow><mi>v<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mspace width=\"0.1667em\"><\/mspace><mi>c<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><annotation encoding=\"application\/x-tex\">\\begin{aligned}\nS &amp;= \\sum_{x=0}^{W-1} v(x)\\,s(x)\\\\ \nC &amp;= \\sum_{x=0}^{W-1} v(x)\\,c(x)\n\\end{aligned}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>und \\(s(x)\\) und \\(c(x)\\) k\u00f6nnen als konstante Tabelle vorberechnet und im RAM oder ROM vorgehalten werden. <\/p>\n\n\n\n<p>Erg\u00e4nzt wird nun eine G\u00fcteberechnung, die Signalenergie \\(E\\):<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>E<\/mi><mo>=<\/mo><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mrow><mi>W<\/mi><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/munderover><\/mrow><mi>v<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><msup><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mn>2<\/mn><\/msup><\/mrow><annotation encoding=\"application\/x-tex\">E = \\sum_{x=0}^{W-1} v(x)^2<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Damit reduziert sich der Rechenaufwand f\u00fcr den Sinus- und Cosinus-Teil jeweils auf eine Multiplikation und eine Addition pro Spalte.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tfloat sin_sum = 0.0f;\n\tfloat cos_sum = 0.0f;\n\tfloat energy = 0.0f;\n\n\tfor (int col = 0; col &lt; IMAGE_WIDTH; col++)\n\t{\n\t\tconst float value = mean - (float)one_dim&#x5B;col];\n\n\t\tsin_sum += value * sin_col&#x5B;col];\n\t\tcos_sum += value * cos_col&#x5B;col];\n\t\tenergy += value * value;\n\t}\n<\/pre><\/div>\n\n\n<p>Auf Basis der Signalenergie \\(E\\) wird die Konfidenz des Messwerts \\(\\gamma\\) als normiertes Verh\u00e4ltnis der Korrelationsamplitude zur Signalenergie definiert:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03b3<\/mi><mo>=<\/mo><mfrac><msqrt><mrow><msup><mi>S<\/mi><mn>2<\/mn><\/msup><mo>+<\/mo><msup><mi>C<\/mi><mn>2<\/mn><\/msup><\/mrow><\/msqrt><msqrt><mrow><mi>E<\/mi><mo>+<\/mo><mi>\u03b5<\/mi><\/mrow><\/msqrt><\/mfrac><mspace width=\"2em\"><\/mspace><mtext>mit&nbsp;<\/mtext><mi>\u03b5<\/mi><mo>=<\/mo><msup><mn>10<\/mn><mrow><mo lspace=\"0em\" rspace=\"0em\">\u2212<\/mo><mn>12<\/mn><\/mrow><\/msup><\/mrow><annotation encoding=\"application\/x-tex\">\\gamma = \\frac{\\sqrt{S^2 + C^2}}{\\sqrt{E + \\varepsilon}}\n  \\qquad \\text{mit } \\varepsilon = 10^{-12}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Der Term \\(\\varepsilon\\) sch\u00fctzt pragmatisch vor Division durch Null bei einem vollst\u00e4ndig konstanten Bild (\\(v(x) \\equiv 0\\)).<\/p>\n\n\n\n<p>Die Interpretation von \\(\\gamma\\): <\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03b3<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">{<\/mo><mtable><mtr><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><mtd class=\"tml-left\" style=\"padding-left:1em;padding-right:0em;\"><mtext>perfekte&nbsp;Korrelation&nbsp;(reiner&nbsp;Sinus)<\/mtext><\/mtd><\/mtr><mtr><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mn>0<\/mn><\/mtd><mtd class=\"tml-left\" style=\"padding-left:1em;padding-right:0em;\"><mtext>reines&nbsp;Rauschen,&nbsp;keine&nbsp;periodische&nbsp;Struktur<\/mtext><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\"><\/mo><\/mrow><\/mrow><annotation encoding=\"application\/x-tex\">  \\gamma = \\begin{cases}\n    1 &amp; \\text{perfekte Korrelation (reiner Sinus)} \\\\\n    0 &amp; \\text{reines Rauschen, keine periodische Struktur}\n  \\end{cases}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Darauf aufbauend wird eine G\u00fcltigkeitsschwelle \\(\\gamma_\\text{min}\\) mit \\(\\gamma \\geq \\gamma_\\text{min}\\) eingef\u00fchrt. <\/p>\n\n\n\n<p>Wichtig f\u00fcr dieses Verfahren ist die vorherige Zentrierung des 1D Helligkeitsprofils:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mtable displaystyle=\"true\" columnalign=\"right left\" class=\"tml-jot\"><mtr><mtd class=\"tml-right\" style=\"padding-left:0em;padding-right:0em;\"><mover><mi>I<\/mi><mo stretchy=\"false\" class=\"tml-capshift\" style=\"math-style:normal;math-depth:0;\">\u203e<\/mo><\/mover><\/mtd><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mo>=<\/mo><mfrac><mn>1<\/mn><mi>W<\/mi><\/mfrac><mrow><munderover><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>x<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><mrow><mi>W<\/mi><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/munderover><\/mrow><mi>I<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><mtr><mtd class=\"tml-right\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mi>v<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mo>=<\/mo><mover><mi>I<\/mi><mo stretchy=\"false\" class=\"tml-capshift\" style=\"math-style:normal;math-depth:0;\">\u203e<\/mo><\/mover><mo>\u2212<\/mo><mi>I<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><annotation encoding=\"application\/x-tex\">\\begin{aligned}\n\\bar{I} &amp;= \\frac{1}{W} \\sum_{x=0}^{W-1} I(x) \\\\\nv(x) &amp;= \\bar{I} &#8211; I(x)\n\\end{aligned}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Die Konvention \\(\\bar{I} &#8211; I(x)\\) (statt \\(I(x) &#8211; \\bar{I}\\)) sorgt daf\u00fcr, dass dunkle Striche, die im Bild niedrige Helligkeitswerte haben, positive Werte in \\(v(x)\\) liefern. Dadurch ist die Phase \\(\\theta\\) bei einem Strich am Ursprung \\(\\varphi = 0\\) ebenfalls \\(\\theta = 0\\).<\/p>\n\n\n\n<p>Zusammenfassung der Eigenschaften des Verfahrens:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rauschrobust: <br>Die vertikale Summation \u00fcber den ROI sowie die Korrelation \u00fcber die gesamte Bildbreite wirken wie ein stark mittelndes Matched-Filter.<\/li>\n\n\n\n<li>Hohe Aufl\u00f6sung: <br>Die Phasenaufl\u00f6sung ist durch das Rauschniveau, nicht durch die Pixel-Rasterweite begrenzt; sub-Pixel- bzw. sub-Perioden-Genauigkeit wird durch die kontinuierliche \\(\\mathrm{atan2}\\)-Berechnung erreicht.<\/li>\n\n\n\n<li>Modellgetrieben: <br>Das quadratische Periodenmodell kompensiert Objektivverzeichnung und perspektivische Effekte direkt in der Referenzphase \\(\\varphi(x)\\).<\/li>\n\n\n\n<li>Deterministisch: <br>Kein iteratives Optimierungsverfahren; die Laufzeit pro Bild ist konstant und vorhersagbar:\n<ul class=\"wp-block-list\">\n<li> \\(O(W \\cdot H_\\text{ROI})\\) f\u00fcr Summation<\/li>\n\n\n\n<li>\\(O(W)\\) f\u00fcr die Korrelation<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Selbstdiagnose: <br>Die Konfidenz \\(\\gamma\\) liefert ein quantitatives G\u00fctema\u00df f\u00fcr jede einzelne Messung.<\/li>\n<\/ul>\n\n\n\n<p>Zu sehen ist ein robustes Verfahren mit geringem Rechenaufwand, sehr gut f\u00fcr ein Vermessungsger\u00e4t mit geringer Rechenkraft geeignet. Die n\u00e4chsten Teile zeigen dagegen die Berechnungsverfahren der Kalibrierungsanwendung, welche deutlich mehr Rechenaufwand ben\u00f6tigen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je nach zu kalibrierendem Messger\u00e4t kann es sinnvoll sein, die Kalibrierung im Ger\u00e4t selbst zu realisieren oder auszulagern. Dieses Beispiel zeigt einen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,23,15,22],"tags":[28,42,12],"class_list":["post-922","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-embedded-programmierung","category-embedded-vision","category-optik","tag-embedded","tag-numerik","tag-programmierung"],"_links":{"self":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=922"}],"version-history":[{"count":29,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/922\/revisions"}],"predecessor-version":[{"id":962,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/922\/revisions\/962"}],"wp:attachment":[{"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}