Triển khai hiệu ứng bao phủ tuyến tính từng phần

Hiệu ứng đường bao tuyến tính từng phần (PWLE) là chuỗi các điểm xác định tần số rung và gia tốc theo thời gian. PWLE mang đến phản hồi xúc giác phong phú và linh hoạt hơn.

Android 16 trở lên cung cấp 2 API dành cho nhà phát triển ứng dụng để giúp tạo hiệu ứng PWLE:

  • API PWLE cơ bản: Đơn giản nhưng có hạn chế. Phù hợp để bắt đầu nhanh chóng. Bạn có thể sử dụng tính năng này tại BasicEnvelopeBuilder.
  • API PWLE nâng cao: Kiểm soát và linh hoạt hơn, yêu cầu kiến thức về xúc giác và một số kiến thức về phần cứng. Có tại WaveformEnvelopeBuilder.

Để hỗ trợ các API này, thiết bị phải triển khai các API HAL sau:

  • Tần suất ánh xạ gia tốc đầu ra (FOAM): Cung cấp một bản ánh xạ tần suất rung đến gia tốc đầu ra tối đa có thể đạt được cho thiết bị.
  • Compose PWLE: Phát một chế độ rung do PWLE của dạng sóng rung xác định.

API PWLE cơ bản

Để nhanh chóng tạo hiệu ứng PWLE mà không cần tìm hiểu sâu về phần cứng hoặc các sắc thái của nhận thức con người, nhà phát triển có thể sử dụng PWLE API cơ bản, được xác định bằng các tham số sau:

  • Giá trị Cường độ trong phạm vi [0, 1] biểu thị cường độ cảm nhận được của rung động. Ví dụ: giá trị 0, 5 được coi là bằng một nửa cường độ tối đa trên toàn cầu mà thiết bị có thể đạt được.
  • Giá trị Độ sắc nét trong phạm vi [0, 1] biểu thị độ sắc nét của rung động. Giá trị thấp hơn sẽ tạo ra độ rung mượt mà hơn, trong khi giá trị cao hơn sẽ tạo ra cảm giác rung mạnh hơn.
  • Thời lượng là thời gian cần thiết để chuyển đổi từ điểm PWLE cuối cùng (tức là cặp cường độ và độ sắc nét) sang điểm mới, tính bằng mili giây.

Dưới đây là ví dụ về dạng sóng tăng cường độ từ âm thấp đến âm cao với độ rung tối đa trong 500 mili giây, sau đó giảm xuống 0 (tắt) trong 100 mili giây:

VibrationEffect effect = new VibrationEffect.BasicEnvelopeBuilder()
          .setInitialSharpness(0.0f)
          .addControlPoint(1.0f, 1.0f, 500)
          .addControlPoint(0.0f, 1.0f, 100)
          .build();

Giới hạn

Để tạo trải nghiệm xúc giác mượt mà và liền mạch, các hiệu ứng PWLE phải bắt đầu và kết thúc với cường độ 0.0. API thực thi điều này bằng cách cố định cường độ bắt đầu ở mức 0 và gửi một ngoại lệ nếu cường độ kết thúc không phải là 0. Ràng buộc này ngăn chặn các hiệu ứng động không mong muốn trong chế độ rung do sự gián đoạn về biên độ có thể ảnh hưởng tiêu cực đến cảm nhận xúc giác của người dùng.

Để đảm bảo hiệu ứng PWLE được kết xuất nhất quán trên toàn bộ hệ sinh thái Android, khung này yêu cầu các thiết bị hỗ trợ tính năng này có thể xử lý thời lượng tối thiểu là 10 mili giây giữa các điểm PWLE và ít nhất 16 điểm cho hiệu ứng PWLE. Các kiểm thử VTS sẽ thực thi những yêu cầu này, giúp đảm bảo hiệu ứng PWLE đáng tin cậy trên các thiết bị Android.

PWLE API nâng cao

Nhà phát triển có kiến thức chuyên sâu về xúc giác có thể xác định hiệu ứng PWLE bằng các tiêu chí sau:

  • Giá trị Cường độ trong phạm vi [0, 1] biểu thị cường độ có thể đạt được ở tần số nhất định, do FOAM của thiết bị xác định. Ví dụ: giá trị 0,5 tạo ra một nửa gia tốc đầu ra tối đa có thể đạt được ở tần số đã cho.
  • Tần số được chỉ định trực tiếp bằng Hertz.
  • Thời lượng là thời gian cần thiết để chuyển đổi từ điểm PWLE cuối cùng sang điểm mới, tính bằng mili giây.

Dưới đây là ví dụ về dạng sóng tăng dần biên độ của bộ rung từ trạng thái tắt đến biên độ tối đa ở tần số 120 Hz trong 100 mili giây, giữ trạng thái đó trong 200 mili giây, sau đó giảm dần biên độ trong 100 mili giây:

VibrationEffect effect = new VibrationEffect.WaveformEnvelopeBuilder()
          .addControlPoint(1.0f, 120f, 100)
          .addControlPoint(1.0f, 120f, 200)
          .addControlPoint(0.0f, 120f, 100)
          .build();

Giới hạn

Khung này không sửa đổi các giá trị tần số và biên độ do nhà phát triển cung cấp mà sẽ thêm điểm bắt đầu biên độ 0 để đảm bảo quá trình chuyển đổi diễn ra suôn sẻ.

Nhà phát triển có trách nhiệm đảm bảo rằng tần số được chỉ định trong các hiệu ứng PWLE của họ nằm trong phạm vi được thiết bị hỗ trợ, theo định nghĩa của FOAM của thiết bị. Nếu các giá trị vượt quá những giới hạn này, thiết bị sẽ không rung.

Tần suất xuất dữ liệu ánh xạ gia tốc (FOAM)

Việc trình bày chính xác tần số của thiết bị để xuất khả năng tăng tốc là điều cần thiết để hỗ trợ các API PWLE. Phần này trình bày chi tiết tầm quan trọng của dữ liệu này, cách các API PWLE sử dụng dữ liệu này và quy trình tạo dữ liệu này.

Tìm hiểu về mối liên kết

Các thiết bị hỗ trợ hiệu ứng PWLE cần cung cấp tần suất để xuất bản đồ gia tốc (FOAM). FOAM là một cấu trúc dữ liệu do HAL tạo ra, giúp ánh xạ tần số rung (tính bằng Hertz) với gia tốc đầu ra tối đa mà bộ truyền động có thể đạt được (tính bằng G đỉnh) ở tần số đó. Bản đồ này rất quan trọng để hiểu cách đầu ra rung thay đổi đối với dải tần số được hỗ trợ và để xác định API PWLE cơ bản.

Biểu đồ sau đây cho thấy ví dụ về FOAM cho một bộ truyền động cộng hưởng thông thường, với điện áp đầu vào bị giới hạn trong khoảng tần số cộng hưởng để bảo vệ động cơ:

Ví dụ về FOAM

Hình 1. Ví dụ về FOAM cho một bộ truyền động cộng hưởng thông thường.

FOAM có 3 mục đích chính:

  • Xác định toàn bộ dải tần số: FOAM xác định toàn bộ dải tần số của thiết bị bằng cách chỉ định tần số rung tối thiểu và tối đa được hỗ trợ.
  • Xác định các giá trị cường độ và độ sắc nét: API PWLE cơ bản hoạt động trên thang cảm nhận của con người về cường độ và độ sắc nét, sau đó được ánh xạ đến các tham số tần số và biên độ phần cứng bằng cách sử dụng các giá trị gia tốc đầu ra trong FOAM. Việc lập bản đồ này giúp đảm bảo rằng các hiệu ứng xúc giác được hiển thị theo khả năng của phần cứng. Phạm vi độ sắc nét được xác định bằng ngưỡng cảm nhận tối thiểu và tương ứng với các tần số mà thiết bị có thể tạo ra hiệu ứng xúc giác mà người dùng có thể cảm nhận được. Khung này ánh xạ các giá trị Cường độ thành biên độ dựa trên gia tốc đầu ra mục tiêu ở tần số đã chọn. Điều này giúp đảm bảo đạt được mức cường độ đã chọn trong khi vẫn nằm trong khả năng của thiết bị.
  • Khai thác các chức năng của phần cứng: FOAM được cung cấp cho các nhà phát triển trong VibratorFrequencyProfile, cung cấp tần số hoàn chỉnh để xuất tập dữ liệu gia tốc, trong đó nêu chi tiết một số chức năng xúc giác của thiết bị. Dữ liệu này giúp các nhà phát triển sử dụng PWLE API nâng cao để tạo hiệu ứng rung tuỳ chỉnh vượt ra ngoài phạm vi cường độ và độ sắc nét cơ bản do khung xác định.

FOAM và API PWLE cơ bản

FOAM đóng vai trò quan trọng trong việc tạo hiệu ứng rung. API này được dùng để tính toán phạm vi độ sắc nét cho API phong bì cơ bản, đảm bảo người dùng có thể cảm nhận được các rung động. Phạm vi này tương ứng với các tần số mà gia tốc đầu ra không nhỏ hơn 10 dB so với ngưỡng phát hiện của cảm nhận của con người (tức là mức cảm nhận tối thiểu) cho từng tần số. Điều này đảm bảo rằng độ rung đủ mạnh để cảm nhận được.

Ngoài ra, khung này sử dụng dữ liệu FOAM để ánh xạ các giá trị cường độ và độ sắc nét được dùng trong PWLE API cơ bản với các giá trị biên độ và tần số tương ứng. Việc liên kết này giúp tạo ra phản hồi xúc giác có thể cảm nhận được trên nhiều thiết bị.

Các kiểm thử VTS được thực hiện để đảm bảo những thiết bị hỗ trợ hiệu ứng bao có dải tần số không trống, tạo ra những rung động có thể cảm nhận được. Điều này giúp đảm bảo rằng thiết bị có thể tạo ra các rung động với cường độ đủ để người dùng cảm nhận rõ ràng.

FOAM và API PWLE nâng cao

FOAM được cung cấp cho nhà phát triển thông qua VibratorFrequencyProfile cùng với thông tin sau:

  • Dải tần số: Nhà phát triển có thể truy xuất tần số tối thiểu và tối đa mà thiết bị hỗ trợ (tính bằng Hertz) bằng cách sử dụng lần lượt getMinFrequencyHzgetMaxFrequencyHz.
  • Gia tốc đầu ra tối đa: Gia tốc đầu ra tối đa mà thiết bị có thể đạt được (tính bằng G) có sẵn thông qua getMaxOutputAccelerationGs.
  • Tần suất xuất dữ liệu ánh xạ gia tốc: getFrequenciesOutputAcceleration cung cấp tần suất xuất dữ liệu ánh xạ gia tốc như được triển khai trong HAL.

Nhà phát triển có thể sử dụng thông tin này khi tạo hiệu ứng bao bằng PWLE API nâng cao. Ví dụ: khi chỉ định một gia tốc đầu ra (tính bằng G), họ phải chuẩn hoá gia tốc đó thành một giá trị trong phạm vi [0.0, 1.0], tương ứng với gia tốc đầu ra tối đa của thiết bị.

Với PWLE API nâng cao, nhà phát triển có thể sử dụng toàn bộ dải tần số. Vì vậy, điều quan trọng là dữ liệu FOAM được cung cấp phải an toàn cho bộ rung và không vượt quá khả năng của bộ rung.

Ngưỡng phát hiện nhận thức của con người

Ngưỡng phát hiện cảm nhận của con người đề cập đến mức gia tốc tối thiểu của một rung động mà một người có thể phát hiện một cách đáng tin cậy. Mức độ này thay đổi dựa trên tần số rung.

Biểu đồ sau đây cho thấy ngưỡng phát hiện cảm nhận xúc giác của con người 1, theo gia tốc, là một hàm của tần số tạm thời:

Ngưỡng phát hiện cảm nhận xúc giác của con người

Hình 2. Ngưỡng phát hiện cảm nhận xúc giác của con người.

Để người dùng luôn cảm nhận được hiệu ứng xúc giác, các bài kiểm thử VTS sẽ xác thực rằng các thiết bị có khả năng tạo hiệu ứng bao có dải tần số có thể tạo ra biên độ rung vượt quá ngưỡng phát hiện cảm nhận của con người là 10 dB.

Cường độ rung cảm nhận được so với biên độ gia tốc rung

Cảm nhận của con người về cường độ rung (một thước đo cảm nhận) không tăng tuyến tính theo biên độ rung (một tham số vật lý). API PWLE giả định rằng khi nhà thiết kế hoặc nhà phát triển nghĩ về những thay đổi về cường độ rung, họ mong đợi cường độ cảm nhận được sẽ tuân theo PWLE. Cường độ cảm nhận được đặc trưng bởi mức độ cảm giác (SL), được xác định là dB trên ngưỡng phát hiện ở cùng tần số. Do đó, biên độ gia tốc rung (tính bằng đỉnh G) có thể được tính như sau:

\(Amplitude(G) =10^\frac{Amplitude(db)}{20}\)

Trong đó, biên độ dB là tổng của SL và ngưỡng phát hiện (giá trị dọc theo tung độ trong biểu đồ sau) ở một tần số cụ thể.

Bằng cách này, API PWLE đảm bảo rằng cường độ cảm nhận thay đổi tuyến tính giữa các cặp điểm kiểm soát liên tiếp.

Biểu đồ sau đây cho thấy các mức gia tốc rung 2 ở 10, 20, 30, 40 và 50 dB SL, cùng với ngưỡng phát hiện cảm nhận xúc giác của con người (0 dB SL), dưới dạng một hàm của tần số tạm thời.

Mức gia tốc rung

Hình 3. Mức độ tăng tốc rung.

Xác định tần suất cho đường cong gia tốc đầu ra tối đa

Phần này cung cấp hướng dẫn chung về cách lấy tần số cho đường cong gia tốc đầu ra tối đa từ thiết bị mà bạn dùng để tạo dữ liệu FOAM.

Thu được đường cong điện áp tối đa (V)

V là điện áp tối đa có thể áp dụng một cách an toàn cho bộ rung trong phạm vi tần số hoạt động của bộ rung. Điều này đảm bảo bộ rung hoạt động trong giới hạn an toàn, ngăn ngừa hư hỏng và tối đa hoá công suất rung.

Nếu phần cứng có tính năng giới hạn điện áp, hãy sử dụng tính năng này để đo trực tiếp điện áp tối đa có thể đạt được trong phạm vi tần số được hỗ trợ.

Tính gia tốc tối đa (M)

M là gia tốc tối đa mà bạn có thể tính toán thông qua nhiều phương pháp. Phần này trình bày một phương pháp cho các thiết bị sử dụng bộ truyền động cộng hưởng tuyến tính (LRA).

Phương pháp này chuyển đổi điện áp tối đa được áp dụng ở một tần số nhất định thành giá trị gia tốc tối đa tương ứng, được biểu thị bằng đỉnh G.

Phương trình cốt lõi được dùng cho lượt chuyển đổi này là:

\(\text{Accel}(w)= (\text{Vsys}\times\text{BLsys}\times\text{Loc_coeff}/\text{Rsys}/\text{MPhone})\times{w^2}/\text{Psys_abs}/{9.81}\)

Trong trường hợp:

Vsys: Mức điện áp thực tế được áp dụng cho bộ truyền động xúc giác

BLsys: Tích của cường độ từ trường (B) và chiều dài dây dẫn (L) của động cơ rung

Loc_coeff: Hệ số vị trí để chuyển đổi gia tốc cấp mô-đun thành gia tốc cấp điện thoại

Rsys: Điện trở của cuộn dây động cơ rung

MPhone: Khối lượng của thiết bị (ví dụ: điện thoại)

w: Tần số góc (radian trên giây) của tín hiệu truyền động, được tính như sau:

\(w = 2 \pi f\)

Psys_abs: Phản hồi biên độ của hệ thống khối lượng, bộ giảm chấn và lò xo bậc hai, được tính như sau:

\(\text{Psys_abs} = (\text{Wnsys}^2-w^2)^2+({w}\times(\text{Wnsys}/\text{Qsys}))^2\)

Wnsys: Tần số tự nhiên của hệ thống rung

Qsys: Hệ số chất lượng của hệ thống rung

Loc_coeff là tỷ lệ giữa gia tốc đo được ở cấp điện thoại và gia tốc đo được ở cấp mô-đun. Tỷ lệ này được dùng để chuyển đổi các chỉ số gia tốc ở cấp mô-đun thành các chỉ số gia tốc tương đương ở cấp điện thoại. Ở cấp điện thoại, do gia tốc góc của chuyển động mô-đun, gia tốc được khuếch đại và hệ số này tính đến loại hiệu ứng đó. Công thức tính:

\(\text{Loc_coeff} = \text{phone_acceleration} / \text{module_acceleration}\)

Ví dụ: nếu gia tốc mô-đun là 1 g và gia tốc điện thoại là 2,5 g, thì Loc_coeff = 2,5. Điều này cho thấy mức khuếch đại là 2,5 lần.

Khung Android lấy tần số theo đơn vị Hertz, vì vậy HAL cần chuyển đổi đơn vị tần số từ radian trên giây sang Hertz khi tạo dữ liệu FOAM.

Tạo đường cong FOAM

Kết hợp đường cong điện áp tối đa (V) và phép tính gia tốc (M) để xác định đường cong FOAM:

  • Đối với mỗi tần số (f) trong phạm vi mong muốn, hãy tìm điện áp tối đa V(f) tương ứng trong đường cong điện áp tối đa.
  • Tính gia tốc tối đa ở tần số đó bằng phương trình ở trên, thay V(f) cho Vsysf tương ứng cho w. Việc này giúp bạn M(V(f), f).
  • Gia tốc được tính này là giá trị FOAM(f) của bạn.

Hiển thị dữ liệu FOAM

Sau khi đường cong FOAM được tạo, HAL sẽ biểu thị đường cong dưới dạng danh sách các đối tượng FrequencyAccelerationMapEntry. Mỗi mục xác định một điểm trong hoạt động ánh xạ, chỉ định tần số (tính bằng Hertz) và gia tốc đầu ra tối đa tương ứng (tính bằng G đỉnh).

Mặc dù không có yêu cầu nghiêm ngặt về độ phân giải của FOAM, nhưng bạn nên xác định các đường cong có một đỉnh tối đa. Chỉ đỉnh đầu tiên được dùng trong API phong bì cơ bản để lập bản đồ các hiệu ứng rung. Để tối ưu hoá độ chính xác của phép nội suy tuyến tính khi xác định các giá trị gia tốc trung gian, bạn nên xác định độ phân giải tần số cao xung quanh đỉnh. Ví dụ: sử dụng các bước 1 Hz trong phạm vi +/- 10 Hz của tần số đỉnh.

Khả năng và hạn chế của thiết bị

Đối với Android 16 trở lên, để giúp nhà phát triển tối ưu hoá hiệu ứng PWLE và đảm bảo khả năng tương thích trên các thiết bị, Android có các API HAL để truy vấn các chức năng PWLE của thiết bị. Các phương thức này cung cấp thông tin về những hạn chế của thiết bị, chẳng hạn như thời lượng tối thiểu hoặc tối đa của thành phần PWLE và số lượng thành phần được phép trong một thành phần PWLE.

Các API HAL bao gồm:

  • CAP_COMPOSE_PWLE_EFFECTS_V2: Do IVibrator.getCapabilities trả về khi thiết bị hỗ trợ tính năng này.
  • getFrequencyToOutputAccelerationMap: Truy xuất dữ liệu FOAM.
  • getPwleV2PrimitiveDurationMinMillis: Truy xuất thời lượng tối thiểu được phép cho mọi PWLE nguyên thuỷ (tính bằng mili giây).
  • getPwleV2PrimitiveDurationMaxMillis: Truy xuất thời lượng tối đa được phép cho mọi PWLE nguyên thuỷ (tính bằng mili giây).
  • getPwleV2CompositionSizeMax: Truy xuất số lượng tối đa các thành phần PWLE mà IVibrator.composePwleV2 hỗ trợ.

Thông tin này được cung cấp cho nhà phát triển để họ có thể điều chỉnh hiệu ứng cho phù hợp với các chức năng cụ thể của thiết bị mục tiêu, đặc biệt là khi sử dụng PWLE API nâng cao.

Khung này cũng sử dụng các API này khi xử lý các hiệu ứng được tạo bằng API cơ bản. Nếu một hiệu ứng vượt quá giới hạn của thiết bị (ví dụ: có quá nhiều điểm PWLE hoặc thời lượng vượt quá mức tối đa), thì khung sẽ tự động điều chỉnh hiệu ứng để phù hợp với các ranh giới được phép. Quy trình điều chỉnh này cố gắng giữ nguyên ý định và cảm giác ban đầu của thiết kế càng nhiều càng tốt.


  1. Dữ liệu ngưỡng được chuyển đổi từ ngưỡng dịch chuyển trong Hình 1 của Bolanowski Jr., S. J., et al.. "Bốn kênh điều chỉnh các khía cạnh cơ học của cảm ứng." Journal of the Acoustical Society of America 84(5): 1680-1694 (1988). Hướng dẫn trực tuyến này giải thích cách chuyển đổi giữa biên độ gia tốc và biên độ độ dịch chuyển. 

  2. Dữ liệu được ước tính từ Hình 8 trong Verrillo, R. T., et al.. "Cường độ cảm giác của các kích thích rung xúc giác". Perception & Psychophysics 6: 366-372 (1969).