Vibrationswellenformen analysieren

Die gängigsten Vibrationsaktoren auf Android-Geräten sind lineare Resonanzsaktoren (LRAs). LRAs simulieren das Gefühl eines Tastenklicks auf einer ansonsten nicht reagierenden Glasoberfläche. Ein klares und deutliches Klickfeedbacksignal dauert in der Regel zwischen 10 und 20 Millisekunden. Dieser Effekt macht die Interaktionen der Nutzer natürlicher. Bei virtuellen Tastaturen kann dieses Klickfeedback die Tippgeschwindigkeit erhöhen und Fehler reduzieren.

LRAs haben einige gängige Resonanzfrequenzen:

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

Bei gleicher Eingangsspannung bei zwei verschiedenen Frequenzen können die Vibrationsausgabeamplituden unterschiedlich sein. Je weiter die Frequenz von der Resonanzfrequenz des LRA entfernt ist, desto niedriger ist die Vibrationsamplitude.

Für die haptischen Effekte eines bestimmten Geräts werden sowohl der Vibrationsaktor als auch sein Treiber verwendet. Haptische Treiber mit Übersteuerungs- und aktiven Bremsfunktionen können die Anlaufzeit und das Klingeln von LRA verringern, was zu einer reaktionsschnelleren und klareren Vibration führt.

Vibrationsausgangsbeschleunigung

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

Die meisten LRA-Motoren haben einen einzelnen Spitzenwert in ihrer FOAM, in der Regel in der Nähe ihrer Resonanzfrequenz. Die Beschleunigung nimmt in der Regel exponentiell ab, wenn die Frequenz von diesem Bereich abweicht. Die Kurve ist möglicherweise nicht symmetrisch und weist um die Resonanzfrequenz herum ein Plateau auf, um den Motor vor Schäden zu schützen.

Das nebenstehende Diagramm zeigt ein Beispiel für ein FOAM für einen LRA-Motor.

Bei einer Frequenz von etwa 120 Hz steigt die Beschleunigung exponentiell an. Die Beschleunigung bleibt dann bis etwa 180 Hz konstant, bevor sie nachlässt.
Beispiel für ein FOAM für einen LRA-Motor.

Grenzwert für die Erkennung durch Menschen

Der Schwellenwert für die menschliche Wahrnehmung bezieht sich auf die minimale Beschleunigung einer Vibration, die eine Person zuverlässig wahrnehmen kann. Dieser Wert variiert je nach Vibrationshäufigkeit.

Die nebenstehende Grafik zeigt den Erkennungsgrenzwert für die haptische Wahrnehmung von Menschen in Beschleunigung als Funktion der zeitlichen Frequenz. Die Grenzwertdaten werden aus dem Verschiebungsgrenzwert in Abbildung 1 von Bolanowski Jr., S. J. et al., 1988, Four channels mediate the mechanical aspects of touch.

Android prüft diesen Grenzwert automatisch in der BasicEnvelopeBuilder. Dabei wird sichergestellt, dass alle Effekte einen Frequenzbereich verwenden, der Vibrationsamplituden erzeugt, die den Grenzwert für die menschliche Wahrnehmung um mindestens 10 dB überschreiten.

Mit zunehmender Frequenz auf etwa 20 Hz steigt der menschliche Erkennungsgrenzwert logarithmisch auf etwa −35 dB an. Der Grenzwert bleibt bis etwa 200 Hz unverändert, danach steigt er ungefähr linear auf −20 dB an.
Grenzwert für die haptische Wahrnehmung von Menschen.

In einer Onlineanleitung wird die Umwandlung zwischen Beschleunigungsamplitude und Verschiebungsamplitude weiter erläutert.

Vibrationsbeschleunigungsstufen

Die menschliche Wahrnehmung der Vibrationsintensität, ein Wahrnehmungsmesswert, steigt nicht linear mit der Vibrationsamplitude, einem physikalischen Parameter. Die wahrgenommene Intensität wird durch den Sensationslevel (SL) gekennzeichnet, der als dB-Wert über dem Erkennungsgrenzwert bei derselben Frequenz definiert ist.

Die entsprechende Vibrationsbeschleunigungsamplitude (in G-Peak) kann so berechnet werden:

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

Dabei ist die Amplitude in Dezibel die Summe aus SL und dem Erkennungsgrenzwert – der Wert entlang der vertikalen Achse im nebenstehenden Diagramm – bei einer bestimmten Frequenz.

Das nebenstehende Diagramm zeigt die Vibrationsbeschleunigungsstufen bei 10, 20, 30, 40 und 50 dB SL sowie den menschlichen Wahrnehmungsgrenzwert für die haptische Wahrnehmung (0 dB SL) als Funktion der zeitlichen Frequenz. Die Daten wurden aus Abbildung 8 in Verrillo, R. T. et al., 1969, Sensation magnitude of vibrotactile stimuli.

Je höher das gewünschte Empfindungsniveau ist, desto höher ist auch die erforderliche Beschleunigung in dB. Beispielsweise entspricht das Sensationsniveau von 10 dB für eine Vibration von 100 Hz etwa −20 dB statt −30 dB.
Vibrationsbeschleunigungsstufen

Android führt diese Umwandlung automatisch in der BasicEnvelopeBuilder durch, die Werte als normalisierte Intensitäten im Sinne des Sensation Level (dBSL) annimmt und in eine Ausgabebeschleunigung umwandelt. Bei WaveformEnvelopeBuilder wird diese Umwandlung hingegen nicht angewendet und die Werte werden stattdessen als normalisierte Ausgabebeschleunigungsamplituden im Beschleunigungsraum (Gs) verwendet. Die Envelope API geht davon aus, dass Designer oder Entwickler, wenn sie über Änderungen der Vibrationsstärke nachdenken, davon ausgehen, dass die wahrgenommene Intensität einer stückweise linearen Envelope folgt.

Standardmäßige Wellenformglättung auf Geräten

Zur Veranschaulichung sehen wir uns an, 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 Grafiken zeigen die Eingabewellenform und die Ausgabebeschleunigung, die den vorherigen Code-Snippets entsprechen. Die Beschleunigung steigt nicht plötzlich, sondern allmählich an, wenn es zu einer sprunghaften Änderung der Amplitude im Muster kommt, also bei 0 ms, 150 ms, 200 ms, 250 ms und 700 ms. Außerdem gibt es bei jeder Stufenänderung der Amplitude einen Überschwinger und ein sichtbares Überschwingen, das mindestens 50 ms dauert, wenn die Eingangsamplitude plötzlich auf 0 fällt.

Darstellung der Eingabewellenform der Schrittfunktion.
Diagramm der tatsächlich gemessenen Wellenform mit natürlicheren Übergängen zwischen den Ebenen.

Verbessertes haptisches Muster

Ändern Sie die Amplituden schrittweise, um Überschwinger zu vermeiden und die Klingelzeit zu verkürzen. Im Folgenden sind die Wellenform- und Beschleunigungsdiagramme der überarbeiteten Version zu sehen:

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 // Do not 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; // Do not repeat.

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

Darstellung der Eingabewellenform mit zusätzlichen Schritten.
Aufgezeichnete Wellenform mit glatteren Übergängen.

Komplexere haptische Effekte erstellen

Andere Elemente einer zufriedenstellenden Klickreaktion sind komplexer und erfordern einige Kenntnisse über die LRA, die auf einem Gerät verwendet wird. Die besten Ergebnisse erzielen Sie mit den vorgefertigten Wellenformen und den von der Plattform bereitgestellten Konstanten des Geräts. So haben Sie folgende Möglichkeiten:

  • Verwenden Sie klare Effekte und Primitive.
  • Sie können sie kombinieren, um neue haptische Effekte zu erstellen.

Mit diesen vordefinierten haptischen Konstanten und Primitiven können Sie Ihre Arbeit erheblich beschleunigen und gleichzeitig hochwertige haptische Effekte erzielen.