Titreşim dalga formlarını analiz etme

Bu belgede, Android cihazlardaki yaygın titreşim aktüatörleri olarak Doğrusal Rezonanslı Aktüatörler (LRA'lar) açıklanmakta, özellikleri, dokunsal geri bildirim oluşturma şekilleri ve Android API'lerini kullanarak etkili dokunsal desenler oluşturma yöntemleri ayrıntılı olarak anlatılmaktadır. keywords_public: > Android haptics, haptic actuators, Linear Resonant Actuators, LRAs, vibration, haptic feedback, VibratorFrequencyProfile, VibrationEffect, Android UI

Android cihazlarda en yaygın titreşim aktüatörleri doğrusal rezonanslı aktüatörlerdir (LRA). LRAs, aksi takdirde yanıt vermeyen bir cam yüzeyde düğme tıklama hissini simüle eder. Net ve belirgin bir tıklama geri bildirimi sinyali genellikle 10 ila 20 milisaniye sürer. Bu his, kullanıcı etkileşimlerinin daha doğal olmasını sağlar. Sanal klavyelerde bu tıklama geri bildirimi, yazma hızını artırabilir ve hataları azaltabilir.

LRAs'nın birkaç yaygın rezonans frekansı vardır:

  • Bazı LRAs'ların rezonans frekansları 200-300 Hz aralığındadır. Bu aralık, insan derisinin titreşime en duyarlı olduğu frekansla çakışır. Bu frekans aralığındaki titreşim hissi genellikle yumuşak, keskin ve nüfuz edici olarak tanımlanır.
  • Diğer LRA modellerinin rezonans frekansları daha düşüktür (yaklaşık 150 Hz). Bu modellerde his, niteliksel olarak daha yumuşak ve daha dolgundur (boyut olarak).
Bileşenler, üstten alta doğru sırasıyla kapak, plaka, orta mıknatıs, 2 yan mıknatıs, kütle, 2 yay, bobin, esnek devre, taban ve yapıştırıcıdan oluşur.
Doğrusal rezonanslı aktüatörün (LRA) bileşenleri.

İki farklı frekansta aynı giriş voltajı verildiğinde titreşim çıkış genlikleri farklı olabilir. Frekans, LRA'nın rezonans frekansından ne kadar uzak olursa titreşim genliği o kadar düşük olur.

Belirli bir cihazın dokunsal efektleri hem titreşim aktüatörünü hem de sürücüsünü kullanır. Overdrive ve aktif frenleme özelliklerini içeren dokunsal sürücüler, LRA'ların yükselme süresini ve çınlamasını azaltarak daha duyarlı ve net bir titreşim sağlar.

Titreşim motoru çıkış hızlanması

Frekans-çıkış-ivme eşlemesi (FOAM), belirli bir titreşim frekansında (Hertz cinsinden) elde edilebilecek maksimum çıkış ivmesini (G cinsinden) tanımlar. Android 16'dan (API düzeyi 36) itibaren platform, VibratorFrequencyProfile aracılığıyla bu eşlemeye yerleşik destek sunar. Dokunsal efektler oluşturmak için bu sınıfı basic ve advanced zarf API'leriyle birlikte kullanabilirsiniz.

Çoğu LRA motorunun FOAM'ında tek bir tepe noktası bulunur. Bu nokta genellikle rezonans frekansının yakınındadır. Hızlanma, frekans bu aralıktan uzaklaştıkça genellikle üstel olarak azalır. Eğri simetrik olmayabilir ve motoru hasardan korumak için rezonans frekansı civarında bir plato içerebilir.

Bitişik grafik, LRA motoru için bir FOAM örneğini gösterir.

Frekans yaklaşık 120 Hz'e yükseldikçe ivme üstel olarak artar. İvme, yaklaşık 180 Hz'e kadar sabit kalır ve bu noktadan sonra azalır.
LRA motoru için örnek FOAM.

İnsan algısı algılama eşiği

İnsan algısı algılama eşiği, bir kişinin güvenilir bir şekilde algılayabileceği titreşimin minimum ivmesini ifade eder. Bu seviye, titreşim frekansına göre değişir.

Yandaki grafik, zamansal frekansın bir fonksiyonu olarak, ivme cinsinden insanın dokunsal algı algılama eşiğini gösterir. Eşik verileri, Bolanowski Jr.'ın 1. Şekli'ndeki yer değiştirme eşiğinden dönüştürülür. S. J. ve diğerlerinin 1988 tarihli makalesi, "Four channels mediate the mechanical aspects of touch.".

Android, bu eşiği BasicEnvelopeBuilder içinde otomatik olarak işler. Bu, tüm efektlerin, titreşim genliklerini insan algısı algılama eşiğini en az 10 dB aşacak şekilde üreten bir frekans aralığı kullandığını doğrular.

Sıklık yaklaşık 20 Hz'e yükseldiğinde, gerçek kişi tarafından yapılan tespit eşiği logaritmik olarak yaklaşık -35 dB'ye yükselir. Eşik, yaklaşık 200 Hz'e kadar sabit kalır. Bu noktadan sonra yaklaşık olarak doğrusal bir şekilde -20 dB'ye kadar artar.
İnsanın dokunma algısı algılama eşiği.

Online bir eğitimde ivme genliği ile yer değiştirme genliği arasındaki dönüşüm daha ayrıntılı olarak açıklanmaktadır.

Titreşim ivmesi seviyeleri

Titreşim yoğunluğunun insan algısı (bir algı ölçüsü), titreşim genliği (bir fiziksel parametre) ile doğrusal olarak artmaz. Algılanan yoğunluk, aynı frekansta algılama eşiğinin üzerindeki dB miktarı olarak tanımlanan duyum düzeyi (SL) ile karakterize edilir.

İlgili titreşim ivmesi genliği (G tepe değerinde) aşağıdaki gibi hesaplanabilir:

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

...burada genlik dB, belirli bir frekansta SL ve algılama eşiğinin toplamıdır. Bu değer, bitişik grafikteki dikey eksen boyunca yer alır.

Yandaki grafikte, titreşim ivmesi seviyeleri 10, 20, 30, 40 ve 50 dB SL'de, zamansal frekansın bir fonksiyonu olarak insan dokunsal algılamasının algılama eşiği (0 dB SL) ile birlikte gösterilmektedir. Veriler, Verrillo, R. adlı çalışmadaki Şekil 8'den tahmin edilmiştir. T. ve diğerlerinin 1969 tarihli makalesi, "Sensation magnitude of vibrotactile stimuli.".

İstenen duygu düzeyi arttıkça, gereken ivme (dB cinsinden) yaklaşık olarak aynı miktarda artar. Örneğin, 100 Hz'lik bir titreşim için 10 dB'lik
       duyma seviyesi -30 dB yerine yaklaşık -20 dB'dir.
Titreşim ivmesi seviyeleri.

Android, bu dönüştürme işlemini otomatik olarak BasicEnvelopeBuilder içinde gerçekleştirir. Bu işlem, değerleri duyum seviyesi alanında (dB SL) normalleştirilmiş yoğunluklar olarak alır ve çıkış ivmesine dönüştürür. Diğer yandan WaveformEnvelopeBuilder bu dönüşümü uygulamaz ve değerleri ivme alanında (Gs) normalleştirilmiş çıkış ivmesi genlikleri olarak alır. Envelope API, bir tasarımcı veya geliştirici titreşim gücündeki değişiklikleri düşündüğünde algılanan yoğunluğun parçalı doğrusal bir envelope'u takip etmesini beklediğini varsayar.

Cihazlarda varsayılan dalga biçimi düzeltme

Örnek olarak, özel bir dalga biçimi deseninin genel bir cihazda nasıl davrandığını ele alalım:

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

Aşağıdaki grafiklerde, giriş dalga biçimi ve önceki kod snippet'lerine karşılık gelen çıkış ivmesi gösterilmektedir. Desende genlikte adım değişikliği olduğunda (yani 0 ms, 150 ms, 200 ms, 250 ms ve 700 ms'de) hızlanmanın aniden değil, kademeli olarak arttığını unutmayın. Ayrıca, genlikteki her adım değişikliğinde aşma ve giriş genliği aniden 0'a düştüğünde en az 50 ms süren görünür çınlama vardır.

Adım işlevi giriş dalga biçiminin grafiği.
Seviyeler arasında daha fazla organik geçiş gösteren, gerçekte ölçülen dalga biçiminin grafiği.

İyileştirilmiş dokunsal desen

Aşmayı önlemek ve çınlama süresini azaltmak için genlikleri daha kademeli olarak değiştirin. Aşağıda, revize edilmiş sürümün dalga formu ve ivme grafikleri gösterilmektedir:

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

Ek adımlarla giriş dalga biçiminin grafiği.
Daha yumuşak geçişler gösteren, ölçülen dalga formunun grafiği.

Daha karmaşık dokunsal efektler oluşturma

Tatmin edici bir tıklama yanıtındaki diğer öğeler daha karmaşıktır ve cihazda kullanılan LRA hakkında bilgi sahibi olmayı gerektirir. En iyi sonuçlar için cihazın önceden üretilmiş dalga biçimlerini ve platform tarafından sağlanan sabitlerini kullanın. Bu sayede şunları yapabilirsiniz:

  • Net efektler ve temel şekiller oluşturun.
  • Yeni dokunsal efektler oluşturmak için bunları birleştirin.

Bu önceden tanımlanmış dokunsal sabitler ve temel öğeler, yüksek kaliteli dokunsal efektler oluştururken işinizi büyük ölçüde hızlandırabilir.