Vibrationswellenformen analysieren

Die häufigsten Vibrationsaktuatoren auf Android-Geräten sind lineare Resonanz aktuatoren (Linear Resonant Actuators, LRAs). LRAs simulieren das Gefühl eines Klicks auf eine ansonsten nicht reagierende Glasoberfläche. Ein klares und prägnantes Klick-Feedback-Signal 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 gemeinsame 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. Die Vibrationen in diesem Frequenzbereich werden in der Regel als sanft, scharf und durchdringend beschrieben.
  • Andere LRA-Modelle 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: 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 Vibrationsamplitude.

Die haptischen Effekte eines bestimmten Geräts verwenden sowohl den Vibrationsaktuator als auch seinen Treiber. Haptische Treiber mit Übersteuerungs- und aktiven Bremsfunktionen können die Anstiegszeit und das Klingeln von LRAs reduzieren, was zu einer reaktionsschnelleren und klareren Vibration führt.

Ausgangsbeschleunigung des Vibrators

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

Die meisten LRA-Motoren haben einen einzelnen Peak in ihrer FOAM, in der Regel in der Nähe ihrer Resonanzfrequenz. Die Beschleunigung nimmt im Allgemeinen exponentiell ab, wenn die Frequenz 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.

Die angrenzende Grafik zeigt eine Beispiel-FOAM für einen LRA-Motor.

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-FOAM für einen LRA-Motor.

Erkennungsgrenzwert für die menschliche Wahrnehmung

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.

Die angrenzende Grafik zeigt den Erkennungsgrenzwert für die haptische Wahrnehmung des Menschen in der Beschleunigung als Funktion der zeitlichen Frequenz. Die Grenzwertdaten wurden aus dem Grenzwert für die Verschiebung in Abbildung 1 des Artikels von Bolanowski Jr., S. J. et al. aus dem Jahr 1988, „Four channels mediate the mechanical aspects of touch.“, konvertiert.

Android verarbeitet diesen Grenzwert automatisch in BasicEnvelopeBuilder. Dabei wird geprüft, ob alle Effekte einen Frequenzbereich verwenden, der Vibrationsamplituden erzeugt, die den Erkennungsgrenzwert für die menschliche Wahrnehmung um mindestens 10 dB übersteigen.

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 danach bis zu -20 dB ungefähr linear an.
Erkennungsgrenzwert für die haptische Wahrnehmung des Menschen.

In einem Online-Tutorial wird die Umrechnung zwischen Beschleunigungs amplitude und Verschiebungsamplitude näher erläutert.

Vibrationsbeschleunigungsstufen

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

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

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

Dabei ist die Amplitude in dB die Summe aus SL und Erkennungsgrenzwert – der Wert entlang der vertikalen Achse in der angrenzenden Grafik – bei einer bestimmten Frequenz.

Die angrenzende Grafik zeigt die Vibrationsbeschleunigungsstufen bei 10, 20, 30, 40 und 50 dB SL sowie den Erkennungsgrenzwert für die haptische Wahrnehmung des Menschen (0 dB SL) als Funktion der zeitlichen Frequenz. Die Daten wurden aus Abbildung 8 im Artikel von Verrillo, R. T. et al. aus dem Jahr 1969, „Sensation magnitude of vibrotactile stimuli“, geschätzt.

Mit zunehmendem gewünschten Empfindungsniveau 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 verarbeitet diese Umrechnung automatisch in BasicEnvelopeBuilder. Dabei werden Werte als normalisierte Intensitäten im Empfindungspegelbereich (dB SL) verwendet und in die Ausgangsbeschleunigung umgewandelt. WaveformEnvelopeBuilder wendet diese Umrechnung dagegen nicht an und verwendet stattdessen Werte als normalisierte Ausgangsbeschleunigungsamplituden im Beschleunigungsbereich (Gs). Die Envelope-API geht davon aus, dass Designer oder Entwickler bei Änderungen der Vibrationsstärke erwarten, dass die wahrgenommene Intensität einer stückweise linearen Envelope folgt.

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

Zur Veranschaulichung betrachten wir, 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 Eingangswellenform und die Ausgangsbeschleunigung, die den vorherigen Code-Snippets entsprechen. Beachten Sie, dass die Beschleunigung allmählich und nicht plötzlich zunimmt, wenn sich die Amplitude im Muster ändert – also bei 0 ms, 150 ms, 200 ms, 250 ms und 700 ms. Bei jeder Änderung der Amplitude gibt es auch eine Überschwingung und ein sichtbares Klingeln, das mindestens 50 ms dauert, wenn die Eingangsamplitude plötzlich auf 0 sinkt.

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

Verbessertes haptisches Muster

Um Überschwingungen zu vermeiden und die Klingelzeit zu verkürzen, ändern Sie die Amplituden allmählicher. 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));

Diagramm der Eingangswellenform 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 in einem Gerät verwendeten LRA. Verwenden Sie für optimale Ergebnisse die vorgefertigten Wellenformen des Geräts und die von der Plattform bereitgestellten Konstanten. Damit können Sie Folgendes tun:

  • Klare Effekte und Primitive ausführen.
  • Sie verketten, um neue haptische Effekte zu erstellen.

Diese vordefinierten haptischen Konstanten und Primitive können Ihre Arbeit bei der Erstellung hochwertiger haptischer Effekte erheblich beschleunigen.