Vibrationswellenformen analysieren

In diesem Dokument werden Linear Resonant Actuators (LRAs) als die gängigen Vibrationsaktuatoren auf Android-Geräten beschrieben. Es wird auf ihre Eigenschaften eingegangen, wie sie haptisches Feedback erzeugen und wie Sie mit Android-APIs effektive haptische Muster erstellen können. keywords_public: > Android-Haptik, haptische Aktuatoren, Linear Resonant Actuators, LRAs, Vibration, haptisches Feedback, VibratorFrequencyProfile, VibrationEffect, Android-Benutzeroberfläche

Die häufigsten Vibrationsaktoren auf Android-Geräten sind Linear Resonant Actuators (LRAs). LRAs simulieren das Gefühl eines Tastenklicks auf einer ansonsten nicht reagierenden Glasoberfläche. Ein deutliches und präzises Klicksignal dauert in der Regel zwischen 10 und 20 Millisekunden. Dadurch fühlen sich Nutzerinteraktionen natürlicher an. Bei virtuellen Tastaturen kann dieses Klick-Feedback die Tippgeschwindigkeit erhöhen und Fehler reduzieren.

LRAs haben einige häufige Resonanzfrequenzen:

  • Einige LRAs hatten Resonanzfrequenzen im Bereich von 200 bis 300 Hz, was mit der Frequenz übereinstimmt, bei der die menschliche Haut am empfindlichsten auf Vibrationen reagiert. Vibrationen in diesem Frequenzbereich werden in der Regel als sanft, scharf und durchdringend beschrieben.
  • Andere Modelle von LRAs haben niedrigere Resonanzfrequenzen, etwa 150 Hz. Das Gefühl ist qualitativ weicher und voller (in der Dimension).
Die Komponenten sind von oben nach unten: Abdeckung, Platte, mittlerer Magnet, 2 Seitenmagnete, Masse, 2 Federn, Spule, flexible Leiterplatte, Sockel und Klebstoff.
Komponenten eines linearen Resonanzaktuators (LRA).

Bei gleicher Eingangsspannung bei zwei verschiedenen Frequenzen können die Amplituden der Vibrationsausgabe unterschiedlich sein. Je weiter die Frequenz von der Resonanzfrequenz des LRA entfernt ist, desto geringer ist die Schwingungsamplitude.

Für die haptischen Effekte eines bestimmten Geräts werden sowohl der Vibrationsaktuator als auch sein Treiber verwendet. Haptische Treiber mit Overdrive- und aktivem Bremsen können die Anstiegszeit und das Klingeln von LRAs reduzieren, was zu einer reaktionsschnelleren und klareren Vibration führt.

Beschleunigung der Vibratorausgabe

Die Frequenz-zu-Ausgabe-Beschleunigungszuordnung (Frequency-to-Output-Acceleration Mapping, FOAM) beschreibt die maximal erreichbare Ausgabebeschleunigung (in G-Spitze) bei einer bestimmten Schwingungsfrequenz (in Hertz). Ab Android 16 (API-Level 36) bietet die Plattform integrierte Unterstützung für diese Zuordnung über die VibratorFrequencyProfile. Sie können diese Klasse zusammen mit den Envelope-APIs basic und advanced verwenden, um haptische Effekte zu erstellen.

Die meisten LRAs haben einen einzelnen Peak in ihrer FOAM, in der Regel in der Nähe ihrer Resonanzfrequenz. Die Beschleunigung nimmt in der Regel exponentiell ab, wenn die Häufigkeit von diesem Bereich abweicht. Die Kurve ist möglicherweise nicht symmetrisch und kann um die Resonanzfrequenz herum ein Plateau aufweisen, um den Motor vor Schäden zu schützen.

Das angrenzende Diagramm zeigt ein Beispiel für die FOAM eines LRA-Motors.

Wenn die Frequenz auf etwa 120 Hz ansteigt, nimmt die Beschleunigung exponentiell zu. Die Beschleunigung bleibt dann bis etwa 180 Hz konstant und nimmt danach ab.
Beispiel für ein FOAM für einen LRA-Motor.

Wahrnehmungsgrenzwert für Menschen

Der Erkennungsgrenzwert für die menschliche Wahrnehmung bezieht sich auf die Mindestbeschleunigung einer Vibration, die eine Person zuverlässig erkennen kann. Dieser Wert variiert je nach Vibrationsfrequenz.

Das angrenzende Diagramm zeigt die Erkennungsschwelle für die haptische Wahrnehmung des Menschen in Bezug auf die Beschleunigung als Funktion der zeitlichen Frequenz. Die Schwellenwertdaten werden aus dem Verschiebungs-Schwellenwert in Abbildung 1 von Bolanowski Jr. S. J., et al.'s 1988 article, "Four channels mediate the mechanical aspects of touch.".

Android verarbeitet diesen Grenzwert automatisch in der BasicEnvelopeBuilder, die dafür sorgt, dass alle Effekte einen Frequenzbereich verwenden, der Vibrationsamplituden erzeugt, die den Grenzwert für die menschliche Wahrnehmung um mindestens 10 dB überschreiten.

Wenn die Frequenz auf etwa 20 Hz ansteigt, steigt die menschliche Erkennungsschwelle logarithmisch auf etwa -35 dB. Die Schwelle bleibt bis etwa 200 Hz konstant und steigt dann bis zu -20 dB ungefähr linear an.
Grenzwert für die Erkennung der haptischen Wahrnehmung des Menschen.

In diesem Online-Tutorial wird die Umrechnung zwischen Beschleunigungsamplitude und Verschiebungsamplitude näher erläutert.

Vibrationsbeschleunigungsstufen

Die menschliche Wahrnehmung der Vibrationsintensität, ein Wahrnehmungsmaß, steigt nicht linear mit der Vibrationsamplitude, einem physikalischen Parameter. Die empfundene Intensität wird durch den Empfindungspegel (Sensation Level, SL) charakterisiert, der als dB-Betrag über der Erkennungsschwelle bei derselben Frequenz definiert ist.

Die entsprechende Schwingungsbeschleunigungsamplitude (in G-Spitze) kann so berechnet werden:

$$ Amplitude(G) = 10^{Amplitude(db)/20} $$

… wobei die Amplitude in dB die Summe aus Schallpegel und Erkennungsschwelle ist – der Wert auf der vertikalen Achse im angrenzenden Diagramm – bei einer bestimmten Frequenz.

Das angrenzende Diagramm zeigt die Vibrationsbeschleunigungspegel bei 10, 20, 30, 40 und 50 dB SL sowie die Erkennungsschwelle für die haptische Wahrnehmung des Menschen (0 dB SL) als Funktion der zeitlichen Frequenz. Die Daten wurden aus Abbildung 8 in Verrillo, R. geschätzt. T., et al.'s 1969 article, "Sensation magnitude of vibrotactile stimuli.".

Wenn das gewünschte Empfindungsniveau steigt, steigt die erforderliche Beschleunigung in dB um etwa denselben Betrag. Beispiel: Die Empfindlichkeitsgrenze von 10 dB für eine Vibration von 100 Hz beträgt etwa -20 dB anstelle von -30 dB.
Vibrationsbeschleunigungsstufen

Android übernimmt diese Umrechnung automatisch im BasicEnvelopeBuilder, das Werte als normalisierte Intensitäten im Empfindungspegelbereich (dB SL) entgegennimmt und in die Ausgabebeschleunigung umwandelt. Bei WaveformEnvelopeBuilder wird diese Umrechnung nicht angewendet. Stattdessen werden die Werte als normalisierte Ausgabebeschleunigungsamplituden im Beschleunigungsraum (G) verwendet. Bei der Envelope API wird davon ausgegangen, dass Designer oder Entwickler bei Änderungen der Vibrationsstärke erwarten, dass die wahrgenommene Intensität einem stückweise linearen Envelope folgt.

Standardmäßige Glättung der Wellenform auf Geräten

Hier sehen Sie, wie sich ein benutzerdefiniertes Wellenformmuster auf einem generischen Gerät verhält:

Kotlin

val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

Die folgenden Diagramme zeigen die Eingabe-Wellenform und die Ausgabebeschleunigung, die den vorherigen Code-Snippets entsprechen. Die Beschleunigung nimmt schrittweise und nicht plötzlich zu, wenn sich die Amplitude im Muster ändert, d. h. bei 0 ms, 150 ms, 200 ms, 250 ms und 700 ms. Bei jeder Amplitudenänderung gibt es auch ein Überschwingen und ein sichtbares Klingeln, das mindestens 50 ms dauert, wenn die Eingabeamplitude plötzlich auf 0 sinkt.

Diagramm der Eingabewellenform der Stufenfunktion.
Diagramm der tatsächlich gemessenen Wellenform mit organischeren Übergängen zwischen den Pegeln.

Verbessertes haptisches Muster

Um Überschwingen zu vermeiden und die Ausklingzeit zu verkürzen, sollten Sie die Amplituden schrittweise ändern. Unten sehen Sie die Wellenform- und Beschleunigungsdiagramme der überarbeiteten Version:

Kotlin

val timings: LongArray = longArrayOf(
    25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
    300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
    38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
    0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] {
        25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
        300, 25, 25, 150, 25, 25, 25
    };
int[] amplitudes = new int[] {
        38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
        0, 85, 170, 255, 170, 85, 0
    };
int repeatIndex = -1; // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

Diagramm der Eingabewellenform mit zusätzlichen Schritten.
Diagramm der gemessenen Wellenform mit sanfteren Übergängen.

Komplexere haptische Effekte erstellen

Andere Elemente einer zufriedenstellenden Klickreaktion sind komplexer und erfordern Kenntnisse des im Gerät verwendeten LRA. Verwende für optimale Ergebnisse die vorgefertigten Wellenformen des Geräts und die von der Plattform bereitgestellten Konstanten. So kannst du Folgendes tun:

  • Führen Sie klare Effekte und Primitive aus.
  • Verketten Sie sie, um neue haptische Effekte zu erstellen.

Diese vordefinierten haptischen Konstanten und Primitiven können Ihre Arbeit beim Erstellen hochwertiger haptischer Effekte erheblich beschleunigen.