Smart Pen: Echtzeit-Handschrifterkennung & Bewegungstracking mit Raspberry Pi & IMU
Einführung
Im digitalen Zeitalter erfordert die Erfassung handschriftlicher Eingaben meist kapazitive Touchscreens oder Stifte. Zwar präzise, sind diese Lösungen durch Oberflächenanforderungen limitiert und bieten keine echte räumliche Freiheit. Unser Smart Pen beseitigt diese Einschränkungen, indem er einen Raspberry Pi mit einer inertialen Messeinheit (IMU) kombiniert, um Bewegungen zu verfolgen und Trajektorien sofort zu rekonstruieren. Das System stützt sich ausschließlich auf Gyroskop und Beschleunigungsmesser der IMU, überträgt Daten drahtlos an den Pi. Eigene Algorithmen bestimmen dann Orientierung und Position, speichern die Daten und rendern sie in Echtzeit auf dem Pi-TFT-Display via pygame. Ein einziger Taster startet und stoppt die Aufzeichnung, was flexible Nutzung an Stiften, Robotern oder Wearables ermöglicht. Dieser Ansatz liefert eine vielseitige, oberflächenunabhängige Lösung für Handschrifterfassung, Bewegungsanalyse und mehr.
Ziel
Kernziel ist die Entwicklung eines modularen Tracking-Moduls, das an Stifte, Roboter oder sogar menschliche Gliedmaßen angebracht werden kann. Wenn sich der Träger bewegt, zeichnet das Modul seine Trajektorie auf und projiziert den Pfad auf einen horizontalen Weltrahmen auf dem Bildschirm. Im Gegensatz zu herkömmlichen Stiftsystemen arbeitet unser Design unabhängig von vordefinierten Ebenen und trackt Bewegung in freier Luft oder auf unregelmäßigen Oberflächen. Die orientierungsunempfindliche Leistung des Moduls gewährleistet konsistente Ergebnisse unabhängig von Neigung oder Platzierung.
IMU-Kalibrierung
Fertigungstoleranzen führen oft zu Fehlausrichtungen der IMU-Achsen von Beschleunigungsmesser und Gyroskop, was Diskrepanzen bei berechneten Euler-Winkeln verursacht. Wir nutzen eine Sechs-Positionen-Kalibrierroutine, um diese Offsets zu quantifizieren und zu korrigieren. Eine maßgefertigte Kalibrierhalterung (Abbildung XX) hält die IMU in jeder Orientierung und rohe Sensordaten werden aufgezeichnet. Die daraus abgeleitete Kalibriermatrix wird auf jede Beschleunigungsmessung angewendet:
\[\mathbf{A}_{\text{cal}} = \begin{bmatrix}A_x\\A_y\\A_z\end{bmatrix}, \quad \mathbf{a}_{\text{raw}} = \begin{bmatrix}a_x\\a_y\\a_z\end{bmatrix}\]
Nach Kalibrierung ersetzt der korrigierte Beschleunigungsvektor \(\mathbf{A}_{\text{cal}}\) die Rohdaten für die weitere Verarbeitung.
Sensorfusion für Rohdaten
Für eine robuste Orientierungsschätzung fusionieren wir Gyroskop- und Beschleunigungsmesser-Ausgaben mittels Quaternionenmathematik. Quaternionen bieten singularitätsfreie Rotationsdarstellung und vereinfachen Vektortransformationen. Die Umwandlung zwischen Quaternion \(q\) und Euler-Winkeln \((\alpha,\beta,\gamma)\) lautet:
\[\displaystyle q = \cos\frac{\theta}{2} + \sin\frac{\theta}{2}\bigl(\cos\alpha\,\mathbf{i} + \cos\beta\,\mathbf{j} + \cos\gamma\,\mathbf{k}\bigr)\]
Für einen festen Vektor \(\mathbf{V} = V_x\mathbf{i} + V_y\mathbf{j} + V_z\mathbf{k}\) erfolgt Quaternion-Rotation als \(\mathbf{V}' = q \circ \mathbf{V} \circ q^{-1}\).
Da das Gyroskop allein mit der Zeit driftet, korrigieren wir seinen Bias kontinuierlich, indem wir den gemessenen Gravitationsvektor vom Beschleunigungsmesser mit der gyroskopabgeleiteten Gravitationsschätzung vergleichen. Die UpdateIMU-Routine führt 2.000 Iterationen im Stillstand aus und baut einen proportional-integralen (PI) Rückführungsloop auf, der den Winkel minimiert. Der Kernalgorithmus:
def UpdateIMU(self, Gyr, Acc): if np.linalg.norm(Acc) == 0: warnings.warn("Accelerometer magnitude is zero. Algorithm update aborted.") return Acc = np.array(Acc / np.linalg.norm(Acc)) v = np.array([[2*(self.q[1]*self.q[3] - self.q[0]*self.q[2])], [2*(self.q[0]*self.q[1] + self.q[2]*self.q[3])], [self.q[0]**2 - self.q[1]**2 - self.q[2]**2 + self.q[3]**2]]) error = np.cross(v, np.transpose([Acc]), axis=0) self.IntError += error Ref = Gyr - np.transpose(self.Kp*error + self.Ki*self.IntError) pDot = 0.5 * self.quaternProd_single(self.q, [0, Ref[0,0], Ref[0,1], Ref[0,2]]) self.q += pDot * self.SamplePeriod self.q /= np.linalg.norm(self.q) self.Quaternion = self.quaternConj(self.q)
Die korrigierten Gyroskopdaten (Ref) fließen in das Quaternion-Update ein und liefern eine stabile Orientierungsschätzung, die die auf dem Pi angezeigte Trajektorienerrechnung antreibt.
Mehr lesen: Smart Pen – Abschlussprojekt für ECE5725
Herstellungsprozess
- Sensorbasierte Projektideen für Abschlussarbeiten im Ingenieurstudium
- Smart Manufacturing 2021: 10 aufstrebende Trends, die Produktion neu formen
- Smart Lighting: Der Eckpfeiler einer wahrhaft vernetzten Stadt
- FirePick Delta Projektlog: Open-Source MicroFactory mit OpenPnP aufbauen
- "Geh-Weg-Roboter" – Einfaches Arduino-Starterset für Kinder
- Health Band: Smarter Wearable-Assistent für Senioren
- Top Smart Home Upgrades für modernes Wohnen
- ROI in der Smart Manufacturing maximieren: Amortisation und datengesteuerter Erfolg
- Revolutionärer ultra-dünner Sensor verbessert Smart-Contact-Lens-Funktionalität
- Das richtige Automatisierungsprojekt wählen: Ein strategischer Leitfaden