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

Hiệu ứng bao phủ tuyến tính theo từng phần (PWLE) là các trình tự điểm xác định tần số và gia tốc rung theo thời gian. PWLE cung cấp phản hồi xúc giác phong phú và linh động hơn.

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

  • API PWLE cơ bản: Đơn giản nhưng có giới hạn. Phù hợp để bắt đầu nhanh. Bạn có thể tìm thấy thông tin này tại BasicEnvelopeBuilder.
  • API PWLE nâng cao: Có nhiều quyền kiểm soát và linh hoạt hơn, yêu cầu kiến thức về phản hồi xúc giác và một số kiến thức quen thuộ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:

  • Ánh xạ tần số đến gia tốc đầu ra (FOAM): Cung cấp ánh xạ giữa tần số rung và gia tốc đầu ra tối đa có thể đạt được cho thiết bị.
  • Compose PWLE: Phát một tín hiệu rung do PWLE của dạng sóng rung xác định.

API PWLE cơ bản

Để tạo hiệu ứng PWLE một cách nhanh chóng 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 của con người, nhà phát triển có thể sử dụng API PWLE cơ bản, được xác định bằng các tham số sau:

  • Giá trị Intensity (Cường độ) trong phạm vi [0, 1] thể hiện cường độ rung được cảm nhận. Ví dụ: giá trị 0, 5 được coi là một nửa cường độ tối đa toàn cầu mà thiết bị có thể đạt được.
  • Giá trị Độ sắc nét trong phạm vi [0, 1] thể hiện độ sắc nét của độ rung. 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 sắc nét hơn.
  • Thời lượng là thời gian 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à một ví dụ về dạng sóng tăng cường độ từ âm thấp đến âm cao với độ rung mạnh nhất trong 500 ms, sau đó giảm xuống 0 (tắt) trong 100 ms:

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, hiệu ứng PWLE phải bắt đầu và kết thúc với cường độ là 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. Quy tắc ràng buộc này ngăn chặn các hiệu ứng động không mong muốn trong độ rung do sự gián đoạn trong biên độ có thể ảnh hưởng tiêu cực đến nhận thức xúc giác của người dùng.

Để đảm bảo hiệu ứng PWLE hiển thị nhất quán trên 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ý khoảng thời gian tối thiểu là 10 ms giữa các điểm PWLE và ít nhất 16 điểm cho hiệu ứng PWLE. Các yêu cầu này được thực thi bằng quy trình kiểm thử VTS, giúp đảm bảo hiệu ứng PWLE đáng tin cậy trên các thiết bị Android.

API PWLE nâng cao

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

  • Giá trị Amplitude (Độ biên) trong khoảng [0, 1] thể hiện 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ố nhất định.
  • 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à một dạng sóng mẫu giúp tăng cường độ rung từ tắt sang biên độ đầy đủ ở 120 Hz trong 100 ms, giữ trạng thái đó trong 200 ms, sau đó giảm dần trong 100 ms:

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 độ được yêu cầu mà nhà phát triển cung cấp, nhưng 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 suất được chỉ định trong hiệu ứng PWLE nằm trong phạm vi được hỗ trợ của thiết bị, như được xác định bởi FOAM của thiết bị. Nếu các giá trị vượt quá các giới hạn này, thiết bị sẽ không rung.

Tần suất để xuất bản bản đồ tăng tốc (FOAM)

Việc thể hiện chính xác tần số của thiết bị để xuất ra các tính 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 về 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 số để xuất bản đồ tăng tốc (FOAM). FOAM là một cấu trúc dữ liệu do HAL tạo ra, liên kết tần số rung (tính bằng Hertz) với gia tốc đầu ra tối đa có thể đạt được của bộ truyền động (tính bằng đỉnh G) ở tần số đó. Bản đồ này rất quan trọng để hiểu cách đầu ra của độ rung thay đổi theo phạm vi 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ề một 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 xung quanh 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 phục vụ ba mục đích chính:

  • Xác định phạm vi tần số đầy đủ: FOAM xác định phạm vi tần số đầy đủ 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 giá trị cường độ và độ sắc nét: API PWLE cơ bản hoạt động trên thang nhận thức của con người về cường độ và độ sắc nét, sau đó được liên kết với các thông 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 ánh xạ này giúp đảm bảo rằng các hiệu ứng xúc giác được kết xuất theo khả năng phần cứng. Phạm vi độ sắc nét được xác định bằng ngưỡng nhận biết 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 liên kết các giá trị Cường độ với 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 rằng bạn đạt được cường độ đã chọn trong khi vẫn nằm trong khả năng của thiết bị.
  • Hiển thị các tính năng phần cứng: FOAM được hiển thị cho nhà phát triển trong VibratorFrequencyProfile, cung cấp tần số đầy đủ để xuất tập dữ liệu gia tốc, trong đó nêu chi tiết một số tính năng xúc giác của thiết bị. Dữ liệu này giúp nhà phát triển sử dụng API PWLE nâng cao để tạo hiệu ứng rung tuỳ chỉnh vượt ra ngoài phạm vi độ sắc nét và cường độ 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 định hình hiệu ứng rung. Phương thức này dùng để tính toán phạm vi độ sắc nét cho API bao bì cơ bản, đảm bảo người dùng có thể cảm nhận được độ rung. Phạm vi này tương ứng với các tần số mà gia tốc đầu ra không thấp hơn 10 dB so với ngưỡng phát hiện nhận thức của con người (tức là mức độ nhận biết được tối thiểu) cho mỗi tần số. Điều này đảm bảo rằng độ rung đủ mạnh để có thể cảm nhận được.

Ngoài ra, khung này sử dụng dữ liệu FOAM để liên kết các giá trị cường độ và độ sắc nét được sử dụng trong API PWLE 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ể nhận biết được trên nhiều thiết bị.

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

FOAM và API PWLE nâng cao

VibratorFrequencyProfile hiển thị FOAM cho nhà phát triển kèm theo 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 được hỗ trợ của thiết bị, tính bằng Hertz, tương ứng bằng cách sử dụng getMinFrequencyHzgetMaxFrequencyHz.
  • Tốc độ tăng tốc đầu ra tối đa: Bạn có thể xem tốc độ tăng tốc đầu ra tối đa có thể đạt được (tính bằng G) của thiết bị thông qua getMaxOutputAccelerationGs.
  • Tần suất ánh xạ gia tốc đầu ra: getFrequenciesOutputAcceleration cung cấp tần suất ánh xạ gia tốc đầu ra 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 phủ bằng API PWLE nâng cao. Ví dụ: khi chỉ định gia tốc đầu ra (tính bằng G), các giá trị này phải được chuẩn hoá 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 API PWLE 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 gia tốc tối thiểu của một dao độ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 tuỳ theo tần suất 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ười1, theo gia tốc, dưới dạng hàm của tần số thời gian:

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 có thể cảm nhận được hiệu ứng xúc giác một cách nhất quán, các thử nghiệm VTS xác thực rằng các thiết bị có khả năng tạo sóng có dải tần số có thể tạo ra biên độ rung vượt quá ngưỡng phát hiện nhận thức của con người là 10 dB.

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

Nhận thức của con người về cường độ rung (một chỉ số nhận thức) không tăng lên một cách 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ọ sẽ mong đợi cường độ cảm nhận được tuân theo PWLE. Cường độ cảm nhận được đặc trưng bằng 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 toạ độ trong biểu đồ sau) tại một tần số cụ thể.

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

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

Mức độ gia tốc rung

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

Xác định tần số cho đường cong tăng tốc đầu ra tối đa

Phần này đưa ra nguyên tắc chung về cách lấy tần số của đồ thị gia tốc đầu ra tối đa từ thiết bị mà bạn sử dụng để tạo dữ liệu FOAM.

Lấy đườ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á đầu ra của bộ 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 để trực tiếp đo đ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 thức cho các thiết bị sử dụng bộ truyền động cộng hưởng tuyến tính (LRA).

Phương thức này chuyển đổi điện áp được áp dụng tối đa ở 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 dùng cho phép 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: Sản phẩm của cường độ trường từ (B) và chiều dài dây dẫn (L) của motor 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 độ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/giây) của tín hiệu điều khiển, đượ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 dao động

Loc_coeff là tỷ lệ giữa gia tốc được đo ở cấp điện thoại với gia tốc được đo ở cấp mô-đun. Tỷ lệ này được dùng để chuyển đổi các lần đọc gia tốc ở cấp mô-đun thành các lần đọc 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ách tính như sau:

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

Ví dụ: nếu gia tốc của mô-đun là 1 g và gia tốc của đ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/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 tương ứng V(f) từ đường cong điện áp tối đa.
  • Tính gia tốc tối đa ở tần số đó bằng cách sử dụng phương trình ở trên, thay thế V(f) cho Vsysf tương ứng cho w. Thao tác này sẽ trả về M(V(f), f).
  • Gia tốc được tính toán này là giá trị FOAM(f) của bạn.

Hiển thị dữ liệu FOAM

Sau khi tạo đường cong FOAM, HAL sẽ biểu thị đường cong dưới dạng danh sách các đối tượng FrequencyAccelerationMapEntry. Mỗi mục nhập xác định một điểm trong bản đồ, 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 đỉnh G).

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 sử dụng trong API bao bì cơ bản để liên kết 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 bao gồm các API HAL để truy vấn các tính năng PWLE của thiết bị. Các phương thức này cung cấp thông tin về các giới hạn của thiết bị, chẳng hạn như thời lượng nguyên hàm PWLE tối thiểu hoặc tối đa và số lượng nguyên hàm được phép trong một thành phần PWLE.

Các API HAL bao gồm:

  • CAP_COMPOSE_PWLE_EFFECTS_V2: Được 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 gốc 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 gốc tính bằng mili giây.
  • getPwleV2CompositionSizeMax: Truy xuất số lượng tối đa của các nguyên hàm PWLE mà IVibrator.composePwleV2 hỗ trợ.

Thông tin này được hiển thị cho nhà phát triển để họ đ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 API PWLE 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ụ: quá nhiều điểm PWLE hoặc thời lượng vượt quá mức tối đa), khung sẽ tự động điều chỉnh hiệu ứng để phù hợp với các giới hạn cho 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 tiết các khía cạnh cơ học của thao tác chạm." 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 việc 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. "Mức độ cảm giác của kích thích rung xúc giác." Perception & Psychophysics 6: 366-372 (1969).