ההשפעות של מעטפת ליניארית מקוטעת (PWLE) הן רצפים של נקודות שמגדירות את תדירות הרטט והתאוצה לאורך זמן. האפליקציות מסוג PWLE מספקות משוב הפטי עשיר ודינמי יותר.
Android מגרסה 16 ואילך מספק שני ממשקי API למפתחי אפליקציות כדי לעזור להם ליצור אפקטים של PWLE:
- ממשק API בסיסי של PWLE: פשוט, אבל עם מגבלות. אפשר להתחיל איתה במהירות. האפשרות הזו זמינה בכתובת
BasicEnvelopeBuilder
. - Advanced PWLE API: שליטה וגמישות רבות יותר, נדרש ידע ב-haptics והיכרות עם חומרה. זמין בכתובת
WaveformEnvelopeBuilder
.
כדי לתמוך בממשקי ה-API האלה, המכשירים צריכים להטמיע את ממשקי ה-API הבאים של HAL:
- מיפוי תדירות לתאוצת פלט (FOAM): מספק מיפוי של תדירות הרטט לתאוצת הפלט המקסימלית שאפשר להשיג במכשיר.
- Compose PWLE: מפעיל רטט שמוגדר על ידי PWLE של צורת הגל של הרטט.
Basic PWLE API
כדי ליצור במהירות אפקטים של PWLE בלי להתעמק בחומרה או בניואנסים של התפיסה האנושית, מפתחים יכולים להשתמש ב-PWLE API הבסיסי, שמוגדר באמצעות הפרמטרים הבאים:
- הערך של עוצמה בטווח [0, 1] מייצג את העוצמה הנתפסת של הרטט. לדוגמה, ערך של 0.5 נתפס כמחצית מהעוצמה המקסימלית הגלובלית שאפשר להשיג במכשיר.
- הערך של Sharpness בטווח [0, 1] מייצג את החדות של הרטט. ערכים נמוכים יותר יוצרים תחושה חלקה יותר של הרטט, וערכים גבוהים יותר יוצרים תחושה חדה יותר.
- משך הזמן הוא הזמן שנדרש למעבר מנקודת ה-PWLE האחרונה (כלומר, זוג הערכים של עוצמת ההארה והחדות) לנקודה החדשה, באלפיות שנייה.
דוגמה לצורת גל שבה העוצמה עולה בהדרגה מפיץ' נמוך לרטט בעוצמה מקסימלית עם פיץ' גבוה במשך 500 אלפיות השנייה, ואז יורדת בהדרגה ל-0 (למצב לא פעיל) במשך 100 אלפיות השנייה:
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. המגבלה הזו מונעת אפקטים דינמיים לא רצויים ברעידות, בגלל אי-רציפות במשרעת שיכולה להשפיע לרעה על התפיסה המישושית של המשתמש.
כדי להבטיח עיבוד עקבי של אפקט PWLE בכל מערכת Android, נדרש שהמכשירים שתומכים בתכונה הזו יוכלו לטפל במשך מינימלי של 10 אלפיות השנייה בין נקודות PWLE ולפחות 16 נקודות לאפקטים של PWLE. הדרישות האלה נאכפות על ידי בדיקות VTS, ועוזרות לוודא שאפקטי PWLE יהיו אמינים בכל מכשירי Android.
Advanced PWLE API
מפתחים בעלי ידע מתקדם בתחום המשוב המישוש יכולים להגדיר אפקטים של PWLE באמצעות הקריטריונים הבאים:
- הערך של Amplitude בטווח [0, 1] מייצג את העוצמה שאפשר להשיג בתדירות נתונה, כפי שנקבע על ידי ה-FOAM של המכשיר. לדוגמה, ערך של 0.5 יוצר מחצית מהתאוצה המקסימלית של הפלט שאפשר להשיג בתדר הנתון.
- התדירות מצוינת ישירות בהרץ.
- משך הזמן הוא הזמן שנדרש למעבר מהנקודה האחרונה של PWLE לנקודה החדשה, באלפיות השנייה.
דוגמה לצורת גל שבה עוצמת הרטט עולה בהדרגה מ-0 עד לעוצמה מלאה בתדר של 120 הרץ במשך 100 אלפיות השנייה, נשארת בעוצמה הזו במשך 200 אלפיות השנייה, ואז יורדת בהדרגה במשך 100 אלפיות השנייה:
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)
כדי לתמוך בממשקי ה-API של PWLE, חשוב להציג בצורה מדויקת את היכולות של המכשיר להפיק תאוצה בתדרים שונים. בקטע הזה מוסבר למה הנתונים האלה חשובים, איך ממשקי ה-API של PWLE משתמשים בהם ואיך הם נוצרים.
הסבר על המיפוי
מכשירים שתומכים באפקטים של PWLE צריכים לספק תדר לפלט של מפת האצה (FOAM). ה-FOAM הוא מבנה נתונים שנוצר על ידי HAL, שממפה את תדירות הרטט (בהרץ) לתאוצת הפלט המקסימלית שאפשר להשיג במפעיל (ב-G peak) בתדירות הזו. המפה הזו חשובה כדי להבין את השינויים בפלט הרטט בטווח התדרים הנתמך, וכדי להגדיר את ה-API הבסיסי של PWLE.
בתרשים הבא מוצגת דוגמה ל-FOAM עבור מפעיל רזוננטי טיפוסי, עם מתח כניסה מוגבל סביב תדר הרזוננס כדי להגן על המנוע:
איור 1. דוגמה ל-FOAM עבור מפעיל תהודה טיפוסי.
ה-FOAM משמש לשלוש מטרות עיקריות:
- הגדרת טווח התדרים המלא: ה-FOAM מגדיר את טווח התדרים המלא של המכשיר על ידי ציון תדרי הרטט המינימליים והמקסימליים הנתמכים.
- הגדרת ערכי העוצמה והחדות: ה-API הבסיסי של PWLE פועל על סולם תפיסה אנושי של עוצמה וחדות, שמופים לפרמטרים של תדר ומשרעת בחומרה באמצעות ערכי ההאצה של הפלט ב-FOAM. המיפוי הזה עוזר לוודא שהאפקטים של המשוב המישוש מוצגים בהתאם ליכולות החומרה. טווח החדות מוגדר על ידי הסף המינימלי שניתן לתפיסה ומתאים לתדרים שבהם המכשיר יכול ליצור אפקטים הפטיים שהמשתמשים יכולים להרגיש. המסגרת ממפה את ערכי העוצמה לאמפליטודה על סמך תאוצת הפלט של היעד בתדר שנבחר. כך אפשר לוודא שרמת העוצמה שנבחרה מושגת תוך שמירה על היכולות של המכשיר.
- חשיפת יכולות החומרה: ה-FOAM נחשף למפתחים ב-
VibratorFrequencyProfile
, ומספק את התדר המלא להפקת מערך נתונים של האצה שמפרט חלק מהיכולות ההפטיות של המכשיר. הנתונים האלה מאפשרים למפתחים שמשתמשים ב-API המתקדם של PWLE ליצור אפקטים מותאמים אישית של רטט, שחורגים מטווח העוצמה והחדות הבסיסיים שמוגדרים ב-framework.
FOAM ו-PWLE API בסיסי
ל-FOAM יש תפקיד חשוב בעיצוב אפקטי הרטט. הוא משמש לחישוב טווח החדות של ה-API הבסיסי של המעטפה, כדי לוודא שהמשתמש יוכל להרגיש את הרטט. הטווח הזה תואם לתדרים שבהם ההאצה של הפלט היא לפחות 10 dB מעל סף הזיהוי של התפיסה האנושית (כלומר, הרמה המינימלית שניתנת לתפיסה) לכל תדר. כך מוודאים שהרטט חזק מספיק כדי להרגיש אותו.
בנוסף, המסגרת משתמשת בנתוני ה-FOAM כדי למפות את ערכי העוצמה והחדות שמשמשים ב-API הבסיסי של PWLE לערכי המשרעת והתדירות התואמים. המיפוי הזה עוזר ליצור משוב הפטי שניתן לתפיסה במכשירים שונים.
במערכת VTS יש בדיקות שנועדו לוודא שלמכשירים שתומכים באפקטים של מעטפת יש טווח תדרים לא ריק שמפיק רעידות מורגשות. כך אפשר לוודא שהמכשיר יכול ליצור רטט בעוצמה מספקת כדי שהמשתמשים יוכלו להרגיש אותו בבירור.
FOAM ו-API מתקדם של PWLE
מפתחים יכולים לגשת ל-FOAM דרך VibratorFrequencyProfile
עם המידע הבא:
- טווח התדרים: מפתחים יכולים לאחזר את התדרים המינימליים והמקסימליים הנתמכים במכשיר, בהרץ, באמצעות
getMinFrequencyHz
ו-getMaxFrequencyHz
, בהתאמה. - התאוצה המקסימלית של הפלט: התאוצה המקסימלית של הפלט שהמכשיר יכול להשיג (ב-G) זמינה דרך
getMaxOutputAccelerationGs
. - מיפוי תדירות להאצת פלט:
getFrequenciesOutputAcceleration
מספק את המיפוי של תדירות להאצת פלט כפי שמיושם ב-HAL.
מפתחים יכולים להשתמש במידע הזה כשהם יוצרים אפקטים של מעטפות באמצעות PWLE API מתקדם. לדוגמה, כשמציינים תאוצת פלט (ב-G), צריך לנרמל אותה לערך בטווח [0.0, 1.0], ביחס לתאוצת הפלט המקסימלית של המכשיר.
באמצעות PWLE API מתקדם, מפתחים יכולים להשתמש בכל טווח התדרים, ולכן חשוב שנתוני ה-FOAM שסופקו יהיו בטוחים לשימוש במנגנון הרטט ולא יעלו על היכולות שלו.
הסף לזיהוי תפיסה אנושית
סף הגילוי של תפיסה אנושית מתייחס לתאוצה המינימלית של רטט שאדם יכול לזהות באופן מהימן. הרמה משתנה בהתאם לתדירות הרטט.
בתרשים הבא מוצג סף הזיהוי של תפיסה מישושית אצל בני אדם1, בתאוצה, כפונקציה של תדירות זמנית:
איור 2. הסף לזיהוי תפיסה מישושית אנושית.
כדי שהמשתמשים יוכלו להרגיש את האפקטים ההפטיים באופן עקבי, בדיקות VTS מאמתות שלמכשירים עם יכולות מעטפת יש טווח תדרים שיכול ליצור אמפליטודות של רטט שחורגות ב-10 dB מסף הזיהוי של התפיסה האנושית.
עוצמת הרטט שנתפסת לעומת אמפליטודת תאוצת הרטט
התפיסה האנושית של עוצמת הרטט (מדד תפיסתי) לא גדלה באופן ליניארי עם אמפליטודת הרטט (פרמטר פיזיקלי). ה-API של PWLE מניח שכאשר מעצב או מפתח חושבים על שינויים בעוצמת הרטט, הם מצפים שהעוצמה הנתפסת תפעל לפי PWLE. העוצמה הנתפסת מאופיינת ברמת התחושה (SL), שמוגדרת כ-dB מעל סף הזיהוי באותה תדירות. לכן, אפשר לחשב את אמפליטודת התאוצה של הרטט (ב-G peak) באופן הבא:
\(Amplitude(G) =10^\frac{Amplitude(db)}{20}\)
כאשר עוצמת הקול בדציבלים היא הסכום של רמת הקול וסף הזיהוי (הערך לאורך ציר ה-y בתרשים הבא) בתדר מסוים.
כך, ה-API של PWLE מבטיח ששינויים בעוצמה הנתפסת יהיו ליניאריים בין זוגות עוקבים של נקודות בקרה.
בתרשים הבא מוצגות רמות התאוצה של הרטט2 ב-10, 20, 30, 40 ו-50 dB SL, יחד עם סף הזיהוי של התפיסה המישושית של בני אדם (0 dB 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
: תגובת המשרעת של מערכת מסה, בולם זעזועים וקפיץ מסדר שני, שמחושבת כך:
\(\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}\)
לדוגמה, אם התאוצה של המודול היא 1 g והתאוצה של הטלפון היא 2.5 g, אז Loc_coeff
= 2.5. המשמעות היא הגברה פי 2.5.
מסגרת Android מקבלת תדר ביחידה של הרץ, ולכן שכבת HAL צריכה להמיר את יחידת התדר מרדיאנים לשנייה להרץ כשיוצרים את נתוני ה-FOAM.
יצירת עקומת ה-FOAM
משלבים את עקומת המתח המקסימלי (V
) עם חישוב ההאצה (M
) כדי לקבוע את עקומת ה-FOAM:
- לכל תדר (
f
) בטווח הרצוי, מחפשים את המתח המקסימלי (V(f)
) המתאים מתוך עקומת המתח המקסימלי. - מחשבים את התאוצה המקסימלית בתדר הזה באמצעות המשוואה שלמעלה, ומציבים את
V(f)
במקוםVsys
ואתf
המתאים במקוםw
. כך תוכלוM(V(f), f)
. - ההאצה המחושבת הזו היא הערך
FOAM(f)
שלכם.
חשיפת נתוני ה-FOAM
אחרי שנוצר עקומת ה-FOAM, ה-HAL מייצג את העקומה כרשימה של FrequencyAccelerationMapEntry
אובייקטים. כל רשומה מגדירה נקודה במיפוי, ומציינת תדר (בהרץ) ואת תאוצת הפלט המקסימלית התואמת (בשיא G).
אין דרישות מחמירות לגבי הרזולוציה של ה-FOAM, אבל מומלץ להגדיר עקומות עם שיא מקסימלי אחד. ב-API הבסיסי של מעטפת, נעשה שימוש רק בשיא הראשון כדי למפות את אפקטי הרטט. כדי לשפר את הדיוק של האינטרפולציה הלינארית כשקובעים ערכי תאוצה ביניים, מומלץ להגדיר רזולוציית תדר גבוהה סביב השיא. לדוגמה, משתמשים בצעדים של 1 Hz בטווח של +/- 10 Hz של תדר השיא.
יכולות ומגבלות של מכשירים
ב-Android מגרסה 16 ואילך, כדי לעזור למפתחים לבצע אופטימיזציה של אפקטי PWLE ולהבטיח תאימות בין מכשירים, מערכת Android כוללת ממשקי HAL API לשאילתת יכולות ה-PWLE של המכשיר. השיטות האלה מספקות מידע על המגבלות של המכשיר, כמו משך הזמן המינימלי או המקסימלי של פרימיטיב PWLE ומספר הפרימיטיבים שמותרים בקומפוזיציה של PWLE.
ממשקי ה-API של HAL כוללים:
-
CAP_COMPOSE_PWLE_EFFECTS_V2
: מוחזר על ידיIVibrator.getCapabilities
כשהמכשיר תומך בתכונה הזו. -
getFrequencyToOutputAccelerationMap
: מאחזר את נתוני FOAM. -
getPwleV2PrimitiveDurationMinMillis
: מאחזר את משך הזמן המינימלי שמותר לכל פרימיטיב PWLE באלפיות השנייה. -
getPwleV2PrimitiveDurationMaxMillis
: מאחזר את משך הזמן המקסימלי שמותר לכל PWLE פרימיטיבי באלפיות השנייה. -
getPwleV2CompositionSizeMax
: מאחזר את המספר המקסימלי של פרימיטיבים של PWLE שנתמכים על ידיIVibrator.composePwleV2
.
המידע הזה חשוף למפתחים כדי לאפשר להם להתאים את האפקטים ליכולות הספציפיות של מכשיר היעד, במיוחד כשמשתמשים ב-API המתקדם של PWLE.
בנוסף, ה-framework משתמש בממשקי ה-API האלה כשמטפלים באפקטים שנוצרו באמצעות API בסיסי. אם אפקט חורג מהמגבלות של המכשיר (לדוגמה, יותר מדי נקודות PWLE או משך זמן שחורג מהמקסימום), המסגרת מתאימה אוטומטית את האפקט כך שיתאים לגבולות המותרים. תהליך ההתאמה הזה מנסה לשמור על הכוונה המקורית ועל התחושה של העיצוב ככל האפשר.
-
נתוני הסף מומרים מסף ההעתקה באיור 1 של Bolanowski Jr., S. J., et al.. "Four channels mediate the mechanical aspects of touch." Journal of the Acoustical Society of America 84(5): 1680-1694 (1988). במדריך הזה אונליין מוסבר איך להמיר בין משרעת תאוצה למשרעת תזוזה. ↩
-
הנתונים הם הערכה שמתבססת על איור 8 במאמר של Verrillo, R. T., ואחרים. "Sensation magnitude of vibrotactile stimuli". Perception & Psychophysics 6: 366-372 (1969). ↩