ハプティクスを実装する

デバイス メーカーは通常、デバイスごとに作成されたプライベート アセットの所有者とみなされます。したがって、エンジニアリングの取り組みは、デバイス単位で行われることが多く、エコシステム内の他のデバイスとの一貫性に対する取り組みはほとんど、あるいはまったく行われません。

これとは正反対に、デベロッパーは各デバイスの技術仕様に関係なく、エコシステム内のすべての Android スマートフォンで動作するアプリを作成することを目指します。このようなアプローチの違いにより、断片化の問題が発生することがあります。たとえば、特定のスマートフォンのハードウェア機能が、アプリ デベロッパーの想定と一致しないことがあります。一部の Android スマートフォンで動作するハプティクス API が他の Android スマートフォンでは動作しない場合、結果として一貫性のないエコシステムとなります。こうした理由により、メーカーが Android ハプティクス API をすべてのデバイスに実装できるようにするうえで、ハードウェア構成が重要な役割を果たします。

このページでは、Android ハプティクス API を最大限活用するためにハードウェア コンプライアンスを設定する方法について、詳細なチェックリストをご紹介します。

下図は、デバイス メーカーとデベロッパーの間で共通の知識を構築するプロセスを示しています。これは、一貫性のあるエコシステムを構築するうえで重要なステップです。

アプリ デベロッパーとデバイス メーカーのハプティクスのユースケースの図

図 1. デバイス メーカーとデベロッパーの間の知識の構築

ハプティクス実装チェックリスト

  1. 定数を実装する

    • ハプティクスを実装する定数のリスト。
  2. プリミティブを実装する

    • HAL 合成プリミティブの実装ガイダンス。
  3. HAL と API の間で定数をマッピングする

    • 公開 API 定数(フレームワークの名前付きプレースホルダ)と、プレースホルダを実装する HAL 定数との間のマッピングの推奨事項。
    • このプロセスについて詳しくは、推奨されるマッピングの指針となる設計原則をご覧ください。
  4. ハードウェアを評価する

    • ターゲットとする触覚効果についての説明。これにより、ハードウェアのクイック チェックを行います。

以降で、各ステップについて詳しく説明します。

ステップ 1: 定数を実装する

デバイスがハプティクスを実装するための最小要件を満たしているかどうかを確認するために、以下のチェックを行います。

ハプティクス実装プロセスのフローチャート

図 2. 効果の実装

プリミティブ実装の手順を示したフローチャート

図 3. プリミティブの実装

下記の触覚定数の実装ステータスを確認します。

触覚定数 場所と概要
EFFECT_TICKEFFECT_CLICKEFFECT_HEAVY_CLICKEFFECT_DOUBLE_CLICK VibrationEffect クラス
VibrationEffect の触覚定数には、入力イベントの概念が含まれず、UI 要素もありません。定数には、 createPredefined() が呼び出す EFFECT_CLICKEFFECT_HEAVY_CLICK など、エネルギー レベルの概念が含まれます。

以下で説明する代替のバイブレーションは、VibrationEffect 定数を実装していないデバイスで実行されます。このようなデバイスで最善のパフォーマンスが得られるように、これらの構成を更新することをおすすめします。

  • EFFECT_CLICK

    VibrationEffect.createWaveform で作成された波形のバイブレーションと、frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern で設定されたタイミング。

  • EFFECT_HEAVY_CLICK

    VibrationEffect.createWaveform で作成された波形のバイブレーションと、frameworks/base/core/res/res/values/config.xml##config_longPressVibePattern で設定されたタイミング。

    • EFFECT_DOUBLE_CLICK

    VibrationEffect.createWaveform で作成された波形のバイブレーションとタイミング(0、30、100、30)。

  • EFFECT_TICK

    VibrationEffect.createWaveform で作成された波形のバイブレーションと、frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern で設定されたタイミング。

触覚フィードバックのテスト手順を示したフローチャート

図 4. フィードバック定数の実装

以下の公開フィードバック定数のステータスを確認します。

触覚定数 場所と概要
CLOCK_TICKCONTEXT_CLICKKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASECONFIRMREJECTGESTURE_STARTGESTURE_END HapticFeedbackConstants クラス
HapticFeedbackConstants の触覚定数は、performHapticFeedback() が呼び出す KEYBOARD_PRESSKEYBOARD_RELEASE など、特定の UI 要素での入力イベントを支援します。

ステップ 2: プリミティブを実装する

VibrationEffect.Composition の触覚プリミティブには、デベロッパーが addPrimitive(int primitiveId, float scale, int delay) を通じて利用できるスケーラブルな強度があります。これらのプリミティブは、次の 2 つのカテゴリに分類されます。

  • short プリミティブ: 通常 20 ミリ秒未満の短期間のプリミティブ。CLICKTICKLOW_TICK を指します。

  • chirp プリミティブ: 通常 short プリミティブよりも持続時間が長く、振幅と周波数が変化するプリミティブで、SLOW_RISEQUICK_RISEQUCK_FALLTHUDSPIN を指します。

short プリミティブ

short プリミティブは、振動モーターの出力加速度プロファイルによって説明できます。使用される絶対周波数は、アクチュエータの共振周波数に基づき、プリミティブごとに異なります。出力を測定するためのハードウェア設定とツールについて詳しくは、テスト機器を設定するをご覧ください。

短い振動の重要な品質指標として、図 5 に示されているパルス対リング比(PRR)があります。PRR は、メインパルスリングパルスの間の比率を指します。メインパルスとは、持続時間の範囲内における、振幅がピーク振幅の 10% まで減少する信号によって定義され、リングパルスとは、振幅がピーク振幅の 10% から 1% 未満まで減少する信号によって定義されます。PRR の数式は次のとおりです。

$$ \text{Pulse to ring ratio (PRR)} = 20log_{10}\frac{\text{RMS (main pulse)}}{\text{RMS (ring)}} $$

PRR について詳しくは、波形を分析するを、結果の分析と比較について詳しくは、パフォーマンス マップを使用して結果を比較するをご覧ください。

パルス対リング比

図 5. パルス対リング比の定義

短いプリミティブは、ユーザー入力のフィードバックとして適用されたり、より長い構成の中で柔らかなテクスチャを作成するために再生されたりします。つまり、通常は頻繁にトリガーされ、素早く連続して再生されます。単一の short プリミティブの認識強度が、効果の強度を増幅する場合があります。したがって、単一の tick プリミティブまたは low tick プリミティブをより大きな構成、たとえば連続 100 ティックで調整してください。

click プリミティブ

click プリミティブは通常、デバイスの共振周波数とほぼ同じ周波数で動作し、短時間で最大出力に達する、強力でクリアな効果です。他のプリミティブに比べ、強くて深く、最大の強度で動作します。

可能であれば、モーターの立ち上がりと立ち下がりの時間を短くするために、最初にモーターのオーバードライブを使用し、最後にアクティブ ブレーキを使用してください。モーターによっては、正弦波の代わりに矩形波を使用することで、より速い加速度を実現できます。図 6 は、click プリミティブの出力加速度プロファイルの例を示しています。

click プリミティブの出力加速度プロファイル

図 6. click プリミティブの出力加速度プロファイルの例

パラメータ ガイドライン
持続時間

目標: 12 ミリ秒

上限: < 30 ミリ秒

ピーク出力加速度

目標: 2 G

上限: > 1 G

周波数 共振周波数とほぼ同様

tick プリミティブ(ライト tick)

tick プリミティブは通常、高い周波数帯で動作するシャープで短い効果です。このプリミティブは、より高い周波数で動作し、持続時間がより短い中程度の強度のクリックと説明することもできます。短い立ち上がり時間を実現するのに、開始時にモーター オーバードライブまたは矩形波を使用し、終了時にはアクティブ ブレーキングを使用するという同じガイダンスが適用されます。図 7 は、tick プリミティブの出力加速度プロファイルの例を示しています。

tick プリミティブの出力加速度プロファイル

図 7. tick プリミティブの出力加速度プロファイルの例

パラメータ ガイドライン
持続時間

目標: 5 ミリ秒

上限: < 20 ミリ秒

ピーク出力加速度

目標: CLICK の半分、1 G

上限: 0.5 G~1 G

周波数

目標: 共振周波数の 2 倍

上限: < 500 Hz

low tick プリミティブ

low tick プリミティブは、ライト tick のよりソフトで弱いバージョンで、より低い周波数帯で動作し、効果に厚みを与えます。このプリミティブは、より低い周波数で動作する中程度の強度のクリックと説明することもでき、動的なフィードバックのために繰り返し使用されることが想定されています。短い立ち上がり時間を実現するのにも、開始時にモーター オーバードライブまたは矩形波を使用するという同じガイダンスが適用されます。図 8 は、low tick プリミティブの出力加速度プロファイルの例を示しています。

low tick プリミティブの出力加速度プロファイル

図 8. low tick プリミティブの出力加速度プロファイルの例

パラメータ ガイドライン
持続時間

目標: 12 ミリ秒

上限: < 30 ミリ秒

ピーク出力加速度

目標: TICK の 1/4、0.25 G

上限: 0.2 G~0.5 G

周波数

目標: 2/3 共振周波数

上限: < 100 Hz

chirp プリミティブ

chirp プリミティブは、電圧レベルと振動周波数の入力信号によって説明できます。モーターが異なる周波数帯域で出力できる加速度は、アクチュエータの周波数応答曲線によって変わります。周波数帯域と電圧レベルは、デバイスごとに調整する必要があります。

slow rise プリミティブ

slow rise では、振幅と周波数がゆっくりと上昇し、滑らかな開始からスイープ全体を通じて振動強度が一貫して増していきます。このプリミティブは、振幅と周波数を一貫してスイープさせ、共振を外した低い周波数帯で動作させることで実装できます。図 9 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左側の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右側の周波数ラベルと一致し、振動周波数が時間とともにどのように変化するかを表しています)。

slow rise プリミティブの入力パラメータと出力加速度プロファイル

図 9. slow rise プリミティブの入力パラメータと出力加速度プロファイルの例

モーターの周波数応答が制限されている(共振周波数を外れると十分な強度が得られない)場合は、代替として、共振周波数の 1/2 倍~1 倍までの正弦波スイープを実装する方法があります。モーターの共振が最終的に信号のピークに達するのを助けます。

パラメータ ガイドライン
持続時間

目標: 500 ミリ秒

許容差: 20 ミリ秒

ピーク出力加速度

目標: 0.5 G

上限: 0.5 G~1 G

周波数

目標: 共振周波数の 1/2~2/3

代替値: 共振周波数の 1/2

quick rise プリミティブ

quick rise では、振幅と周波数がより速いペースでと上昇し、滑らかな開始からスイープ全体を通じて振動強度が一貫して増していきます。出力加速度と振動周波数の目標値は、slow rise プリミティブと同じで、より短い持続時間で達成されます。図 10 は、slow rise プリミティブの振動入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左側の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右側の周波数ラベルと一致し、振動周波数が時間とともにどのように変化するかを表しています)。

quick rise プリミティブの入力パラメータと出力加速度プロファイル

図 10. quick rise プリミティブの入力パラメータと出力加速度プロファイルの例

パラメータ ガイドライン
持続時間

目標: 150 ミリ秒

許容差: 20 ミリ秒

ピーク出力加速度

目標: SLOW_RISE と同様

上限: SLOW_RISE と同様

周波数

目標: SLOW_RISE と同様

代替値: SLOW_RISE と同様

quick fall プリミティブ

quick fall では、振幅と周波数が速いペースで低下し、滑らかに開始します。モーターがピーク出力加速度に到達するために加速している間、開始点として高い周波数を使用することができます。スイープ全体を通じて、立ち上がり時間中であっても周波数は一貫して低下する必要があります。図 11 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左側の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右側の周波数ラベルと一致し、振動周波数が時間とともにどのように変化するかを表しています)。

quick fall プリミティブの入力パラメータと出力加速度プロファイル

図 11. quick fall プリミティブの入力パラメータと出力加速度プロファイルの例

パラメータ ガイドライン
持続時間

目標: 100 ミリ秒

許容差: 20 ミリ秒

ピーク出力加速度

目標: 1 G

上限: 0.5 G~2 G

周波数

目標: 共振周波数の 2 倍~1 倍

thud プリミティブ

thud は、重く低い打楽器のような効果で、空洞のある木を叩いたときのような感覚を模倣しています。このプリミティブは、low tick プリミティブと同様に低周波数帯で動作し、効果に厚みを持たせます。低周波数帯(100 Hz 未満が望ましい)で振幅と周波数を低下させるスイープとして thud プリミティブを実装できます。図 12 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左側の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右側の周波数ラベルと一致し、振動周波数が時間とともにどのように変化するかを表しています)。

thud プリミティブの入力パラメータと出力加速度プロファイル

図 12. thud プリミティブの入力パラメータと出力加速度プロファイルの例

モーターの周波数応答が制限されている場合、代替として、共振周波数で最大強度の駆動信号から開始し、知覚可能な範囲で最も低い周波数まで下げる実装方法もあります。この方法では、低い周波数で振動を感じられるようにするため、駆動信号の強度を上げる必要がある場合があります。

パラメータ ガイドライン
持続時間

目標: 300 ミリ秒

許容差: 20 ミリ秒

ピーク出力加速度

目標: 0.25 G

上限: 0.2 G~0.5 G

周波数

目標: 共振周波数の 1/2~1/3

代替値: 共振周波数の 1 倍~1/2

spin プリミティブ

spin は、中央にわずかなアクセントをつけながら、上下に速く回転する動きを模倣しています。spin は、振幅と周波数をそれぞれ逆方向にスイープさせ、その後に反対の動きをさせることで実装できます。低周波数帯域(100 Hz 未満が望ましい)を使用することが重要です。図 13 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左側の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右側の周波数ラベルと一致し、振動周波数が時間とともにどのように変化するかを表しています)。

spin プリミティブは、連続して 2 回、または構成内で 3 回使用することを推奨します。これにより、回転するような不安定な感覚を実現できます。

モーターの周波数応答が制限されている場合、代替として、共振周波数の 1/2 倍から 1 倍へ、そしてその逆に、急速な正弦波スイープを行う実装方法もあります。モーターの共振が自動的に信号の中央にアクセントを与えます。

spin プリミティブの入力パラメータと出力加速度プロファイル

図 13. spin プリミティブの入力パラメータと出力加速度プロファイルの例

パラメータ ガイドライン
持続時間

目標: 150 ミリ秒

許容差: 20 ミリ秒

ピーク出力加速度

目標: 0.5 G

上限: 0.25 G~0.75 G

周波数

対象: 共振周波数の 2/3~1/3、その後 1/2

代替手段: 共振周波数の 2/3~1x、その後 1/2

ステップ 3: HAL と API の間で定数をマッピングする

ステップ 3 では、公開 HAL 定数と API 定数の間の推奨されるマッピングについてご説明します。ステップ 1 で評価したハードウェアが HAL 定数を実装していない場合は、ステップ 3 を使用して、ステップ 1 で説明したフォールバック パターンを更新して、同様の出力を生成する必要があります。マッピングは、2 つの異なるデフォルト モデルによって支援されます。

  • 非連続モデル(簡単)

    • このモデルの主な変数は振幅です。HAL の各エンティティは異なる触覚振幅を表します。
    • このモデルは、基本的な触覚 UX を実装するために必要な最小要件です。
    • 高度な触覚 UX には、高度なハードウェアと高度なモデル(連続モデル)が必要です。
  • 連続モデル(高度)

    • このモデルの主な変数はテクスチャと振幅です。HAL の各エンティティは異なる触覚テクスチャを表します。各 HAL エンティティの振幅は、スケーリング ファクタ(S)によって制御されます。
    • このモデルには高度なハードウェアが必要です。OEM が最新のハプティクス API を最大限活用するために、VibrationEffect.Composition で高度な触覚 UX を使用する場合は、このモデルを使用してハードウェアを実装することをおすすめします。

非連続モデル

API で提供されるすべてのパブリック定数を、適切な HAL 定数にマッピングすることをおすすめします。このプロセスを開始するには、デバイスが HAL で定義できる、非連続の振幅を持つ触覚波形の数を確認します。この概念に基づいた具体的な質問は次のようになります。「1 台のスマートフォンに、人間が知覚できる振幅差を持つシングル インパルス触覚衝撃をいくつ定義できますか?」この質問に対する回答によってマッピングが決まります。

HAL 定数の定義はハードウェアに依存するプロセスです。たとえば、エントリー レベルのスマートフォンには、単一の触覚波形を生成するハードウェア機能しかないことがあります。より高度なハードウェア コンポーネントを備えたデバイスでは、より広範囲な非連続の振幅レベルが生成され、HAL で複数の触覚波形を定義できます。HAL - API 定数マッピングでは、HAL 定数を(中程度の振幅をベースラインに)使用して、より強い、またはより弱い効果を合成します。

HAL 定数の範囲とフィードバック振幅の図

図 14. 振幅による HAL 定数の範囲

非連続の振幅を持つ HAL 定数の数を定義したら、HAL 定数と API 定数を HAL 定数の数でマッピングします。このマッピング プロセスでは、シングル インスパルス API 定数を、最大 3 つの振幅レベルの非連続なグループに分割できます。API 定数をセグメント化する方法は、付随する入力イベントの UX 原則に基づきます。詳しくは、ハプティクス UX デザインをご覧ください。

HAL - API 定数マッピングの非連続モデル

図 15. HAL - API 定数マッピング: 非連続モデル

デバイスが、非連続の振幅を持つ 2 つの HAL 定数のみをサポートしている場合は、中振幅レベルと高振幅レベルの HAL 定数を統合することを検討してください。この概念の実例としては、EFFECT_CLICKEFFECT_HEAVY_CLICK を同じ HAL 定数(中振幅レベルの HAL 定数)にマッピングすることが挙げられます。デバイスが、非連続の振幅を持つ 1 つの HAL 定数のみをサポートしている場合は、3 つのレベルをすべて 1 つに統合することを検討してください。

連続モデル

振幅スケーラビリティがある連続モデルは、HAL 定数を定義するために適用できます。スケーリング ファクタ(S)を HAL 定数(HAL_H0HAL_H1 など)に適用して、スケールされた HAL(HAL_H0 × S)を生成できます。この場合、図 16 に示すように、スケールされた HAL は API 定数(HAL_H0 × S1 = H0S1 = EFFECT_TICK)を定義するためにマッピングされます。連続モデルの振幅スケーラビリティを使用することで、デバイスは固有のテクスチャを持つ少数の HAL 定数を格納でき、スケーリング ファクタ(S)を調整することで振幅の変動を追加できます。デバイス メーカーは、提供するさまざまな触覚テクスチャの数に基づいて HAL 定数の数を定義できます。

テクスチャと振幅による HAL 定数の範囲

図 16. テクスチャ(HAL_H0)と振幅スケール(S)による HAL 定数の範囲

HAL - API 定数マッピングの連続モデル

図 17. HAL - API 定数マッピング: 連続モデル

連続モデルでは、異なる HAL 定数は、異なる振幅ではなく、異なる触覚テクスチャを表します。スケーリング ファクタ(S)で振幅を設定できます。ただし、テクスチャの認識(シャープネスなど)は持続と振幅の認識に関係するため、テクスチャとスケーリング ファクタを組み合わせることをおすすめします(HAL - API マッピングの設計プロセス)。

図 18 は、振幅スケーラビリティによって 1 つの HAL から多くの API 定数まで変動を増やす定数マッピングを示しています。

変動増加 1

変動増加 2

図 18. 振幅スケーラビリティによる変動の増加

スケーラブルな API 定数(VibrationEffect.CompositionPRIMITIVE_TICKPRIMITIVE_CLICK など)はすべて、API 定数が addPrimitive(int primitiveID, float scale, int delay) を通じて宣言されている場合、API 定数のエネルギー レベルが float scale パラメータによって異なります。PRIMITIVE_TICKPRIMITIVE_CLICK は、異なる HAL 定数を使用することで明確に区別して設計できます。テクスチャに変動を追加する場合は、この方法をおすすめします。

ステップ 4: ハードウェアを評価する

ハードウェア評価では、この特定の評価のために、効果 1、2、3 というラベルの付いた 3 つの触覚効果を定義します。

効果 1: 事前定義の短い触覚定数

VibrationEffect.EFFECT_CLICK 定数は、ステップ 2 で提供された HAL - API マッピングのベースライン効果または共通点です。これは、よく使用される効果である HapticFeedbackConstants.KEYBOARD_PRESS にマッピングされています。この効果を評価することで、対象デバイスがクリア ハプティクスに対応しているかどうかを判断できます。

効果 2: 短いカスタム触覚効果

VibrationEffect.createOneShot(20,255) 定数は、カスタムの触覚効果用です。短い単一のカスタム インパルスの場合、持続時間を定義する推奨最大しきい値は 20 ミリ秒です。20 ミリ秒を超える単一インパルスは、うるさいバイブレーションとして認識されるため、おすすめしません。

短いカスタム触覚効果の波形

図 19. 短いカスタム触覚効果

効果 3: 振幅変動を伴う長いカスタム触覚効果

VibrationEffect.createWaveform(timings[], amplitudes[], int repeat) 定数は、振幅変動を伴う長いカスタム効果用です。カスタム触覚効果のさまざまな振幅を生成する機能は、リッチ ハプティクスに関するデバイスの機能を評価する指標の一つです。推奨される timings []amplitudes [] はそれぞれ {500, 500}{128, 255} です。500 ミリ秒のサンプリング レートで 50% から 100% まで振幅の増加傾向を示します。

振幅変動を伴う触覚効果の波形

図 20. 振幅変動を伴う長いカスタム触覚効果

効果 3 の振幅制御のハードウェア機能を確認するには、Vibrator.hasAmplitudeControl() メソッドを使用します。振幅が想定どおり変化するように VibrationEffect.createWaveform を実行するには、結果が true になる必要があります。

主観的触覚効果評価のフローチャート

図 21. 触覚効果 1、2、3 の主観評価

主観評価を実施する

一貫性チェックをすばやく行うには、まず主観評価を行います。主観評価の目標は、触覚効果の振幅を観察し、人間が認識できる振幅を持つハプティクスをデバイスが生成できるかどうかを判断することです。

この概念に基づいた具体的な質問は次のようになります。「デバイスは想定どおり、認識可能な触覚効果をユーザーに対して生成できますか?」この質問に答えることで、ユーザーが感じられない認識不能なハプティクスや、波形が想定どおりのパターンを生成しない意図せぬハプティクスなど、ハプティクスの失敗を避けることができます。

高度な評価を実施する

高度な品質評価を実施することを強くおすすめします。高度な品質評価では、触覚効果の定量化可能な属性を特徴づけて、高品質なハプティクスを実装します。終了すると、デバイス メーカーは現在の触覚ステータスを診断できるようになります。つまり、全体的な品質を改善する目標を設定できます。ハードウェア評価をご覧ください。