نظرة عامة على مجموعة اختبارات توافق الكاميرا (ITS)

حزمة اختبار صور الكاميرا (ITS) هي إطار عمل لتنفيذ اختبارات على الصور التي تنتجها كاميرا Android. الهدف العام من كل اختبار في مجموعة اختبارات توافق الصور هو ضبط الكاميرا بطريقة معيّنة، والتقاط صورة واحدة أو أكثر، وفحص الصور لمعرفة ما إذا كانت تحتوي على بيانات الصور المتوقّعة. تتطلّب العديد من الاختبارات توجيه الكاميرا نحو مخطط استهداف محدّد أو إضاءته بشدّة معيّنة.

يمكن العثور على ITS في حزمة اختبار CTS Verifier في cts/apps/CameraITS. يجب أن تجتاز الأجهزة اختبارات ITS المتوافقة مع الميزات المتاحة التي يعلن عنها إطار عمل الكاميرا للتطبيقات التابعة لجهات خارجية كمجموعة فرعية من CTS.

ضبط إعدادات الميزة

يجب إعداد ما يلي لتنفيذ اختبارات ITS:

  • جهاز قيد الاختبار
  • جهاز مضيف (على سبيل المثال، كمبيوتر مكتبي أو كمبيوتر محمول يعمل بنظام التشغيل Linux)
  • مشهد تصوّره الكاميرا

إعداد الجهاز الخاضع للاختبار

لإعداد وحدة اختبار الجهاز (DUT)، اتّبِع الخطوات التالية:

  1. وصِّل الجهاز قيد الاختبار بجهاز مضيف عبر USB.
  2. امنح المضيف أذونات للوصول إلى الجهاز الخاضع للاختبار عبر ADB.
  3. ثبِّت تطبيق CTS Verifier (CtsVerifier.apk) على الجهاز. لمزيد من المعلومات، اطّلِع على استخدام CTS Verifier.

    extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
    cd android-cts-verifier
    adb install -r -g CtsVerifier.apk
  4. على الجهاز قيد الاختبار، شغِّل تطبيق الكاميرا التلقائي وأغلِق جميع النوافذ التي تظهر عند التشغيل لتجنُّب حدوث تداخل أثناء الاختبار.

إعداد المضيف

تتطلّب أداة ITS أن يكون الجهاز المضيف متصلاً بالجهاز الخاضع للاختبار من خلال منفذ USB، وأن يكون قادرًا على استخدام أداة تصحيح أخطاء Android (ADB) للتحكّم في الجهاز والتواصل معه، وأن يكون مثبَّتًا عليه البرنامج المطلوب.

لإعداد الجهاز المضيف، تأكَّد من تثبيت البرامج التالية.

أدوات منصة حزمة تطوير البرامج (SDK) لنظام التشغيل Android

يجب تثبيت أدوات منصة Android SDK ويجب أن يكون ADB في مسار التنفيذ الخاص بالصدفة أو الوحدة الطرفية التي تعمل على الجهاز المضيف. للاطّلاع على الإصدار العلني من "أدوات منصة حزمة تطوير البرامج (SDK) لنظام التشغيل Android"، راجِع ملاحظات إصدار "أدوات منصة حزمة تطوير البرامج (SDK)".

Python

يجب تثبيت Python على الجهاز المضيف. ننصحك باستخدام حزمة توزيع Python لضمان توفّر إصدارات متوافقة. للحصول على تفاصيل حول إصدارات Python والحِزم التي يجب تثبيتها لإصدار معيّن، راجِع ملاحظات إصدار Camera ITS للإصدار المعنيّ.

Mobly

في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث، يجب تثبيت إطار اختبار Mobly. يتيح لك تطبيق Mobly إعداد جهاز DUT وجهاز لوحي لعرض الرسوم البيانية في الصف its_base_test. لتثبيت إطار عمل اختبار Mobly، شغِّل الأمر التالي:

pip install mobly

إعداد بيئة الاختبار

لإعداد بيئة الاختبار، نفِّذ ما يلي:

cd CameraITS
source build/envsetup.sh

يتحقّق هذا الأمر من تثبيت Python، ويضبط متغيّر البيئة PYTHONPATH، ويُشغّل اختبارات الوحدات على وحدات utils/*.py. إذا لم يتم عرض أي أخطاء في الوحدة الطرفية، تكون البيئة جاهزة لتشغيل اختبارات ITS.

إعداد المشهد

لإعداد المشاهد، ننصح باستخدام إعداد Camera ITS-in-a-box لتسهيل عملية التشغيل الآلي والموثوقية والكفاءة في الاختبار. تتوافق منصات اختبار ITS-in-a-box مع جميع متطلبات الإضاءة والتوسيط وتغيير الرسوم البيانية الخاصة بنظام ITS. بالإضافة إلى ذلك، يجب توفّر ITS-in-a-box لإجراء اختبارات إضافات الكاميرا.

بالنسبة إلى الاختبار اليدوي، احرِص على ما يلي:

  • الجهاز قيد الاختبار موضوع على حامل ثلاثي القوائم
  • يتم توجيه الجهاز قيد الاختبار إلى المشهد الصحيح لكل اختبار. (تقدّم نصوص اختبار ITS مطالبات لتغيير إعداد المشهد قبل بدء الاختبارات في مشهد جديد).
  • يجب أن يكون الجهاز قيد الاختبار متصلاً بالجهاز المضيف عبر USB.
  • لا يتحرّك الجهاز قيد الاختبار أثناء تشغيل الاختبار.
  • يجب أن يكون المشهد مضاءً بمصدر ضوء ثابت وغير متذبذب. (لا تستخدِم مصباحًا فلورسنتًا لأنّ ذلك يؤدي إلى حدوث وميض.)

يعرض نص اختبار ITS طلبًا من المستخدم بتغيير إعداد المشهد قبل بدء الاختبارات في مشهد جديد.

يجب ضبط اتجاه الهاتف بحيث تلتقط الكاميرا الصور بدون تدوير. أسهل طريقة للتحقّق من ذلك هي استخدام مشاهد الوجه في scene2. في معظم الهواتف، يكون الهاتف في الوضع الأفقي مع تدويره عكس اتجاه عقارب الساعة للكاميرا الخلفية، وتدويره في اتجاه عقارب الساعة للكاميرا الأمامية.

ملفات الإعداد

باستخدام إطار عمل Mobly، عليك إنشاء ملف إعداد config.yml لتحديد منصة اختبار Mobly. في ما يلي أمثلة على حالات استخدام مختلفة.

ملف config.yml للمشاهد المستندة إلى الأجهزة اللوحية

في ما يلي مثال على ملف config.yml للمشاهد المستندة إلى الأجهزة اللوحية. بالنسبة إلى الاختبارات المستندة إلى الأجهزة اللوحية، يجب أن تتضمّن كلمة TABLET الرئيسية اسم منصة الاختبار. أثناء عملية التهيئة، يقوم برنامج تشغيل اختبارات Mobly بتهيئة المَعلمات في الملف وتمريرها إلى الاختبارات الفردية.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"  # "True" or "False"; quotes needed
      lighting_cntl: <controller-type>  # "arduino" or "None"; quotes needed
      lighting_ch: <controller-channel>
      camera: 0
      foldable_device: "False". # set "True" if testing foldable
      scene: <scene-name>  # if <scene-name> runs all scenes

لتشغيل بيئة الاختبار، نفِّذ tools/run_all_tests.py. إذا لم تكن هناك قيم في سطر الأوامر تحدّد الكاميرات أو المشاهد، سيتم تنفيذ الاختبار باستخدام قيم الملف config.yml. إذا كانت هناك قيم في سطر الأوامر للكاميرات أو المشاهد، ستلغي هذه القيم القيم الواردة في قسم TestParams من ملف config.yml. مثلاً:

python tools/run_all_tests.py
python tools/run_all_tests.py camera=1
python tools/run_all_tests.py scenes=2,1,0
python tools/run_all_tests.py camera=0 scenes=scene_tele
python tools/run_all_tests.py camera=0.4 scenes=4,scene6_tele

ملف sensor_fusion scene config.yml

في ما يلي مثال على ملف config_yml لاختبارات sensor_fusion. بالنسبة إلى اختبار sensor_fusion، يجب أن تكون الكلمة الرئيسية SENSOR_FUSION في اسم منصة الاختبار. لا يتيح نظام التشغيل Android 13 والإصدارات الأحدث سوى استخدام وحدة التحكّم Arduino لدمج بيانات الاستشعار بسبب اختبارات المعاينة وتثبيت الفيديو. يتوافق نظام التشغيل Android 12 مع وحدات التحكّم Arduino وCanakit.

Testbeds
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino
      rotator_ch: 1
      camera: 0

لتشغيل اختبارات sensor_fusion باستخدام صندوق دمج البيانات من المستشعرات، نفِّذ ما يلي:

python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0
python tools/run_all_tests.py scenes=scene_flash,feature_combination
python tools/run_all_tests.py scenes=checkerboard camera=1

ملف config.yml الخاص بمنصات الاختبار المتعددة

في ما يلي مثال على ملف config.yml يتضمّن عدة بيئات اختبار، بما في ذلك بيئة اختبار للأجهزة اللوحية وبيئة اختبار sensor_fusion. يتم تحديد بيئة الاختبار الصحيحة حسب المشاهد التي تم اختبارها.

Testbeds
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>           # if <scene-name> runs all scenes

  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

ملف config.yml للاختبار اليدوي

في ما يلي مثال على ملف config.yml للاختبار اليدوي. بدءًا من Android 14، تتوفّر إمكانية إجراء الاختبارات يدويًا لجميع الاختبارات باستثناء اختبارات scene_extensions. بالنسبة إلى الاختبار اليدوي، يجب أن تكون الكلمة الرئيسية MANUAL في اسم منصة الاختبار. بالإضافة إلى ذلك، لا يمكن أن يتضمّن القسم AndroidDevice قسمًا خاصًا بالرقم التسلسلي أو الملصق لجهاز لوحي.

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      camera: 0
      scene: 1

ملف Gen2 rig testing config.yml

في ما يلي مثال على ملف config.yml لمنصة اختبار TEST_BED_GEN2. يتم استخدام منصة الاختبار هذه لإجراء اختبارات scene_ip التي تستخدم منصة اختبار من الجيل الثاني](/docs/compatibility/cts/camera-its-box-gen2). يعرض المثال التالي مَعلمات منصة الاختبار عندما يكون جهاز Gen2 متاحًا ولم يتم تخطّي اختبارات scene_ip.

Testbeds
  - Name: TEST_BED_GEN2
    # Test configuration for scene_ip/test_default_jca_ip.py
    Controllers:
        AndroidDevice:
          - serial: <device-id>  # quotes needed if serial id entirely numeric
            label: dut
    TestParams:
      debug_mode: "False"  # quotes are needed here
      chart_distance: 30
      rotator_cntl: gen2_rotator   # gen2 rig specific. "None" if gen2 rig not available
      rotator_ch: 0
      camera: <camera-id>
      foldable_device: "False"  # "True" if testing foldable device
      tablet_device: "False"  # "True" if testing tablet device
      lighting_cntl: gen2_lights  # gen2 rig specific. "None" if gen2 rig not available
      lighting_ch: 1
      scene: scene_ip

يعرض المثال التالي مَعلمات Testbed عندما لا يتوفّر جهاز Gen2 ويتم تخطّي اختبارات scene_ip.

Testbeds
  - Name: TEST_BED_GEN2
    # Test configuration for scene_ip/test_default_jca_ip.py
    Controllers:
        AndroidDevice:
          - serial: <device-id>  # quotes needed if serial id entirely numeric
            label: dut
    TestParams:
      debug_mode: "False"  # quotes are needed here
      chart_distance: 30
      rotator_cntl: "None"   # gen2 rig specific. "None" if gen2 rig not available
      rotator_ch: <controller-channel>
      camera: <camera-id>
      foldable_device: "False"  # "True" if testing foldable device
      tablet_device: "False"  # "True" if testing tablet device
      lighting_cntl: "None"  # gen2 rig specific. "None" if gen2 rig not available
      lighting_ch: <controller-channel>
      scene: scene_ip

لتنفيذ اختبار scene_ip، استخدِم أحد الأوامر التالية:

python tests/scene_ip/test_default_jca_ip.py -c config.yml
python tools/run_all_tests.py camera=<camera-id> scenes=scene_ip

تشغيل اختبارات ITS

يوضّح هذا القسم كيفية إجراء اختبارات ITS.

استدعاء الاختبارات

بعد إعداد الجهاز والجهاز المضيف (بما في ذلك البيئة) والمشهد الفعلي، شغِّل اختبارات ITS باتّباع الخطوات التالية.

  1. افتح تطبيق CTS Verifier. في قائمة الاختبارات، اختَر اختبار ITS للكاميرا.

  2. من الجهاز المضيف، شغِّل اختبارات ITS من الدليل CameraITS/. على سبيل المثال، بالنسبة إلى جهاز مزوّد بكاميرا أمامية وخلفية، نفِّذ الأمر التالي:

    python tools/run_all_tests.py

    يتكرّر النص البرمجي خلال الكاميرات ومشاهد الاختبار استنادًا إلى ملف config.yml. لتصحيح أخطاء عمليات الإعداد، ننصحك بتنفيذ أحد مشاهد scene2 مع اختبار واحد للحصول على أسرع النتائج.

    بالنسبة إلى الاختبار اليدوي، قبل البدء في تنفيذ مجموعة اختبارات نظام ITS على كل مشهد، يلتقط النص البرمجي صورة للمشهد الحالي ويحفظها بتنسيق JPEG، ثم يطبع مسار ملف JPEG في وحدة التحكّم، ويطلب من المستخدم تأكيد ما إذا كانت الصورة مناسبة. تتكرّر عملية التقاط الصورة والتأكيد إلى أن يؤكّد المستخدم أنّ الصورة مناسبة. وفي ما يلي الرسائل الواردة في هذه العملية.

    Preparing to run ITS on camera 0
    Start running ITS on camera:  0
    Press Enter after placing camera 0 to frame the test scene:
    scene1_1
    The scene setup should be: A grey card covering at least the   middle 30% of the scene
    Running vendor 3A on device
    Capture an image to check the test scene
    Capturing 1 frame with 1 format [yuv]
    Please check scene setup in /tmp/tmpwBOA7g/0/scene1_1.jpg
    Is the image okay for ITS scene1_1? (Y/N)
    

    يعرض كل تشغيل للبرنامج النصي سجلاً يعرض إما PASS أو FAIL أو FAIL* أو SKIP لكل اختبار من اختبارات ITS. يشير FAIL* إلى تعذُّر إجراء الاختبار، ولكن بما أنّ الاختبار ليس إلزاميًا بعد، سيتم تسجيله على أنّه PASS في CtsVerifier. يشير SKIP إلى أنّ الاختبار قد اجتاز لأنّ الجهاز لم يعلن عن الإمكانية الأساسية التي تم اختبارها. على سبيل المثال، إذا لم يعلن جهاز من خلال واجهات الكاميرا أنّه يتوافق مع DNG، سيتم تخطّي الاختبارات ذات الصلة بتسجيل ملفات DNG وسيتم احتسابها على أنّها PASS.

  3. للتأكيد على أنّ الاختبارات استوفت متطلبات الاختبار، انقر على زر علامة الاختيار الخضراء. يصبح إدخال اختبار Camera ITS في قائمة اختبارات CTS Verifier أخضر اللون، ما يشير إلى أنّ الهاتف اجتاز اختبار Camera ITS.

اختبار أجهزة قيد الاختبار بشكلٍ متوازٍ

تتيح الأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث إجراء اختبارات متوازية على الأجهزة الخاضعة للاختبار. يتيح لك ذلك اختبار الأجهزة قيد الاختبار بشكل متوازٍ باستخدام منصات اختبار متعددة لتسريع عملية الاختبار بشكل عام. على سبيل المثال، يتيح لك الاختبار المتوازي اختبار الكاميرا 0 في جهاز والكاميرا 1 في جهاز آخر في الوقت نفسه. يتم تجميع جميع الاختبارات لجلسات الاختبار المتزامن في جلسة CTS Verifier على الجهاز المرجعي. يجب إجراء اختبارات متوازية باستخدام أداة التحكّم في الإضاءة من Arduino، لأنّ التحكّم اليدوي في الإضاءة غير متاح مع الاختبارات المتوازية. تأكَّد من أنّ قناة مختلفة على وحدة التحكّم نفسها في Arduino تتحكّم في الإضاءة لكل منصة.

في ما يلي نموذج لملف config.yml يحدّد ثلاث بيئات اختبار لتشغيلها بالتوازي.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES_INDEX_0
    Controllers:
        AndroidDevice:
          - serial: <device-id-0>
            label: dut
          - serial: <tablet-id-0>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-0>
      camera: 0
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  - Name: TEST_BED_TABLET_SCENES_INDEX_1
    Controllers:
        AndroidDevice:
          - serial: <device-id-1>
            label: dut
          - serial: <tablet-id-1>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-1>
      camera: 1
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  # TEST_BED_SENSOR_FUSION represents testbed index 2
  # Parallel sensor_fusion is currently unsupported due to Arduino requirements
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion
    Controllers:
        AndroidDevice:
          - serial: <device-id>
            label: dut
    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: "arduino"
      rotator_ch: <controller-channel-2>
      camera: <camera-id>
      foldable_device: "False"
      tablet_device: "False"
      lighting_cntl: "None"
      lighting_ch: <controller-channel>
      scene: "sensor_fusion"

لتشغيل بيئات الاختبار بالتوازي، استخدِم الأمر التالي:

for i in 0 1 2; do python3 tools/run_all_tests.py testbed_index=$i num_testbeds=3 & done; wait

نموذج الضوضاء بتنسيق DNG

يجب أن توفّر الأجهزة التي تعلن عن إمكانية التقاط صور بتنسيق RAW أو DNG نموذجًا للتشويش في البيانات الوصفية لنتائج التقاط كل صورة بتنسيق RAW. يجب تضمين نموذج التشويش هذا في طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا لكل كاميرا (على سبيل المثال، الكاميرا الأمامية والخلفية) على الجهاز الذي يتيح هذه الميزة.

تنفيذ نموذج الضوضاء

لتنفيذ نموذج تشويش، اتّبِع الخطوات التالية لإنشاء نموذج تشويش وتضمينه في طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا.

  1. لإنشاء نموذج ضوضاء لكل كاميرا، شغِّل النص البرمجي dng_noise_model.py في الدليل tools. ينتج عن ذلك مقتطف رمز C. لمزيد من المعلومات حول كيفية إعداد الكاميرا والتقاط البيئة المحيطة، يُرجى الاطّلاع على مستند DngNoiseModel.pdf في دليل tools.

  2. لتنفيذ نموذج الضوضاء للجهاز، انسخ مقتطف رمز C والصقه في طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا.

التحقّق من صحة نموذج الضوضاء

يتحقّق اختبار tests/scene1_1/test_dng_noise_model.py الآلي لنظام النقل الذكي من صحة نموذج الضوضاء من خلال التأكّد من أنّ قيم الضوضاء لتعرُّض اللقطة والزيادة المقدَّمة في بيانات الكاميرا صحيحة.