Analizowanie przebiegów wibracji

W tym dokumencie wyjaśniamy, czym są liniowe siłowniki rezonansowe (LRA), które są powszechnie stosowane w urządzeniach z Androidem. Opisujemy ich charakterystykę, sposób generowania reakcji haptycznej i tworzenia skutecznych wzorców haptycznych za pomocą interfejsów API Androida. keywords_public: > czujnik haptyczny na Androidzie, siłowniki haptyczne, liniowe siłowniki rezonansowe, LRA, wibracje, reakcja haptyczna, VibratorFrequencyProfile, VibrationEffect, interfejs Androida

Najpopularniejsze siłowniki wibracyjne na urządzeniach z Androidem to liniowe siłowniki rezonansowe (LRA). LRA symulują kliknięcie przycisku na szklanej powierzchni, która w inny sposób nie reaguje. Wyraźny sygnał zwrotny kliknięcia trwa zwykle od 10 do 20 milisekund. Dzięki temu interakcje użytkownika są bardziej naturalne. W przypadku klawiatur wirtualnych ta reakcja na kliknięcie może zwiększyć szybkość pisania i zmniejszyć liczbę błędów.

LRAs mają kilka typowych częstotliwości rezonansowych:

  • Niektóre silniki LRA miały częstotliwości rezonansowe w zakresie 200–300 Hz, co pokrywa się z częstotliwością, przy której skóra ludzka jest najbardziej wrażliwa na wibracje. Wibracje w tym zakresie częstotliwości są zwykle opisywane jako płynne, ostre i przenikliwe.
  • Inne modele siłowników LRA mają niższe częstotliwości rezonansowe, około 150 Hz. Wibracje są jakościowo bardziej miękkie i pełniejsze (w wymiarze).
Komponenty to od góry do dołu: pokrywa, płytka, magnes środkowy, 2 magnesy boczne, masa, 2 sprężyny, cewka, elastyczny obwód, podstawa i klej.
Komponenty liniowego siłownika rezonansowego (LRA).

Przy tym samym napięciu wejściowym przy 2 różnych częstotliwościach amplitudy drgań mogą być różne. Im częstotliwość jest bardziej oddalona od częstotliwości rezonansowej LRA, tym mniejsza jest amplituda drgań.

Efekty haptyczne na danym urządzeniu wykorzystują zarówno siłownik wibracyjny, jak i jego sterownik. Sterowniki haptyczne z funkcjami przesterowania i aktywnego hamowania mogą skrócić czas narastania i tłumienia drgań w przypadku silników liniowych, co przekłada się na bardziej responsywne i wyraźne wibracje.

Przyspieszenie wyjścia wibratora

Mapowanie częstotliwości na przyspieszenie wyjściowe (FOAM) opisuje maksymalne osiągalne przyspieszenie wyjściowe (w G) przy danej częstotliwości drgań (w hercach). Od Androida 16 (poziom API 36) platforma zapewnia wbudowaną obsługę tego mapowania za pomocą VibratorFrequencyProfile. Możesz używać tej klasy wraz z interfejsami API podstawowych i zaawansowanych kopert, aby tworzyć efekty haptyczne.

Większość silników LRA ma jeden szczyt w FOAM, zwykle w pobliżu częstotliwości rezonansowej. Przyspieszenie zwykle maleje wykładniczo wraz z odchyleniem częstotliwości od tego zakresu. Krzywa może nie być symetryczna i może mieć płaską część w pobliżu częstotliwości rezonansowej, aby chronić silnik przed uszkodzeniem.

Na sąsiednim wykresie pokazano przykładową wartość FOAM dla silnika LRA.

Gdy częstotliwość wzrasta do około 120 Hz, przyspieszenie rośnie wykładniczo. Przyspieszenie utrzymuje się na stałym poziomie do około 180 Hz, po czym maleje.
Przykładowy FOAM dla silnika LRA.

Próg wykrywania percepcji człowieka

Próg wykrywania przez człowieka to minimalne przyspieszenie wibracji, które człowiek może wiarygodnie wykryć. Poziom ten zależy od częstotliwości wibracji.

Na sąsiednim wykresie przedstawiono próg wykrywania ludzkiego postrzegania dotykowego w zależności od częstotliwości czasowej. Dane progowe są konwertowane z progu przemieszczenia na rysunku 1 w artykule Bolanowski Jr., S. J. i współautorzy w artykule z 1988 r. „Four channels mediate the mechanical aspects of touch”.

Android automatycznie obsługuje ten próg w BasicEnvelopeBuilder, co potwierdza, że wszystkie efekty wykorzystują zakres częstotliwości, który generuje amplitudy wibracji przekraczające próg wykrywania przez człowieka o co najmniej 10 dB.

Gdy częstotliwość wzrasta do około 20 Hz, próg wykrywania przez człowieka rośnie logarytmicznie do około -35 dB. Próg pozostaje stały do około 200 Hz, po czym rośnie w przybliżeniu liniowo do -20 dB.
Próg wykrywania reakcji haptycznych przez człowieka.

W samouczku online znajdziesz więcej informacji o przeliczaniu amplitudy przyspieszenia na amplitudę przemieszczenia.

Poziomy przyspieszenia wibracji

Ludzkie postrzeganie intensywności wibracji, czyli miara percepcji, nie rośnie liniowo wraz z amplitudą wibracji, czyli parametrem fizycznym. Odczuwalna intensywność jest określana przez poziom odczuwania (SL), który jest definiowany jako wartość w dB powyżej progu wykrywania przy tej samej częstotliwości.

Odpowiednią amplitudę przyspieszenia drgań (w G szczytowym) można obliczyć w ten sposób:

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

…gdzie amplituda w dB to suma poziomu źródła i progu wykrywania – wartość wzdłuż osi pionowej na sąsiednim wykresie – przy określonej częstotliwości.

Na sąsiednim wykresie przedstawiono poziomy przyspieszenia drgań przy 10, 20, 30, 40 i 50 dB SL wraz z progiem wykrywania percepcji dotykowej u ludzi (0 dB SL) w funkcji częstotliwości czasowej. Dane są szacowane na podstawie rysunku 8 w artykule Verrillo, R. T. i in. w artykule z 1969 r. „Sensation magnitude of vibrotactile stimuli”.

Wraz ze wzrostem pożądanego poziomu odczuwania wymagane przyspieszenie w dB rośnie o mniej więcej tę samą wartość. Na przykład poziom odczuwalności wibracji o częstotliwości 100 Hz wynoszący 10 dB to około -20 dB, a nie -30 dB.
Poziomy przyspieszenia wibracji.

Android automatycznie obsługuje tę konwersję w BasicEnvelopeBuilder, która przyjmuje wartości jako znormalizowane natężenia w przestrzeni poziomu odczuwania (dB SL) i przekształca je w przyspieszenie wyjściowe. Z kolei WaveformEnvelopeBuilder nie stosuje tej konwersji i zamiast tego przyjmuje wartości jako znormalizowane amplitudy przyspieszenia wyjściowego w przestrzeni przyspieszenia (Gs). Interfejs Envelope API zakłada, że gdy projektant lub programista myśli o zmianach siły wibracji, oczekuje, że postrzegana intensywność będzie przebiegać zgodnie z liniową obwiednią odcinkową.

Domyślne wygładzanie przebiegu na urządzeniach

Aby to zilustrować, zobacz, jak niestandardowy wzór fali zachowuje się na ogólnym urządzeniu:

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));

Poniższe wykresy przedstawiają przebieg sygnału wejściowego i przyspieszenie wyjściowe odpowiadające poprzednim fragmentom kodu. Pamiętaj, że przyspieszenie wzrasta stopniowo, a nie nagle, gdy następuje skokowa zmiana amplitudy w wzorcu, czyli przy 0 ms, 150 ms, 200 ms, 250 ms i 700 ms. Przy każdej zmianie amplitudy występuje też przekroczenie, a gdy amplituda wejściowa nagle spada do 0, widoczne są drgania trwające co najmniej 50 ms.

Wykres fali wejściowej funkcji krokowej.
Wykres rzeczywistej zmierzonej fali, pokazujący bardziej naturalne przejścia między poziomami.

Ulepszony wzór wibracji

Aby uniknąć przekroczenia wartości docelowej i skrócić czas dzwonienia, zmieniaj amplitudy bardziej stopniowo. Poniżej przedstawiono wykresy przebiegu i przyspieszenia w przypadku zmienionej wersji:

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));

Wykres wejściowej fali z dodatkowymi krokami.
Wykres zmierzonej fali z łagodniejszymi przejściami.

Tworzenie bardziej złożonych efektów dotykowych

Inne elementy w odpowiedzi dotyczącej kliknięcia są bardziej złożone i wymagają pewnej wiedzy o liniowym rezonansowym siłowniku (LRA) używanym w urządzeniu. Aby uzyskać najlepsze wyniki, używaj gotowych przebiegów fal i stałych dostarczonych przez platformę, które umożliwiają:

  • Wykonuj wyraźne efekty i elementy pierwotne.
  • Łącz je, aby tworzyć nowe efekty haptyczne.

Te predefiniowane stałe i podstawowe elementy haptyczne mogą znacznie przyspieszyć pracę podczas tworzenia wysokiej jakości efektów haptycznych.