선형 조각별 엔벨로프 (PWLE) 효과는 시간 경과에 따른 진동 주파수와 가속도를 정의하는 점의 시퀀스입니다. PWLE는 더 풍부하고 동적인 햅틱 피드백을 제공합니다.
Android 16 이상에서는 PWLE 효과를 만드는 데 도움이 되는 두 가지 앱 개발자 API를 제공합니다.
- 기본 PWLE API: 간단하지만 제한사항이 있습니다. 빠르게 시작하는 데 적합합니다. 이 값은
BasicEnvelopeBuilder
에서 확인할 수 있습니다. - 고급 PWLE API: 더 많은 제어 및 유연성을 제공하며, 햅틱 지식과 하드웨어에 대한 약간의 이해가 필요합니다.
WaveformEnvelopeBuilder
에서 확인할 수 있습니다.
이러한 API를 지원하려면 기기에서 다음 HAL API를 구현해야 합니다.
- 주파수-출력 가속도 매핑 (FOAM): 진동 주파수를 기기에서 달성할 수 있는 최대 출력 가속도에 매핑합니다.
- PWLE 구성: 진동 파형의 PWLE로 정의된 진동을 재생합니다.
기본 PWLE API
하드웨어나 인간 인식의 미묘한 차이를 자세히 살펴보지 않고도 PWLE 효과를 빠르게 만들려면 개발자가 다음 매개변수를 사용하여 정의된 기본 PWLE API를 사용하면 됩니다.
- [0, 1] 범위의 강도 값은 진동의 인지된 강도를 나타냅니다. 예를 들어 0.5 값은 기기에서 달성할 수 있는 전역 최대 강도의 절반으로 인식됩니다.
- [0, 1] 범위의 선명도 값은 진동의 선명도를 나타냅니다. 값이 낮을수록 진동이 더 부드러워지고 값이 높을수록 더 날카로운 느낌이 듭니다.
- Duration은 마지막 PWLE 포인트(즉, 강도 및 선명도 쌍)에서 새 포인트로 전환하는 데 걸리는 시간(밀리초)입니다.
다음은 500ms에 걸쳐 낮은 피치에서 높은 피치 최대 강도 진동으로 강도를 높인 다음 100ms에 걸쳐 0(꺼짐)으로 강도를 낮추는 파형의 예입니다.
VibrationEffect effect = new VibrationEffect.BasicEnvelopeBuilder()
.setInitialSharpness(0.0f)
.addControlPoint(1.0f, 1.0f, 500)
.addControlPoint(0.0f, 1.0f, 100)
.build();
제약 조건
부드럽고 원활한 햅틱 환경을 만들려면 PWLE 효과가 강도 0.0으로 시작하고 끝나야 합니다. API는 시작 강도를 0으로 고정하여 이를 적용하고 종료 강도가 0이 아니면 예외를 발생시킵니다. 이 제약 조건은 진폭의 불연속으로 인해 진동에서 바람직하지 않은 동적 효과가 발생하는 것을 방지하며 이는 사용자의 햅틱 인식에 부정적인 영향을 미칠 수 있습니다.
Android 생태계 전반에서 일관된 PWLE 효과 렌더링을 보장하기 위해 프레임워크에서는 이 기능을 지원하는 기기가 PWLE 포인트 간 최소 10ms의 지속 시간과 PWLE 효과의 최소 16개 포인트를 처리할 수 있어야 합니다. 이러한 요구사항은 VTS 테스트를 통해 적용되므로 Android 기기 전반에서 안정적인 PWLE 효과를 보장하는 데 도움이 됩니다.
고급 PWLE API
햅틱에 관한 고급 지식이 있는 개발자는 다음 기준을 사용하여 PWLE 효과를 정의할 수 있습니다.
- [0, 1] 범위의 진폭 값은 기기 FOAM에 의해 결정된 특정 주파수에서 달성 가능한 강도를 나타냅니다. 예를 들어 0.5 값은 지정된 주파수에서 달성할 수 있는 최대 출력 가속도의 절반을 생성합니다.
- 주파수는 헤르츠로 직접 지정됩니다.
- Duration은 마지막 PWLE 지점에서 새 지점까지 전환하는 데 걸린 시간(밀리초)입니다.
다음은 100ms에 걸쳐 120Hz에서 진동기를 꺼짐에서 최대 진폭으로 램프하고, 200ms 동안 해당 상태를 유지한 다음 100ms에 걸쳐 다시 아래로 램프하는 파형의 예입니다.
VibrationEffect effect = new VibrationEffect.WaveformEnvelopeBuilder()
.addControlPoint(1.0f, 120f, 100)
.addControlPoint(1.0f, 120f, 200)
.addControlPoint(0.0f, 120f, 100)
.build();
제약 조건
프레임워크는 개발자가 제공한 요청된 주파수 및 진폭 값을 수정하지 않지만 부드러운 전환을 위해 진폭 0 시작점을 추가합니다.
개발자는 PWLE 효과에 지정된 주파수가 기기의 FOAM에 정의된 기기의 지원 범위 내에 있는지 확인해야 합니다. 값이 이러한 한도를 초과하면 기기에서 진동이 재생되지 않습니다.
출력 가속 매핑 빈도 (FOAM)
가속도 기능을 출력하는 기기의 주파수를 정확하게 표현하는 것은 PWLE API를 지원하는 데 필수적입니다. 이 섹션에서는 이 데이터의 중요성, PWLE API에서 사용되는 방식, 생성 프로세스를 자세히 설명합니다.
매핑 이해하기
PWLE 효과를 지원하는 기기는 가속 맵 (FOAM)을 출력하는 빈도를 제공해야 합니다. FOAM은 HAL에서 생성하는 데이터 구조로, 진동 주파수 (헤르츠)를 해당 주파수에서 액추에이터가 달성할 수 있는 최대 출력 가속도 (G 피크)에 매핑합니다. 이 지도는 지원되는 주파수 범위에서 진동 출력이 어떻게 달라지는지 이해하고 기본 PWLE API를 정의하는 데 중요합니다.
다음 그림은 모터를 보호하기 위해 공진 주위로 입력 전압이 제한된 일반적인 공진 액추에이터의 FOAM을 보여줍니다.
그림 1. 일반적인 공진 액추에이터의 FOAM 예시
FOAM은 다음과 같은 세 가지 주요 용도로 사용됩니다.
- 전체 주파수 범위 정의: FOAM은 지원되는 최소 및 최대 진동 주파수를 지정하여 기기의 전체 주파수 범위를 정의합니다.
- 강도 및 선명도 값 정의: 기본 PWLE API는 강도 및 선명도에 관한 인간 인식 규모로 작동하며, 이는 FOAM의 출력 가속도 값을 사용하여 하드웨어 주파수 및 진폭 매개변수에 매핑됩니다. 이 매핑은 햅틱 효과가 하드웨어 기능에 따라 렌더링되도록 하는 데 도움이 됩니다. 선명도 범위는 최소 인식 가능 기준점으로 정의되며, 기기에서 사용자가 느낄 수 있는 햅틱 효과를 생성할 수 있는 주파수에 해당합니다. 프레임워크는 선택한 주파수에서 타겟 출력 가속도를 기반으로 강도 값을 진폭에 매핑합니다. 이렇게 하면 기기의 기능 내에서 선택한 강도 수준을 달성할 수 있습니다.
- 하드웨어 기능 노출: FOAM은
VibratorFrequencyProfile
에서 개발자에게 노출되어 기기의 햅틱 기능을 자세히 설명하는 가속도 데이터 세트를 출력하는 완전한 주파수를 제공합니다. 이 데이터를 통해 고급 PWLE API를 사용하는 개발자는 프레임워크에서 정의한 기본 강도 및 선명도 범위를 벗어나는 맞춤 진동 효과를 만들 수 있습니다.
FOAM 및 기본 PWLE API
FOAM은 진동 효과를 형성하는 데 중요한 역할을 합니다. 기본 봉투 API의 선명도 범위를 계산하는 데 사용되어 사용자가 진동을 감지할 수 있도록 합니다. 이 범위는 각 주파수에서 출력 가속도가 인간 인식 감지 기준점 (즉, 최소 인식 가능 수준)보다 10dB 이상인 주파수에 해당합니다. 이렇게 하면 진동이 느껴질 만큼 강해집니다.
또한 프레임워크는 FOAM 데이터를 사용하여 기본 PWLE API에 사용된 강도 및 선명도 값을 해당 진폭 및 주파수 값에 매핑합니다. 이 매핑은 다양한 기기에서 감지할 수 있는 햅틱 피드백을 생성하는 데 도움이 됩니다.
VTS 테스트는 봉투 효과를 지원하는 기기에 감지 가능한 진동을 생성하는 비어 있지 않은 주파수 범위가 있는지 확인하기 위해 마련되었습니다. 이를 통해 기기가 사용자가 명확하게 느낄 수 있을 만큼 충분한 강도로 진동을 생성할 수 있습니다.
FOAM 및 고급 PWLE API
FOAM은 다음 정보와 함께 VibratorFrequencyProfile
에 의해 개발자에게 노출됩니다.
- 주파수 범위: 개발자는 각각
getMinFrequencyHz
및getMaxFrequencyHz
를 사용하여 기기에서 지원하는 최소 및 최대 주파수를 헤르츠 단위로 가져올 수 있습니다. - 최대 출력 가속도:
getMaxOutputAccelerationGs
를 통해 기기에서 달성할 수 있는 최대 출력 가속도 (G)를 확인할 수 있습니다. - 주파수-출력 가속도 매핑:
getFrequenciesOutputAcceleration
는 HAL에 구현된 주파수-출력 가속도 매핑을 제공합니다.
개발자는 고급 PWLE API로 엔벨로프 효과를 만들 때 이 정보를 사용할 수 있습니다. 예를 들어 출력 가속도 (단위: G)를 지정할 때는 기기의 최대 출력 가속도에 상대적으로 [0.0, 1.0] 범위 내의 값으로 정규화해야 합니다.
고급 PWLE API를 사용하면 개발자가 전체 주파수 범위를 사용할 수 있으므로 제공된 FOAM 데이터가 진동기에 안전하고 기능을 초과하지 않는 것이 중요합니다.
인간 인식 감지 기준
인간 인식 감지 기준점은 사람이 안정적으로 감지할 수 있는 진동의 최소 가속도를 나타냅니다. 이 수준은 진동 주파수에 따라 다릅니다.
다음 그림은 시간적 주파수의 함수로 가속도에서 인간의 햅틱 인식 감지 기준점1을 보여줍니다.
그림 2. 인간 햅틱 인식 감지 기준입니다.
사용자가 햅틱 효과를 일관되게 느낄 수 있도록 VTS 테스트에서는 엔벨로프 기능이 있는 기기의 주파수 범위가 인간 인식 감지 기준점을 10dB 초과하는 진동 진폭을 생성할 수 있는지 확인합니다.
진동 가속도 진폭에 따른 진동 강도
진동 강도에 대한 인간의 인식 (인식 측정)은 진동 진폭 (물리적 매개변수)에 따라 선형으로 증가하지 않습니다. PWLE API는 디자이너나 개발자가 진동 강도의 변화를 생각할 때 인식된 강도가 PWLE를 따를 것으로 예상한다고 가정합니다. 지각된 강도는 동일한 주파수에서 감지 기준점 위의 dB로 정의되는 감각 수준 (SL)으로 특징지어집니다. 따라서 진동 가속도 진폭 (G 피크)은 다음과 같이 계산할 수 있습니다.
\(Amplitude(G) =10^\frac{Amplitude(db)}{20}\)
여기서 진폭 dB는 특정 주파수에서 SL과 감지 기준 (다음 그림의 세로축을 따라 있는 값)의 합입니다.
이렇게 하면 PWLE API가 연속된 제어점 쌍 사이에서 인식된 강도가 선형으로 변경됩니다.
다음 그림은 시간적 주파수의 함수로 10, 20, 30, 40, 50dB SL에서의 진동 가속도 수준2과 인간의 촉각 인식 감지 기준점 (0dB SL)을 보여줍니다.
그림 3. 진동 가속 수준입니다.
최대 출력 가속 곡선에 대한 주파수 결정
이 섹션에서는 기기에서 최대 출력 가속도 곡선을 가져오는 방법에 관한 일반적인 가이드라인을 제공합니다. 이 곡선은 FOAM 데이터를 생성하는 데 사용됩니다.
최대 전압 곡선 (V) 획득
V
는 작동 주파수 범위에서 진동기에 안전하게 적용할 수 있는 최대 전압입니다. 이렇게 하면 진동기가 안전한 한도 내에서 작동하여 손상을 방지하고 진동 출력을 최대화할 수 있습니다.
하드웨어에 전압 제한 기능이 포함된 경우 이를 사용하여 지원되는 주파수 범위에서 달성 가능한 최대 전압을 직접 측정합니다.
최대 가속도 (M) 계산
M
은 최대 가속도이며 다양한 방법론을 통해 계산할 수 있습니다. 이 섹션에서는 선형 공진 액추에이터 (LRA)를 사용하는 기기의 한 가지 방법을 보여줍니다.
이 메서드는 주어진 주파수에서 적용된 최대 전압을 G peak로 표현된 해당 최대 가속도 값으로 변환합니다.
이 변환에 사용되는 핵심 방정식은 다음과 같습니다.
\(\text{Accel}(w)= (\text{Vsys}\times\text{BLsys}\times\text{Loc_coeff}/\text{Rsys}/\text{MPhone})\times{w^2}/\text{Psys_abs}/{9.81}\)
각각의 의미는 다음과 같습니다.
Vsys
: 햅틱 액추에이터에 적용된 실제 전압 수준
BLsys
: 진동 모터의 자기장 강도 (B
)와 도체 길이 (L
)의 곱
Loc_coeff
: 모듈 수준 가속을 휴대전화 수준 가속으로 변환하는 위치 계수
Rsys
: 진동 모터 코일의 전기 저항
MPhone
: 기기 (예: 휴대전화)의 질량
w
: 구동 신호의 각진동수 (초당 라디안)입니다. 다음과 같이 계산됩니다.
\(w = 2 \pi f\)
Psys_abs
: 2차 질량, 댐퍼, 스프링 시스템의 진폭 응답으로, 다음과 같이 계산됩니다.
\(\text{Psys_abs} = (\text{Wnsys}^2-w^2)^2+({w}\times(\text{Wnsys}/\text{Qsys}))^2\)
Wnsys
: 진동 시스템의 고유 진동수
Qsys
: 진동 시스템의 품질 요소
Loc_coeff
는 휴대전화 수준에서 측정한 가속도와 모듈 수준에서 측정한 가속도의 비율입니다. 이 비율은 모듈 수준 가속도 판독값을 이에 상응하는 휴대전화 수준 가속도 판독값으로 변환하는 데 사용됩니다. 휴대전화 수준에서는 모듈 이동의 각도 가속도로 인해 가속도가 증폭되며 이 계수는 이러한 유형의 효과를 설명합니다. 다음과 같이 계산됩니다.
\(\text{Loc_coeff} = \text{phone_acceleration} / \text{module_acceleration}\)
예를 들어 모듈 가속도가 1g이고 휴대전화 가속도가 2.5g이면 Loc_coeff
= 2.5입니다. 이는 2.5배 증폭을 나타냅니다.
Android 프레임워크는 헤르츠 단위로 주파수를 사용하므로 HAL은 FOAM 데이터를 생성할 때 주파수 단위를 초당 라디안에서 헤르츠로 변환해야 합니다.
FOAM 곡선 생성
최대 전압 곡선 (V
)과 가속도 계산 (M
)을 결합하여 FOAM 곡선을 결정합니다.
- 원하는 범위의 각 주파수 (
f
)에 대해 최대 전압 곡선에서 해당하는 최대 전압V(f)
을 찾습니다. - 위의 방정식을 사용하여 해당 주파수에서의 최대 가속도를 계산합니다. 이때
Vsys
대신V(f)
를,w
대신 해당f
를 대입합니다. 이렇게 하면M(V(f), f)
가 제공됩니다. - 계산된 가속도가
FOAM(f)
값입니다.
FOAM 데이터 노출
FOAM 곡선이 생성되면 HAL은 곡선을 FrequencyAccelerationMapEntry
객체 목록으로 나타냅니다. 각 항목은 매핑의 한 점을 정의하며, 주파수 (헤르츠)와 해당 최대 출력 가속도 (G 피크)를 지정합니다.
FOAM의 해상도에 대한 엄격한 요구사항은 없지만 최대 피크가 하나인 곡선을 정의하는 것이 좋습니다. 기본 봉투 API에서는 첫 번째 피크만 사용하여 진동 효과를 매핑합니다. 중간 가속도 값을 결정할 때 선형 보간의 정확도를 최적화하려면 피크 주변에서 높은 주파수 해상도를 정의하는 것이 좋습니다. 예를 들어 최고 주파수의 +/- 10Hz 범위 내에서 1Hz 단계를 사용합니다.
기기 기능 및 제한사항
Android 16 이상에서는 개발자가 PWLE 효과를 최적화하고 기기 간 호환성을 보장할 수 있도록 기기의 PWLE 기능을 쿼리하는 HAL API가 포함되어 있습니다. 이러한 메서드는 최소 또는 최대 PWLE 기본 요소 지속 시간, PWLE 컴포지션에서 허용되는 기본 요소 수와 같은 기기의 제한사항에 관한 정보를 제공합니다.
HAL API에는 다음이 포함됩니다.
CAP_COMPOSE_PWLE_EFFECTS_V2
: 기기가 이 기능을 지원하는 경우IVibrator.getCapabilities
에서 반환됩니다.getFrequencyToOutputAccelerationMap
: FOAM 데이터를 가져옵니다.getPwleV2PrimitiveDurationMinMillis
: 모든 기본 PWLE에 허용되는 최소 기간을 밀리초 단위로 가져옵니다.getPwleV2PrimitiveDurationMaxMillis
: 모든 기본 PWLE에 허용되는 최대 기간을 밀리초 단위로 가져옵니다.getPwleV2CompositionSizeMax
:IVibrator.composePwleV2
에서 지원하는 최대 PWLE 프리미티브 수를 가져옵니다.
이 정보는 개발자가 특히 고급 PWLE API를 사용할 때 타겟 기기의 특정 기능에 맞게 효과를 조정할 수 있도록 개발자에게 노출됩니다.
프레임워크는 기본 API로 생성된 효과를 처리할 때도 이러한 API를 사용합니다. 효과가 기기의 제한사항 (예: PWLE 포인트가 너무 많거나 최대값을 초과하는 지속 시간)을 초과하면 프레임워크는 허용된 경계 내에 맞도록 효과를 자동으로 조정합니다. 이 조정 프로세스는 디자인의 원래 의도와 느낌을 최대한 보존하려고 합니다.
-
기준점 데이터는 Bolanowski Jr. S. J., et al.. '4개의 채널이 터치의 기계적 측면을 매개합니다.' Journal of the Acoustical Society of America 84(5): 1680-1694 (1988). 이 온라인 튜토리얼에서는 가속도 진폭과 변위 진폭 간의 변환을 설명합니다. ↩
-
이 데이터는 Verrillo, R.의 그림 8에서 추정되었습니다. T., et al.. '진동 자극의 감각 크기' Perception & Psychophysics 6: 366~372 (1969). ↩