שילוב של מצלמת הדשבורד

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

דרישות סף

לפני שממשיכים, צריך לוודא שהתנאים המוקדמים הבאים מתקיימים:

SDK:

  • נדרשת גרסת SDK 31 ואילך.

חומרה:

  • מצלמות EVS או Camera2 שזמינות ל-AAOS.
  • צריך שיהיה מספיק מקום באחסון הפנימי או תמיכה באחסון חיצוני נשלף
    כדי להקליט סרטונים.

דרישות התוכנה:

קבלת קוד המקור

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

מעיינים בקוד המקור באמצעות Android Code Search.

קוד המקור מופיע בשלושת המודולים האלה:

  • שירות מצלמת דשבורד. לוגיקה של סטרימינג, הקלטה והפעלה.
  • Dashcam Manager מתחבר לשירות מצלמת הרכב וחושף API יציב ללקוחות
  • אפליקציית מצלמת דשבורד. הפניה לאפליקציית מצלמת דשבורד באמצעות Dashcam Manager API

תרשים הארכיטקטורה

הרכבת מצלמת הדשבורד

משתמשים ב-Soong או ב-Gradle כדי לבצע build של מצלמת הדשבורד.

סונג

ב-Soong:

mma DashcamService DashcamManager-lib DashcamApp

קובצי ה-APK נמצאים בתיקייה out/target/product/[lunch-target]/system/priv-app/

Gradle

ב-Gradle:

./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble

קובצי ה-APK נמצאים בתיקייה out/aaos-apps-gradle-build/

הוראות מפורטות ליצירת Dashcam באמצעות Gradle מופיעות בקובץ README.

הרשאות

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

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

ב-Blueprint:

Android.bp
android_app_import {
    name: "DashcamApp-prebuilt",
    apk: "DashcamApp.apk",
    privileged: true,
    certificate: "platform",
    required: ["allowed_privapp_com.android.car.dashcam"],
}

prebuilt_etc {
    name: "allowed_privapp_com.android.car.dashcam",
    sub_dir: "default-permissions",
    src: "allowed_privapp_com.android.car.dashcam.xml",
    filename_from_src: true,
}

ב-Make:

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/Dashcam/allowed_privapp_com.android.car.dashcam:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/com.android.car.dashcam.xml \

יוצרים קובץ הרשאות בשם allowed_privapp_com.android.car.dashcam.xml:

<permissions>
  <privapp-permissions package="com.android.car.dashcam.service">
      <permission name="" />
  </privapp-permissions>
  <privapp-permissions package="com.android.car.dashcam.app">
      <permission name="" />
  </privapp-permissions>
</permissions>

מוסיפים הרשאות מקובץ המניפסט לקובץ ההרשאות.

לפני שמשתמשים במצלמת הדשבורד, צריך להעניק מראש הרשאות Camera2 לשירות מצלמת הדשבורד, כמו שמוסבר במאמר בנושא מצלמה ב-AAOS.

מוסיפים את קובץ ההרשאות שניתנו מראש ל-Blueprint או לקובץ Make באותו אופן שבו מוסיפים את קובץ ההרשאות.

בpre-grant-permissions-com.android.car.dashcam.xml:

<exceptions>
    <exception package="com.android.car.dashcam.service">
        <permission name="android.permission.CAMERA" fixed="false" />
        <permission name="android.permission.SYSTEM_CAMERA" fixed="false" />
        <permission name="android.permission.CAMERA_HEADLESS_SYSTEM_USER" fixed="false" />
    </exception>
</exceptions>

בAndroid.bp:

...
required["pre-grant-permissions-com.android.car.dashcaml"]
...

prebuilt_etc {
    name: "pre-grant-permissions-com.android.car.dashcaml",
    sub_dir: "default-permissions",
    src: "pre-grant-permissions-com.android.car.dashcam.xml",
    filename_from_src: true,
}

מידע נוסף זמין במאמרים שילוב של קובץ מובנה מראש בתמונת מערכת והוספת רשימת היתרים.

התקנה בשיטה חלופית

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

באמצעות קובץ ההרשאות שנוצר בקטע של התכונות המוכנות מראש, מריצים את הפקודה:

adb root
adb remount
adb push allowed_privapp_com.android.car.dashcam.xml /etc/permissions/allowed_privapp_com.android.car.dashcam.xml
adb shell chmod 644 /etc/permissions/allowed_privapp_com.android.car.dashcam.xml

מוסיפים את קובץ ההרשאות שניתנו מראש באופן דומה ל-etc/default-permissions/.

הגדרת שכבות-על

לשירות מצלמת הדשבורד יש הגדרות שאפשר להוסיף על גבי ההגדרות הקיימות.

הגדרת שירות

dashcam-service/res/values/config.xml

הקובץ הזה מכיל הגדרות של השירות:

  • config_file שם קובץ הגדרת הטריגר ב-/assets
  • allow_internal_storage מתן הרשאה לשמירת הקלטות באחסון הפנימי
  • boot_startup_enabled הפעלת שירות מצלמת הדשבורד בזמן האתחול של המכשיר
  • notifications_on הצגת התראות כשההקלטה מתחילה
  • default_app_component אפליקציית מצלמת הרכב שמוגדרת כברירת מחדל, שיש לה גישה להקלטות ולטריגרים מכל העולם
  • recording_module ComponentName of IRecordingModule implementation
  • streaming_module ComponentName of IStreamingModule implementation
  • trigger_module ComponentName of ITriggerModule implementation

הגדרת הטריגר

כדי להגדיר את הטריגרים להקלטה, יוצרים עותק של:

dashcam-service/src/assets/config.xml

ואז מוסיפים אותו לספריית הנכסים. מציינים את הקובץ הזה ברכיב config_file בקובץ הגדרת השירות.

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

אחסון

הגדרות האחסון כוללות את הרכיבים הבאים:

  • maxStorageUsagePercent אחוז מקסימלי מנפח האחסון הזמין שבו המצלמה לרכב משתמשת לפני חיתוך ההקלטות.

  • maxStorageUsageMegabytes כמות האחסון המקסימלית במגה-בייט שבה מצלמת הרכב משתמשת לפני חיתוך ההקלטות.

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

מצלמה

הגדרות המצלמה כוללות את הרכיבים הבאים:

  • מזהה המצלמה. מזהה המצלמה עם הקידומת של המצלמה.

  • prerollLengthMs משך הפרסומת שלפני הסרטון שמאוחסן עם כל אירוע.

  • width רוחב אופציונלי של המאגר שמוחזר על ידי המצלמה.

  • height גובה אופציונלי של המאגר שמוחזר על ידי המצלמה.

<CameraConfig>
  <Camera
      ID="EVS:1"
      prerollLengthMs="10000"
      width="1920"
      height="1080" />
  <Camera
      ID="Camera2:1"
      prerollLengthMs="10000" />
</CameraConfig>

בדוגמה הזו מוצג מזהה המצלמה EVS:1 עם מודעת טרום-צפייה באורך 10 שניות ברזולוציה 1080p, ומזהה המצלמה Camera2:1 עם מודעת טרום-צפייה באורך 10 שניות ורוחב וגובה שמוגדרים כברירת מחדל.

טריגר

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

  • name השם הייחודי של הטריגר.

  • cameras מזהים של המצלמות.

  • sensorPropertyID מזהה החיישן עם קידומת של קבוצת החיישנים. האפשרויות לקידומת הן VHAL או SENSOR_MANAGER.

  • description תיאור הטריגר שמוצג בממשק המשתמש.

  • recordingLengthMs משך הזמן אחרי האירוע שיוקלט, באלפיות השנייה.

  • sensorValueType סוג הנתונים שהחיישן מייצר. האפשרויות הן INT,‏ INT_ARRAY,‏ FLOAT,‏ FLOAT_ARRAY ו-BOOLEAN, STRING.

  • thresholdType איך מעריכים את ערך החיישן בהשוואה לthresholdValue. האפשרויות הן AVERAGE,‏ BOOLEAN,‏ EQUALS,‏ LEAP,‏ LEAP_AVERAGE,‏ LEAP_OVER,‏ PEAK ו-PEAK_HOLD.

  • thresholdValue הערך שמשווים לערך של החיישן.

  • thresholdExtra צריך ערך נוסף לסוגים מסוימים של ספים, כמו טווח ל-AVERAGE.

  • triggerCooldown תקופת צינון באלפיות השנייה לפני הפעלת אירוע נוסף מהסוג הזה.

<EventTriggers>
  <EventTrigger
      name="AEB"
      cameras="EVS:1, EVS:2"
      sensorPropertyID="VHAL:289411073"
      description="Automatic Emergency Braking"
      recordingLengthMs="20000"
      sensorValueType="INT"
      thresholdType="EQUALS"
      thresholdValue="2"
      triggerCooldown="5000"/>
</EventTriggers>

בדוגמה הזו מוצג טריגר שבו TriggerModule עוקב אחרי חיישן VHAL שמפיק ערכים מספריים שלמים. האופרטור TriggerModule משווה את השוויון לערך הסף. כשתנאי השוויון מתקיים, טריגר מתעד במצלמות EVS 1 ו-2.

<EventTrigger
            name="SPEED"
            cameras="Camera2:0, Camera2:1,  Camera2:2,  Camera2:3"
            sensorPropertyID="VHAL:291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="10"
            triggerCooldown="2000"/>

בדוגמה הזו מוצג טריגר שבו TriggerModule עוקב אחרי חיישן VHAL שמפיק ערכים מסוג float. ‫TriggerModule משווה את הממוצע של החיישן בטווח של 10 דגימות לערך הסף של 20.0. טווח המדגם מוגדר ב-thresholdExtra. אפשר להפעיל אירוע חדש רק כל 2000 אלפיות שנייה, כפי שמוגדר ב-triggerCooldown.

מודולים

שירות מצלמת הדשבורד מורכב משלושה מודולים:

  • הקטע Stream מכיל את הלוגיקה לטיפול בסטרימינג ממצלמות.

  • הקלטה מכיל את הלוגיקה לטיפול בהקלטות.

  • הטריגר מכיל את הלוגיקה להפעלת הקלטה מנתוני החיישנים. ממשקי ה-API של המודולים מוגדרים בממשקים המתאימים שלהם, IStreamModule, IRecorderModule ו-ITriggerModule, ונחשפים ל-DashcamManager דרך DashcamServiceAPI.

מודולים של שכבת-על

שירות מצלמת הדשבורד משתמש ב-dashcam-service/res/values/config.xml כדי לקבוע איפה נמצאות ההטמעות של המודולים. הטמעות ברירת מחדל מסופקות לכל מודול. עם זאת, אפשר להגדיר את הרכיב של כל מודול בערך ההגדרה המתאים כדי להציג אותו כשכבת-על.

הגדרת שם רכיב ההטמעה של OEM:

  • IRecorderModule עד recording_module
  • IStreamModule עד streaming_module
  • ITriggerModule עד trigger_module

בזמן הריצה, שירות מצלמת הרכב יוצר מופע של שם הרכיב שהוגדר ב-config.xml לכל מודול.

מדריך למפתחי אפליקציות

מצלמת הדשבורד היא פתרון מוכן לייצור וניתן להתאמה אישית. מצלמת הדשבורד משתמשת בממשקי Dashcam Manager API כדי לתקשר עם Dashcam service. ממשק ה-API של Dashcam Manager נמצא בכתובת IDashcamManager. כל אפליקציה עם ההרשאות הנדרשות יכולה להשתמש באפליקציית ניהול מצלמת הדשבורד.

OverlayUI

אפשר להתאים אישית את האפליקציה באמצעות שכבות-על של משאבים בזמן ריצה. מידע נוסף זמין במאמר בנושא שכבות-על של משאבים בזמן ריצה. כדי לראות את רשימת הרכיבים שאפשר להוסיף להם שכבת-על, אפשר לעיין ב-overlayable.xml.

הרחבת טריגרים

אפשר להאריך את משך ההפעלה של טריגרים בסשן הנוכחי באמצעות קריאה ל-DashcamManager#addTrigger(). הטריגרים שמוסיפים נשמרים רק לסשן הנוכחי.

הפעלה אוטומטית

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

שיטות מומלצות

  • אחסון מומלץ מאוד להשתמש באמצעי אחסון חיצוניים ניידים.

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

  • אופטימיזציה של הביצועים. אופטימיזציה של ביצועי האפליקציה כדי למזער את השימוש במשאבים ולהבטיח פעולה חלקה ב-AAOS.

פתרון בעיות

  • בעיות בחיבור המצלמה. מערכת התצוגה החיצונית (EVS) או Camera2 צריכות להיות נתמכות וזמינות במערכת AAOS IVI.

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