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

איור 1. מערכת קואורדינטות (ביחס למכשיר נייד) המשמשת את Sensor API
צירי רכב
בהטמעות של Android Automotive, צירים מוגדרים ביחס למסגרת גוף הרכב. המקור של מסגרת הייחוס של הרכב הוא מרכז הסרן האחורי. מסגרת הייחוס של הרכב מכוונת כך ש:
- ציר X מצביע ימינה ונמצא במישור אופקי, בניצב למישור הסימטריה של הרכב.
- ציר Y מצביע קדימה ונמצא במישור אופקי.

איור 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]
.
Limited axes IMU sensors
Available from Android 13, limited axes IMU sensors are sensors that support use cases where not all three axes (x, y, z) are available. Standard IMU types in Android (such as SENSOR_TYPE_ACCELEROMETER
and SENSOR_TYPE_GYROSCOPE
) assume that all three axes are supported. However, not all form factors and devices support 3-axis accelerometers and 3-axis gyroscopes.
Accelerometer limited axes
Underlying physical sensors: Accelerometer
Reporting-mode: Continuous
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES)
returns a non-wake-up sensor
An accelerometer limited axes sensor is equivalent to TYPE_ACCELEROMETER
but supports cases where one or two axes aren't supported.
The last three sensor event values reported by the sensor represent whether the acceleration value for the x, y, and z axes are supported. A value of 1.0
indicates that the axis is supported, and a value of 0
indicates it isn't supported. Device manufacturers identify the supported axes at build time and the values don't change during runtime.
Device manufacturers must set the acceleration values for unused axes to 0
, instead of having undefined values.
Gyroscope limited axes
Underlying physical sensors: Gyroscope
Reporting-mode: Continuous
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES)
returns a non-wake-up sensor
A gyroscope limited axes sensor is equivalent to TYPE_GYROSCOPE
but supports cases where one or two axes aren't supported.
The last three sensor event values reported by the sensor represent whether the angular speed value for the x, y, and z axes are supported. A value of 1.0
indicates that the axis is supported, and a value of 0
indicates it isn't supported. Device manufacturers identify the supported axes at build time and the values don't change during runtime.
Device manufacturers must set the angular speed values for unused axes to 0
.
Accelerometer limited axes uncalibrated
Underlying physical sensors: Accelerometer
Reporting-mode: Continuous
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED)
returns a non-wake-up sensor
An accelerometer limited axes uncalibrated sensor is equivalent to TYPE_ACCELEROMETER_UNCALIBRATED
but supports cases where one or two axes aren't supported.
The last three sensor event values reported by the sensor represent whether the acceleration and bias values for the x, y, and z axes are supported. A value of 1.0
indicates that the axis is supported, and a value of 0
indicates it isn't supported. Device manufacturers identify the supported axes at build time and the values don't change during runtime.
Device manufacturers must set the acceleration and bias values for unused axes to 0
.
Gyroscope limited axes uncalibrated
Underlying physical sensors: Gyroscope
Reporting-mode: Continuous
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED)
returns a non-wake-up sensor
A gyroscope limited axes uncalibrated sensor is equivalent to TYPE_GYROSCOPE_UNCALIBRATED
but supports cases where one or two axes aren't supported.
The last three sensor event values reported by the sensor represent whether the angular speed and drift values for the x, y, and z axes are supported. A value of 1.0
indicates that the axis is supported, and a value of 0
indicates it isn't supported. Device manufacturers identify the supported axes at build time and the values don't change during runtime.
Device manufacturers must set the angular speed and drift values for unused axes to 0
.
Composite limited axes IMU
Underlying physical sensors: Any combination of 3-axis accelerometer, 3-axis gyroscope, 3-axis accelerometer uncalibrated, and 3-axis gyroscope uncalibrated sensors.
Reporting-mode: Continuous
A composite limited axes IMU sensor is equivalent to a limited axes IMU sensor but instead of being supported at the HAL, it converts the 3-axis sensor data into the equivalent limited axes variants. These composite sensors are only enabled for automotive devices.
The following table shows an example conversion from a standard 3-axis accelerometer to a composite limited axes accelerometer.
SensorEvent Values for SENSOR_TYPE_ACCELEROMETER | Example SENSOR_TYPE_ACCELEROMETER SensorEvent | Composite SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES SensorEvent |
---|---|---|
values[0] | -0.065 | -0.065 |
values[1] | 0.078 | 0.078 |
values[2] | 9.808 | 9.808 |
values[3] | N/A | 1.0 |
values[4] | N/A | 1.0 |
values[5] | N/A | 1.0 |
Automotive sensors
Sensors to support automotive use cases.
Heading
Underlying physical sensors: Any combination of GPS, magnetometer, accelerometer, and gyroscope.
Reporting-mode: Continuous
getDefaultSensor(SENSOR_TYPE_HEADING)
returns a non-wake-up sensor
Available from Android 13, a heading sensor measures the direction in which the device is pointing relative to true north in degrees. The heading sensor includes two SensorEvent
values. One for the measured device heading and one for the accuracy of the provided heading value.
Heading values reported by this sensor must be between 0.0
(inclusive) and 360.0
(exclusive), with 0
indicating north, 90
east, 180
south, and 270
west.
Accuracy for this sensor is defined at 68 percent confidence. In the case where the underlying distribution is Gaussian normal, the accuracy is one standard deviation. For example, if the heading sensor returns a heading value of 60 degrees and an accuracy value of 10 degrees, there's a 68 percent probability of the true heading being between 50 degrees and 70 degrees.