סוגי חיישנים

סעיף זה מתאר צירי חיישן, חיישני בסיס וחיישנים מורכבים (פעילות, גישה, לא מכויל ואינטראקציה).

צירי חיישן

ערכי אירועי חיישן מחיישנים רבים מתבטאים במסגרת ספציפית שהיא סטטית ביחס למכשיר.

צירי מכשיר נייד

ה-Sensor API הוא יחסי רק לכיוון הטבעי של המסך (הצירים אינם מוחלפים כאשר כיוון המסך של המכשיר משתנה.

מערכת קואורדינטות של חיישן API עבור מכשירים ניידים

איור 1. מערכת קואורדינטות (ביחס למכשיר נייד) המשמשת את ה-Sensor API

צירי רכב

ביישומי Android Automotive, צירים מוגדרים ביחס למסגרת גוף הרכב. המקור של מסגרת הייחוס של הרכב הוא מרכז הסרן האחורי. מסגרת הייחוס של הרכב מכוונת כך ש:

  • ציר X מצביע ימינה ונמצא במישור אופקי, בניצב למישור הסימטריה של הרכב.
  • ציר Y מצביע קדימה ונמצא במישור אופקי.
מערכת קואורדינטות של חיישן API עבור מכשירי רכב

איור 2. מערכת קואורדינטות (ביחס למכשיר רכב) המשמשת את ה-Sensor API

מסגרת הייחוס של הרכב היא מערכת קואורדינטות ימנית. לכן, ציר ה-Z מצביע כלפי מעלה.

ציר ה-Z של מסגרת הייחוס מיושר לכוח הכבידה, מה שאומר שציר ה-X וציר ה-Y שניהם אופקיים. כתוצאה מכך, ייתכן שציר ה-Y לא תמיד יעבור דרך הסרן הקדמי.

חיישני בסיס

סוגי חיישני בסיס נקראים על שם החיישנים הפיזיים שהם מייצגים. חיישנים אלו מעבירים נתונים מחישן פיזי בודד (בניגוד לחיישנים מרוכבים שמייצרים נתונים מחיישנים אחרים). דוגמאות לסוגי חיישני בסיס כוללות:

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

עם זאת, חיישני בסיס אינם שווים ואסור לבלבל אותם עם החיישן הפיזי הבסיסי שלהם. הנתונים מחיישן בסיס אינם הפלט הגולמי של החיישן הפיזי מכיוון שבוצעו תיקונים (כגון פיצוי הטיה ופיצוי טמפרטורה).

לדוגמה, המאפיינים של חיישן בסיס עשויים להיות שונים מהמאפיינים של החיישן הפיזי הבסיסי שלו במקרים השימוש הבאים:

  • שבב גירוסקופ מדורג לטווח הטיה של 1 מעלות לשנייה.
    • לאחר כיול מפעל, פיצוי טמפרטורה ופיצוי הטיה מיושמים, ההטיה בפועל של חיישן האנדרואיד תפחת, עשויה להיות עד לנקודה שבה ההטיה מובטחת מתחת ל-0.01 מעלות/שנייה.
    • במצב זה, אנו אומרים שלחיישן האנדרואיד יש הטיה מתחת ל-0.01 מעלות לשנייה, למרות שגיליון הנתונים של החיישן הבסיסי אמר 1 מעלות לשנייה.
  • ברומטר בצריכת חשמל של 100 uW.
    • מכיוון שצריך להעביר את הנתונים שנוצרו מהשבב ל-SoC, עלות הכוח בפועל לאיסוף נתונים מחיישן האנדרואיד הברומטר עשויה להיות גבוהה בהרבה, למשל 1000 uW.
    • במצב זה, אנו אומרים שלחיישן האנדרואיד יש צריכת חשמל של 1000 uW, למרות שצריכת החשמל הנמדדת במובילי שבב הברומטר היא 100uW.
  • מגנומטר שצורך 100uW בכיול, אך צורך יותר בכיול.
    • שגרת הכיול שלו עשויה לדרוש הפעלת הג'ירוסקופ, צריכת 5000 uW והפעלת אלגוריתם כלשהו, ​​בעלות של עוד 900 uW.
    • במצב זה, אנו אומרים שצריכת החשמל המקסימלית של חיישן האנדרואיד (מגנטומטר) היא 6000 uW.
    • במקרה זה, צריכת החשמל הממוצעת היא המדד השימושי יותר, וזה מה שמדווח במאפיינים הסטטיים של החיישן דרך ה-HAL.

מד תאוצה

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) מחזיר חיישן שאינו מתעורר

חיישן מד תאוצה מדווח על האצת המכשיר לאורך שלושת צירי החיישן. התאוצה הנמדדת כוללת גם את התאוצה הפיזית (שינוי מהירות) וגם את כוח המשיכה. המדידה מדווחת בשדות x, y ו-z של sensors_event_t.acceleration.

כל הערכים הם ביחידות SI (m/s^2) ומודדים את תאוצת המכשיר מינוס כוח הכבידה לאורך שלושת צירי החיישן.

הנה דוגמאות:

  • הנורמה של (x, y, z) צריכה להיות קרובה ל-0 בעת נפילה חופשית.
  • כאשר המכשיר שוכב שטוח על שולחן ונדחק בצדו השמאלי לכיוון ימין, ערך התאוצה x חיובי.
  • כאשר המכשיר שוכב שטוח על שולחן, ערך התאוצה לאורך z הוא +9.81 alo, המתאים לתאוצת המכשיר (0 m/s^2) פחות כוח הכבידה (-9.81 m/s^2).
  • כאשר המכשיר שוכב שטוח על שולחן ונדחק לכיוון השמים, ערך התאוצה גדול מ-9.81+, המתאים לתאוצת המכשיר (+A m/s^2) פחות כוח הכבידה (-9.81 מ'). /s^2).

הקריאות מכוילות באמצעות:

  • פיצוי טמפרטורה
  • כיול הטיה מקוון
  • כיול קנה מידה מקוון

יש לעדכן את ההטיה וכיול קנה המידה רק בזמן שהחיישן מושבת, כדי למנוע גרימת קפיצות בערכים במהלך הסטרימינג.

מד התאוצה גם מדווח עד כמה מדויק הוא מצפה שהקריאות שלו יהיו באמצעות sensors_event_t.acceleration.status . עיין SensorManager SENSOR_STATUS_* של SensorManager למידע נוסף על ערכים אפשריים עבור שדה זה.

טמפרטורת הסביבה

מצב דיווח: בשינוי

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) מחזיר חיישן שאינו מתעורר

חיישן זה מספק את טמפרטורת הסביבה (חדר) במעלות צלזיוס.

חיישן שדה מגנטי

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) מחזיר חיישן שאינו מתעורר

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

חיישן שדה מגנטי (המכונה גם מגנומטר) מדווח על השדה המגנטי הסביבה, כפי שנמדד לאורך שלושת צירי החיישן.

המדידה מדווחת בשדות x, y ו-z של sensors_event_t.magnetic וכל הערכים הם במיקרו-טסלה (uT).

המגנומטר גם מדווח עד כמה מדויק הוא מצפה שהקריאות שלו יהיו באמצעות sensors_event_t.magnetic.status . עיין SensorManager SENSOR_STATUS_* של SensorManager למידע נוסף על ערכים אפשריים עבור שדה זה.

הקריאות מכוילות באמצעות:

  • פיצוי טמפרטורה
  • כיול ברזל רך במפעל (או מקוון).
  • כיול ברזל קשיח מקוון

ג'ִירוֹסקוֹפּ

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) מחזיר חיישן שאינו מתעורר

חיישן גירוסקופ מדווח על קצב הסיבוב של המכשיר סביב שלושת צירי החיישן.

הסיבוב חיובי בכיוון השעון (כלל יד ימין). כלומר, צופה המתבונן ממיקום חיובי כלשהו על ציר x, y או z בהתקן הממוקם על המקור ידווח על סיבוב חיובי אם נראה שהמכשיר מסתובב נגד כיוון השעון. שימו לב שזו ההגדרה המתמטית הסטנדרטית של סיבוב חיובי ואינה מסכימה עם הגדרת התעופה והחלל של גלגול.

המדידה מדווחת בשדות x, y ו-z של sensors_event_t.gyro וכל הערכים הם ברדיאנים לשנייה (rad/s).

הקריאות מכוילות באמצעות:

  • פיצוי טמפרטורה
  • פיצוי בקנה מידה מפעל (או מקוון).
  • כיול הטיה מקוון (כדי להסיר סחף)

הג'ירוסקופ גם מדווח עד כמה הוא מצפה שהקריאות שלו יהיו מדויקות באמצעות sensors_event_t.gyro.status . עיין SensorManager SENSOR_STATUS_* של SensorManager למידע נוסף על ערכים אפשריים עבור שדה זה.

לא ניתן לחקות את הג'ירוסקופ בהתבסס על מגנומטרים ומדדי תאוצה, מכיוון שהדבר יגרום להפחתת העקביות וההיענות המקומית. זה חייב להיות מבוסס על שבב גירוסקופ רגיל.

קצב לב

מצב דיווח: בשינוי

getDefaultSensor(SENSOR_TYPE_HEART_RATE) מחזיר חיישן שאינו מתעורר

חיישן דופק מדווח על הדופק הנוכחי של האדם הנוגע במכשיר.

הדופק הנוכחי בפעימות לדקה (BPM) מדווח ב- sensors_event_t.heart_rate.bpm ומצב החיישן מדווח ב- sensors_event_t.heart_rate.status . עיין SensorManager SENSOR_STATUS_* של SensorManager למידע נוסף על ערכים אפשריים עבור שדה זה. בפרט, עם ההפעלה הראשונה, אלא אם ידוע שהמכשיר אינו על הגוף, יש להגדיר את שדה המצב של האירוע הראשון ל- SENSOR_STATUS_UNRELIABLE . מכיוון שחיישן זה משתנה, אירועים נוצרים כאשר ורק כאשר heart_rate.bpm או heart_rate.status השתנו מאז האירוע האחרון. האירועים נוצרים לא מהר יותר מכל sampling_period .

sensor_t.requiredPermission היא תמיד SENSOR_PERMISSION_BODY_SENSORS .

אוֹר

מצב דיווח: בשינוי

getDefaultSensor(SENSOR_TYPE_LIGHT) מחזיר חיישן שאינו מתעורר

חיישן אור מדווח על התאורה הנוכחית ביחידות SI lux.

המדידה מדווחת ב- sensors_event_t.light .

קִרבָה

מצב דיווח: בשינוי

בדרך כלל מוגדר כחיישן התעוררות

getDefaultSensor(SENSOR_TYPE_PROXIMITY) מחזיר חיישן השכמה

חיישן קרבה מדווח על המרחק מהחיישן למשטח הנראה הקרוב ביותר.

עד אנדרואיד 4.4, חיישני הקרבה היו תמיד חיישני התעוררות, שהעירו את ה-SoC בעת זיהוי שינוי בקירבה. לאחר אנדרואיד 4.4, אנו ממליצים ליישם תחילה את גרסת ההתעוררות של חיישן זה, מכיוון שהיא זו המשמשת להפעלה וכיבוי של המסך בזמן ביצוע שיחות טלפון.

המדידה מדווחת בסנטימטרים ב- sensors_event_t.distance . שים לב שחלק מחיישני הקרבה תומכים רק במדידה בינארית של "קרוב" או "רחוק". במקרה זה, החיישן מדווח על ערך ה- sensor_t.maxRange שלו במצב "רחוק" וערך קטן מ- sensor_t.maxRange במצב "קרוב".

לַחַץ

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_PRESSURE) מחזיר חיישן שאינו מתעורר

חיישן לחץ (המכונה גם ברומטר) מדווח על הלחץ האטמוספרי בהקטופסקל (hPa).

הקריאות מכוילות באמצעות

  • פיצוי טמפרטורה
  • כיול הטיית מפעל
  • כיול בקנה מידה מפעל

הברומטר משמש לעתים קרובות להערכת שינויי גובה. כדי להעריך את הגובה המוחלט, יש להשתמש בלחץ בגובה פני הים (המשתנה בהתאם למזג האוויר) כהתייחסות.

לחות יחסית

מצב דיווח: בשינוי

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) מחזיר חיישן שאינו מתעורר

חיישן לחות יחסית מודד את הלחות היחסית באוויר ומחזיר ערך באחוזים.

סוגי חיישנים מרוכבים

חיישן מורכב מייצר נתונים על ידי עיבוד ו/או מיזוג נתונים מחיישנים פיזיים אחד או כמה. (כל חיישן שאינו חיישן בסיס נקרא חיישן מורכב.) דוגמאות לחיישנים מרוכבים כוללות:

  • גלאי צעדים ותנועה משמעותית , המבוססים בדרך כלל על מד תאוצה, אך יכולים להתבסס גם על חיישנים אחרים, אם צריכת החשמל והדיוק היו מקובלים.
  • וקטור סיבוב משחק , מבוסס על מד תאוצה וג'ירוסקופ.
  • גירוסקופ לא מכויל , הדומה לחיישן בסיס הגירוסקופ, אך עם כיול ההטיה מדווח בנפרד במקום להיות מתוקן במדידה.

כמו בחיישני בסיס, המאפיינים של החיישנים המרוכבים מגיעים מהמאפיינים של הנתונים הסופיים שלהם. לדוגמה, צריכת החשמל של וקטור סיבוב משחק שווה כנראה לסכום צריכת ההספק של שבב מד התאוצה, שבב הג'ירוסקופ, השבב המעבד את הנתונים והאוטובוסים שמעבירים את הנתונים. כדוגמה נוספת, הסחף של וקטור סיבוב משחק תלוי באותה מידה באיכות אלגוריתם הכיול כמו במאפייני החיישן הפיזי.

הטבלה הבאה מפרטת סוגי חיישנים מרוכבים זמינים. כל חיישן מורכב מסתמך על נתונים מחיישנים פיזיים אחד או כמה. הימנע מבחירה בחיישנים פיזיים אחרים כדי להעריך את התוצאות מכיוון שהם מספקים חווית משתמש גרועה.

סוג חיישן קטגוריה חיישנים פיזיים בבסיס מצב דיווח

וקטור סיבוב משחק

יַחַס

מד תאוצה, גירוסקופ, אסור להשתמש במגנטומטר

רָצִיף

וקטור סיבוב גיאומגנטי חיישן הספק נמוך

יַחַס

מד תאוצה, מגנומטר, אסור להשתמש בג'ירוסקופ

רָצִיף

מחוות מבט חיישן הספק נמוך

אינטראקציה

לא מוגדר

ירייה אחת

כוח משיכה

יַחַס

מד תאוצה, גירוסקופ

רָצִיף

גירוסקופ לא מכויל

לא מכויל

ג'ִירוֹסקוֹפּ

רָצִיף

תאוצה לינארית

פעילות

מד תאוצה, ג'ירוסקופ (אם קיים), או מגנומטר (אם אין ג'ירו)

רָצִיף

שדה מגנטי לא מכויל

לא מכויל

מגנומטר

רָצִיף

כיוון (הוצא משימוש)

יַחַס

מד תאוצה, מגנומטר, גירוסקופ (אם קיים)

רָצִיף

הרם מחווה חיישן הספק נמוך

אינטראקציה

לא מוגדר

ירייה אחת

וקטור סיבוב

יַחַס

מד תאוצה, מגנומטר, גירוסקופ

רָצִיף

תנועה משמעותית חיישן הספק נמוך

פעילות

מד תאוצה (או אחר כל עוד הספק נמוך מאוד)

ירייה אחת

מד צעדים חיישן הספק נמוך

פעילות

מד תאוצה

בשינוי

גלאי צעדים חיישן הספק נמוך

פעילות

מד תאוצה

מיוחד

גלאי הטיה חיישן הספק נמוך

פעילות

מד תאוצה

מיוחד

מחווה להתעורר חיישן הספק נמוך

אינטראקציה

לא מוגדר

ירייה אחת

חיישן הספק נמוך = חיישן הספק נמוך

חיישני פעילות מרוכבים

תאוצה לינארית

חיישנים פיזיים בבסיס: מד תאוצה וג'ירוסקופ (אם קיים) (או מגנומטר אם אין גירוסקופ)

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) מחזיר חיישן שאינו מתעורר

חיישן תאוצה ליניארית מדווח על התאוצה הליניארית של המכשיר במסגרת החיישן, לא כולל כוח המשיכה.

התפוקה היא רעיונית: פלט של מד התאוצה מינוס הפלט של חיישן הכבידה . זה מדווח ב-m/s^2 בשדות x, y ו-z של sensors_event_t.acceleration .

הקריאות בכל הצירים צריכות להיות קרובות ל-0 כאשר המכשיר אינו פעיל.

אם למכשיר יש גירוסקופ, חיישן התאוצה הליניארי חייב להשתמש בגירוסקופ ובמד התאוצה כקלט.

אם למכשיר אין גירוסקופ, חיישן התאוצה הליניארי חייב להשתמש במד התאוצה ובמגנטומטר כקלט.

תנועה משמעותית

חיישן פיזי בסיסי: מד תאוצה (או מד תאוצה אחר, כל עוד הספק נמוך)

מצב דיווח: חד פעמי

צריכת חשמל נמוכה

יישם רק את גרסת ההתעוררות של חיישן זה.

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) מחזיר חיישן השכמה

גלאי תנועה משמעותי מופעל בעת זיהוי תנועה משמעותית : תנועה שעלולה להוביל לשינוי במיקום המשתמש.

דוגמאות לתנועות משמעותיות כאלה הן:

  • הליכה או רכיבה על אופניים
  • יושבים במכונית נוסעת, אוטובוס או רכבת

דוגמאות למצבים שאינם מפעילים תנועה משמעותית:

  • הטלפון בכיס והאדם לא זז
  • הטלפון על השולחן והשולחן רועד מעט בגלל תנועה או מכונת כביסה בקרבת מקום

ברמה הגבוהה, גלאי התנועה המשמעותי משמש להפחתת צריכת החשמל של קביעת המיקום. כאשר אלגוריתמי הלוקליזציה מזהים שהמכשיר סטטי, הם יכולים לעבור למצב של צריכת חשמל נמוכה, שבו הם מסתמכים על תנועה משמעותית כדי להעיר את המכשיר כאשר המשתמש משנה מיקום.

חיישן זה חייב להיות בעל הספק נמוך. זה יוצר פשרה לצריכת חשמל שעלולה לגרום לכמות קטנה של שליליות שגויות. זה נעשה מכמה סיבות:

  • המטרה של חיישן זה היא לחסוך בחשמל.
  • הפעלת אירוע כשהמשתמש לא זז (פוזיטיבי שגוי) היא יקרה מבחינת כוח, ולכן יש להימנע ממנה.
  • אי הפעלת אירוע כשהמשתמש זז (שלילי כוזב) מקובל כל עוד זה לא נעשה שוב ושוב. אם המשתמש הלך במשך 10 שניות, אי הפעלת אירוע בתוך 10 שניות אלו אינה מקובלת.

כל אירוע חיישן מדווח על 1 ב- sensors_event_t.data[0] .

גלאי צעדים

חיישן פיזי בסיסי: מד תאוצה (+ אולי אחרים כל עוד הספק נמוך)

מצב דיווח: מיוחד (אירוע אחד בכל צעד שנעשה)

צריכת חשמל נמוכה

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) מחזיר חיישן שאינו מתעורר

גלאי צעדים יוצר אירוע בכל פעם שנעשה צעד על ידי המשתמש.

חותמת הזמן של חיישני האירועים_ sensors_event_t.timestamp מתאימה למועד פגיעת הרגל בקרקע, מה שיוצר וריאציה גבוהה בתאוצה.

בהשוואה למונה הצעדים, לגלאי הצעדים אמור להיות חביון נמוך יותר (פחות משתי שניות). גם גלאי הצעדים וגם מונה הצעדים מזהים כאשר המשתמש הולך, רץ ועולה במעלה המדרגות. הם לא אמורים להפעיל כאשר המשתמש רוכב על אופניים, נוהג או ברכב אחר.

חיישן זה חייב להיות בעל הספק נמוך. כלומר, אם לא ניתן לבצע את זיהוי הצעדים בחומרה, אין להגדיר את החיישן הזה. בפרט, כאשר גלאי הצעדים מופעל ומד התאוצה אינו פועל, רק שלבים צריכים להפעיל פסיקות (לא כל קריאת מד תאוצה).

ל- sampling_period_ns אין השפעה על גלאי צעדים.

כל אירוע חיישן מדווח על 1 ב- sensors_event_t.data[0] .

מד צעדים

חיישן פיזי בסיסי: מד תאוצה (+ אולי אחרים כל עוד הספק נמוך)

מצב דיווח: בשינוי

צריכת חשמל נמוכה

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) מחזיר חיישן שאינו מתעורר

מונה צעדים מדווח על מספר הצעדים שביצע המשתמש מאז האתחול האחרון בזמן ההפעלה.

המדידה מדווחת כ- uint64_t ב-sensors_event_t.step_counter sensors_event_t.step_counter לאפס רק באתחול מחדש של המערכת.

חותמת הזמן של האירוע מוגדרת לשעה שבה נעשה הצעד האחרון עבור אותו אירוע.

ראה את סוג חיישן גלאי הצעד לסימן הזמן של צעד.

בהשוואה לגלאי הצעדים, מונה הצעדים יכול להיות בעל חביון גבוה יותר (עד 10 שניות). הודות לאחביון זה, לחיישן זה יש דיוק גבוה; ספירת הצעדים לאחר יום שלם של מדידות צריכה להיות בטווח של 10% מספירת הצעדים בפועל. גם גלאי הצעדים וגם מונה הצעדים מזהים כאשר המשתמש הולך, רץ ועולה במעלה המדרגות. הם לא אמורים להפעיל כאשר המשתמש רוכב על אופניים, נוהג או ברכב אחר.

החומרה חייבת להבטיח שספירת הצעדים הפנימית לעולם לא תעלה על גדותיה. הגודל המינימלי של המונה הפנימי של החומרה יהיה 16 סיביות. במקרה של גלישה קרובה (לכל היותר כל ~2^16 שלבים), ניתן להעיר את ה-SoC כך שהנהג יוכל לבצע את תחזוקת הדלפק.

כפי שצוין באינטראקציה , בזמן שחיישן זה פועל, הוא לא ישבש חיישנים אחרים, בפרט את מד התאוצה, שיכול מאוד להיות בשימוש.

אם מכשיר מסוים אינו יכול לתמוך במצבי פעולה אלו, אין לדווח על סוג חיישן זה על ידי HAL. כלומר, זה לא מקובל "לחקות" את החיישן הזה ב-HAL.

חיישן זה חייב להיות בעל הספק נמוך. כלומר, אם לא ניתן לבצע את זיהוי הצעדים בחומרה, אין להגדיר את החיישן הזה. בפרט, כאשר מונה הצעדים מופעל ומד התאוצה אינו פועל, רק שלבים צריכים להפעיל פסיקות (לא נתוני מד התאוצה).

גלאי הטיה

חיישן פיזי בסיסי: מד תאוצה (+ אולי אחרים כל עוד הספק נמוך)

מצב דיווח: מיוחד

צריכת חשמל נמוכה

יישם רק את גרסת ההתעוררות של חיישן זה.

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) מחזיר חיישן השכמה

גלאי הטיה יוצר אירוע בכל פעם שמתגלה אירוע הטיה.

אירוע הטיה מוגדר על ידי כיוון הכבידה הממוצעת של חלון 2 שניות המשתנה ב-35 מעלות לפחות מאז ההפעלה או האירוע האחרון שנוצר על ידי החיישן. הנה האלגוריתם:

  • reference_estimated_gravity = ממוצע מדידות מד התאוצה במהלך השניה הראשונה לאחר ההפעלה או כוח המשיכה המשוער כאשר אירוע ההטיה האחרון נוצר.
  • current_estimated_gravity = ממוצע מדידות מד התאוצה ב-2 השניות האחרונות.
  • הפעלה כאשר angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

האצות גדולות ללא שינוי בכיוון הטלפון לא אמורות להפעיל אירוע הטיה. לדוגמה, פנייה חדה או האצה חזקה בזמן נהיגה במכונית לא אמורות להפעיל אירוע הטיה, למרות שזווית התאוצה הממוצעת עשויה להשתנות ביותר מ-35 מעלות. בדרך כלל, חיישן זה מיושם בעזרת מד תאוצה בלבד. ניתן להשתמש בחיישנים אחרים גם אם הם לא מגדילים את צריכת החשמל באופן משמעותי. זהו חיישן בעל הספק נמוך שאמור לאפשר ל-SoC לעבור למצב השעיה. אין לחקות חיישן זה ב-HAL. כל אירוע חיישן מדווח על 1 ב- sensors_event_t.data[0] .

חיישני גישה מרוכבים

וקטור סיבוב

חיישנים פיזיים בבסיס: מד תאוצה, מגנומטר וג'ירוסקופ

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) מחזיר חיישן שאינו מתעורר

חיישן וקטור סיבוב מדווח על כיוון המכשיר ביחס למסגרת קואורדינטות מזרח-צפון-מעלה. זה מתקבל בדרך כלל על ידי שילוב של קריאות מד תאוצה, גירוסקופ ומגנטומטר. מערכת הקואורדינטות מזרח-צפון-מעלה מוגדרת כבסיס אורתונורמלי ישיר כאשר:

  • X מצביע מזרחה ומשיק לקרקע.
  • Y מצביע צפונה ומשיק לקרקע.
  • Z מצביע לכיוון השמים ומאונך לקרקע.

כיוון הטלפון מיוצג על ידי הסיבוב הדרוש כדי ליישר קואורדינטות מזרח-צפון למעלה עם הקואורדינטות של הטלפון. כלומר, החלת הסיבוב על המסגרת העולמית (X,Y,Z) תיישר אותם עם קואורדינטות הטלפון (x,y,z).

ניתן לראות את הסיבוב כסיבוב הטלפון בזווית תטא סביב ציר rot_axis כדי לעבור מכיוון ההפניה (מיושר מזרח-צפון-מעלה) לכיוון המכשיר הנוכחי. הסיבוב מקודד כארבעת רכיבי x, y, z, w חסרי יחידות של קווטרניון יחידה:

  • sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
  • sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
  • sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
  • sensors_event_t.data[3] = cos(theta/2)

איפה:

  • שדות x, y ו-z של rot_axis הם קואורדינטות מזרח-צפון-מעלה של וקטור יחידת אורך המייצג את ציר הסיבוב
  • theta היא זווית הסיבוב

הקווטרניון הוא קווטרניון יחידה: הוא חייב להיות בנורמה 1 . אי הקפדה על כך יגרום להתנהגות לא סדירה של הלקוח.

בנוסף, חיישן זה מדווח על דיוק כיוון משוער:

sensors_event_t.data[4] = estimated_accuracy (ברדיאנים)

שגיאת הכותרת חייבת להיות פחות מ- estimated_accuracy ב-95% מהמקרים. חיישן זה חייב להשתמש בג'ירוסקופ ככניסת שינוי הכיוון העיקרי.

חיישן זה משתמש גם בקלט של מד תאוצה ומגנומטר כדי לפצות על סחיפה של הג'ירוסקופ, ולא ניתן ליישם אותו רק באמצעות מד התאוצה והמגנטומטר.

וקטור סיבוב משחק

חיישנים פיזיים בבסיס: מד תאוצה וג'ירוסקופ (ללא מגנומטר)

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) מחזיר חיישן שאינו מתעורר

חיישן וקטור סיבוב משחק דומה לחיישן וקטור סיבוב אך אינו משתמש בשדה הגיאומגנטי. לכן ציר Y אינו מצביע צפונה אלא להתייחסות אחרת. ההתייחסות הזו מותרת להיסחף באותו סדר גודל כמו שהגירוסקופ נסחף סביב ציר Z.

ראה חיישן וקטור סיבוב לפרטים כיצד להגדיר sensors_event_t.data[0-3] . חיישן זה אינו מדווח על דיוק משוער של כיוון: sensors_event_t.data[4] שמור ויש להגדיר אותו ל 0 .

במקרה אידיאלי, טלפון שסובב והוחזר לאותו כיוון בעולם האמיתי אמור לדווח על אותו וקטור סיבוב משחק.

חיישן זה חייב להיות מבוסס על גירוסקופ ומד תאוצה. הוא לא יכול להשתמש במגנטומטר כקלט, חוץ מזה, בעקיפין, באמצעות אומדן של הטיית הג'ירוסקופ.

כוח משיכה

חיישנים פיזיים בבסיס: מד תאוצה וג'ירוסקופ (אם קיים) (או מגנומטר אם אין גירוסקופ)

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_GRAVITY) מחזיר חיישן שאינו מתעורר

חיישן כוח הכבידה מדווח על כיוון וגודל כוח הכבידה בקואורדינטות של המכשיר.

רכיבי וקטור הכבידה מדווחים ב-m/s^2 בשדות x, y ו-z של sensors_event_t.acceleration .

כאשר המכשיר במצב מנוחה, הפלט של חיישן הכבידה צריך להיות זהה לזה של מד התאוצה. על פני כדור הארץ, הגודל הוא סביב 9.8 m/s^2.

אם למכשיר יש גירוסקופ, חיישן כוח הכבידה חייב להשתמש בגירוסקופ ובמד התאוצה כקלט.

אם למכשיר אין גירוסקופ, חיישן כוח הכבידה חייב להשתמש במד התאוצה ובמגנטומטר כקלט.

וקטור סיבוב גיאומגנטי

חיישנים פיזיים בבסיס: מד תאוצה ומגנטומטר (ללא גירוסקופ)

מצב דיווח: רציף

צריכת חשמל נמוכה

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) מחזיר חיישן שאינו מתעורר

וקטור סיבוב גיאומגנטי דומה לחיישן וקטור סיבוב אך באמצעות מגנומטר וללא גירוסקופ.

חיישן זה חייב להיות מבוסס על מגנומטר. לא ניתן ליישם אותו באמצעות גירוסקופ, וכניסת גירוסקופ לא יכולה לשמש חיישן זה.

ראה חיישן וקטור סיבוב לפרטים כיצד להגדיר sensors_event_t.data[0-4] .

בדיוק כמו עבור חיישן וקטור הסיבוב, שגיאת הכיוון חייבת להיות פחותה מהדיוק המשוער ( sensors_event_t.data[4] ) 95% מהזמן.

חיישן זה חייב להיות בעל הספק נמוך, ולכן יש ליישם אותו בחומרה.

כיוון (הוצא משימוש)

חיישנים פיזיים בבסיס: מד תאוצה, מגנומטר וג'ירוסקופ (אם קיים).

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_ORIENTATION) מחזיר חיישן שאינו מתעורר

הערה: זהו סוג חיישן ישן יותר שהוצא משימוש ב-Android SDK. הוא הוחלף על ידי חיישן וקטור הסיבוב, המוגדר בצורה ברורה יותר. השתמש בחיישן וקטור הסיבוב מעל חיישן הכיוון במידת האפשר.

חיישן התמצאות מדווח על יחס המכשיר. המדידות מדווחות במעלות בשדות x, y ו-z של sensors_event_t.orientation :

  • sensors_event_t.orientation.x : אזימוט, הזווית בין כיוון הצפון המגנטי לציר Y, ​​סביב ציר Z ( 0<=azimuth<360 ). 0=צפון, 90=מזרח, 180=דרום, 270=מערב.
  • sensors_event_t.orientation.y : פסיעה, סיבוב סביב ציר X ( -180<=pitch<=180 ), עם ערכים חיוביים כאשר ציר Z נע לכיוון ציר Y.
  • sensors_event_t.orientation.z : גלגול, סיבוב סביב ציר Y ( -90<=roll<=90 ), עם ערכים חיוביים כאשר ציר X נע לכיוון ציר Z.

שימו לב, מסיבות היסטוריות זווית הגלגול חיובית בכיוון השעון. (באופן מתמטי, זה צריך להיות חיובי נגד כיוון השעון):

תיאור של כיוון ביחס למכשיר

איור 3. כיוון ביחס למכשיר

הגדרה זו שונה מפיהוק, גובה וגלילה המשמשים בתעופה כאשר ציר ה-X נמצא לאורך הצד הארוך של המטוס (זנב לאף).

חיישן הכיוון מדווח גם עד כמה הוא מצפה שהקריאות שלו יהיו מדויקות באמצעות sensors_event_t.orientation.status . עיין SensorManager SENSOR_STATUS_* של SensorManager למידע נוסף על ערכים אפשריים עבור שדה זה.

חיישנים לא מכוילים

חיישנים לא מכוילים מספקים יותר תוצאות גולמיות ועשויים לכלול הטיה מסוימת אך גם להכיל פחות "קפיצות" מתיקונים שהופעלו באמצעות כיול. אפליקציות מסוימות עשויות להעדיף את התוצאות הלא מכוילות הללו כחלקות ואמינות יותר. לדוגמה, אם אפליקציה מנסה לבצע היתוך חיישנים משלה, הכנסת כיולים יכולה למעשה לעוות את התוצאות.

מד תאוצה לא מכויל

חיישן פיזי בסיסי: מד תאוצה

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) מחזיר חיישן שאינו מתעורר

חיישן מד תאוצה לא מכויל מדווח על תאוצת המכשיר לאורך שלושת צירי החיישן ללא כל תיקון הטיה (הטיית מפעל ופיצוי טמפרטורה מופעלים על מדידות לא מכוילות), יחד עם אומדן הטיה. כל הערכים הם ביחידות SI (m/s^2) ומדווחים בתחומים של sensors_event_t.uncalibrated_accelerometer :

  • x_uncalib : תאוצה (ללא פיצוי הטיה) לאורך ציר X
  • y_uncalib : תאוצה (ללא פיצוי הטיה) לאורך ציר Y
  • z_uncalib : תאוצה (ללא פיצוי הטיה) לאורך ציר Z
  • x_bias : הטיה משוערת לאורך ציר X
  • y_bias : הטיה משוערת לאורך ציר Y
  • z_bias : הטיה משוערת לאורך ציר Z

גירוסקופ לא מכויל

חיישן פיזי בסיסי: גירוסקופ

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) מחזיר חיישן שאינו מתעורר

גירוסקופ לא מכויל מדווח על קצב הסיבוב סביב צירי החיישן מבלי להחיל עליהם פיצוי הטיה, יחד עם אומדן הטיה. כל הערכים הם ברדיאנים/שנייה ומדווחים בשדות של sensors_event_t.uncalibrated_gyro :

  • x_uncalib : מהירות זוויתית (ללא פיצוי סחיפה) סביב ציר X
  • y_uncalib : מהירות זוויתית (ללא פיצוי סחיפה) סביב ציר Y
  • z_uncalib : מהירות זוויתית (ללא פיצוי סחיפה) סביב ציר Z
  • x_bias : סחיפה משוערת סביב ציר X
  • y_bias : סחיפה משוערת סביב ציר Y
  • z_bias : סחיפה משוערת סביב ציר Z

מבחינה רעיונית, המדידה הלא מכוילת היא הסכום של המדידה המכוילת ואומדן ההטיה: _uncalibrated = _calibrated + _bias .

x_bias , y_bias ו- z_bias צפויים לקפוץ ברגע שההערכה של ההטיה משתנה, והם אמורים להיות יציבים בשאר הזמן.

ראה את ההגדרה של חיישן הג'ירוסקופ לפרטים על מערכת הקואורדינטות שבה נעשה שימוש.

יש ליישם כיול מפעל ופיצוי טמפרטורה על המדידות. כמו כן, יש ליישם אומדן סחיפה של גירוסקופ כך שניתן יהיה לדווח על אומדנים סבירים ב- x_bias , y_bias ו- z_bias . אם היישום אינו מסוגל להעריך את הסחף, אז אסור ליישם חיישן זה.

אם חיישן זה קיים, חיישן הג'ירוסקופ המתאים חייב להיות קיים ושני החיישנים חייבים לחלוק את אותם ערכי sensor_t.name ו- sensor_t.vendor .

שדה מגנטי לא מכויל

חיישן פיזי בסיסי: מגנומטר

מצב דיווח: רציף

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) מחזיר חיישן שאינו מתעורר

חיישן שדה מגנטי לא מכויל מדווח על השדה המגנטי הסביבה יחד עם אומדן כיול ברזל קשיח. כל הערכים נמצאים במיקרו-טסלה (uT) ומדווחים בתחומים של sensors_event_t.uncalibrated_magnetic :

  • x_uncalib : שדה מגנטי (ללא פיצוי ברזל קשיח) לאורך ציר X
  • y_uncalib : שדה מגנטי (ללא פיצוי ברזל קשיח) לאורך ציר Y
  • z_uncalib : שדה מגנטי (ללא פיצוי ברזל קשיח) לאורך ציר Z
  • x_bias : הטיה משוערת של ברזל קשיח לאורך ציר X
  • y_bias : הטיה משוערת של ברזל קשה לאורך ציר Y
  • z_bias : הטיה משוערת של ברזל קשה לאורך ציר Z

מבחינה רעיונית, המדידה הלא מכוילת היא הסכום של המדידה המכוילת ואומדן ההטיה: _uncalibrated = _calibrated + _bias .

המגנומטר הלא מכויל מאפשר לאלגוריתמים ברמה גבוהה יותר להתמודד עם הערכת ברזל קשה. x_bias , y_bias ו- z_bias צפויים לקפוץ ברגע שההערכה של הברזל הקשיח משתנה, והם צריכים להיות יציבים בשאר הזמן.

יש ליישם כיול ברזל רך ופיצוי טמפרטורה על המדידות. כמו כן, יש ליישם אומדן ברזל קשה כך שניתן יהיה לדווח על אומדנים סבירים ב- x_bias , y_bias ו- z_bias . אם היישום אינו מסוגל להעריך את ההטיה, אז אסור ליישם את החיישן הזה.

אם חיישן זה קיים, חיישן השדה המגנטי המתאים חייב להיות קיים ושני החיישנים חייבים לחלוק את אותם ערכי sensor_t.name ו- sensor_t.vendor .

זווית ציר

מצב דיווח: בשינוי

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) מחזיר חיישן השכמה

חיישן זווית ציר מודד את הזווית, במעלות, בין שני חלקים אינטגרליים של המכשיר. תנועה של ציר הנמדדת על ידי סוג חיישן זה צפויה לשנות את הדרכים שבהן המשתמש יכול לקיים אינטראקציה עם המכשיר, למשל על ידי פתיחה או חשיפת תצוגה.

חיישנים מרוכבים באינטראקציה

חיישנים מסוימים משמשים בעיקר לזיהוי אינטראקציות עם המשתמש. We don't define how those sensors must be implemented, but they must be low power and it's the responsibility of the device manufacturer to verify their quality in terms of user experience.

Wake up gesture

Underlying physical sensors: Undefined (anything low power)

Reporting-mode: One-shot

Low-power

Implement only the wake-up version of this sensor.

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) returns a wake-up sensor

A wake up gesture sensor enables waking up the device based on a device specific motion. When this sensor triggers, the device behaves as if the power button was pressed, turning the screen on. This behavior (turning on the screen when this sensor triggers) might be deactivated by the user in the device settings. Changes in settings don't impact the behavior of the sensor: only whether the framework turns the screen on when it triggers. The actual gesture to be detected isn't specified, and can be chosen by the manufacturer of the device.

This sensor must be low power, as it's likely to be activated 24/7.

Each sensor event reports 1 in sensors_event_t.data[0] .

Pick up gesture

Underlying physical sensors: Undefined (anything low power)

Reporting-mode: One-shot

Low-power

Implement only the wake-up version of this sensor.

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) returns a wake-up sensor

A pick-up gesture sensor triggers when the device is picked up regardless of wherever it was before (desk, pocket, bag).

Each sensor event reports 1 in sensors_event_t.data[0] .

Glance gesture

Underlying physical sensors: Undefined (anything low power)

Reporting-mode: One-shot

Low-power

Implement only the wake-up version of this sensor.

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) returns a wake-up sensor

A glance gesture sensor enables briefly turning the screen on to enable the user to glance content on screen based on a specific motion. When this sensor triggers, the device will turn the screen on momentarily to allow the user to glance notifications or other content while the device remains locked in a non-interactive state (dozing), then the screen will turn off again. This behavior (briefly turning on the screen when this sensor triggers) might be deactivated by the user in the device settings. Changes in settings do not impact the behavior of the sensor: only whether the framework briefly turns the screen on when it triggers. The actual gesture to be detected isn't specified, and can be chosen by the manufacturer of the device.

This sensor must be low power, as it's likely to be activated 24/7. Each sensor event reports 1 in sensors_event_t.data[0] .