نمای کلی دوربین ITS، نمای کلی دوربین ITS

مجموعه تست تصویر دوربین (ITS) چارچوبی برای اجرای تست‌ها روی تصاویر تولید شده توسط دوربین اندروید است. هدف کلی هر تست در ITS پیکربندی دوربین به روشی خاص، گرفتن یک یا چند عکس و بررسی عکس‌ها برای بررسی وجود داده‌های تصویری مورد انتظار است. بسیاری از تست‌ها نیاز دارند که دوربین به سمت یک نمودار هدف خاص نشانه گرفته شود یا با شدت خاصی روشن شود.

ITS در بخش تست CTS Verifier در مسیر cts/apps/CameraITS قرار دارد. دستگاه‌ها باید تست‌های ITS مربوط به ویژگی‌های پشتیبانی‌شده توسط چارچوب دوربین برای برنامه‌های شخص ثالث به عنوان زیرمجموعه‌ای از CTS را با موفقیت پشت سر بگذارند.

راه‌اندازی

برای اجرای تست‌های ITS، موارد زیر باید تنظیم شوند:

  • دستگاه تحت آزمایش (DUT)
  • یک دستگاه میزبان (مثلاً یک کامپیوتر رومیزی یا لپ‌تاپ لینوکس)
  • صحنه‌ای که دوربین از آن عکس می‌گیرد

تنظیمات دستگاه تحت آزمایش (DUT)

برای تنظیم DUT، مراحل زیر را دنبال کنید:

  1. DUT را از طریق USB به یک دستگاه میزبان وصل کنید.
  2. مجوزهای لازم برای دسترسی میزبان به DUT از طریق 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. در DUT، برنامه دوربین پیش‌فرض را اجرا کنید و تمام پنجره‌هایی که هنگام اجرا ظاهر می‌شوند را پاک کنید تا از تداخل در حین آزمایش جلوگیری شود.

تنظیم میزبان

ITS مستلزم آن است که دستگاه میزبان از طریق USB به DUT متصل باشد، بتواند از ADB برای کنترل و ارتباط دستگاه استفاده کند و نرم‌افزار مورد نیاز را نصب کرده باشد.

برای راه‌اندازی دستگاه میزبان خود، مطمئن شوید که نرم‌افزار زیر نصب شده است.

ابزارهای پلتفرم SDK اندروید

ابزارهای پلتفرم SDK اندروید باید نصب شده باشند و ADB باید در مسیر اجرایی پوسته یا ترمینالی که روی دستگاه میزبان در حال اجرا است، قرار داشته باشد. برای نسخه عمومی منتشر شده از ابزارهای پلتفرم SDK اندروید، به یادداشت‌های انتشار ابزارهای پلتفرم SDK مراجعه کنید.

پایتون

پایتون باید روی دستگاه میزبان نصب شود. برای اطمینان از پشتیبانی از نسخه‌های سازگار، توصیه می‌کنیم از یک توزیع پایتون همراه استفاده کنید. برای جزئیات بیشتر در مورد اینکه کدام نسخه‌های پایتون و بسته را برای یک نسخه خاص نصب کنید، به یادداشت‌های انتشار Camera ITS برای نسخه مربوطه مراجعه کنید.

موبلی

برای اندروید ۱۲ و بالاتر، چارچوب تست Mobly را نصب کنید. Mobly به شما امکان می‌دهد یک DUT و تبلت نمودار را در کلاس its_base_test تنظیم کنید. برای نصب چارچوب تست Mobly، دستور زیر را اجرا کنید:

pip install mobly

تنظیمات محیط

برای تنظیم محیط آزمایش، دستور زیر را اجرا کنید:

cd CameraITS
source build/envsetup.sh

این دستور نصب پایتون را بررسی می‌کند، متغیر محیطی PYTHONPATH را تنظیم می‌کند و تست‌های واحد را روی ماژول‌های utils/*.py اجرا می‌کند. اگر هیچ خطایی در ترمینال چاپ نشود، محیط برای اجرای تست‌های ITS آماده است.

چیدمان صحنه

برای تنظیم صحنه‌ها، توصیه می‌کنیم از تنظیمات دوربین ITS-in-a-box برای سهولت در اتوماسیون، قابلیت اطمینان و کارایی در آزمایش استفاده کنید. تجهیزات تست ITS-in-a-box از تمام الزامات روشنایی، مرکزبندی و تغییر نمودار برای ITS پشتیبانی می‌کنند. همچنین، ITS-in-a-box برای آزمایش افزونه‌های دوربین مورد نیاز است.

برای تست دستی، موارد زیر را بررسی کنید:

  • دستگاه تست نفوذ (DUT) روی سه پایه قرار دارد
  • DUT برای هر آزمایش به صحنه صحیح اشاره می‌کند. (اسکریپت آزمایش ITS قبل از شروع آزمایش‌ها در یک صحنه جدید، دستورالعمل‌هایی را برای تغییر تنظیمات صحنه ارائه می‌دهد.)
  • DUT از طریق USB به دستگاه میزبان متصل می‌شود.
  • دستگاه تست (DUT) در طول اجرای آزمایش حرکت نمی‌کند.
  • صحنه با یک منبع نور ثابت و بدون نوسان روشن می‌شود. (از نور فلورسنت استفاده نکنید زیرا باعث سوسو زدن می‌شود.)

اسکریپت تست ITS پیامی را نمایش می‌دهد که از کاربر می‌خواهد قبل از شروع تست‌ها در یک صحنه جدید، تنظیمات صحنه را تغییر دهد.

جهت گوشی باید طوری تنظیم شود که دوربین بدون چرخش عکس بگیرد. ساده‌ترین راه برای بررسی این موضوع، استفاده از صحنه‌های چهره در scene2 است. اکثر گوشی‌ها گوشی را در جهت افقی قرار می‌دهند، به این صورت که برای دوربین عقب، گوشی در خلاف جهت عقربه‌های ساعت و برای دوربین جلو، در جهت عقربه‌های ساعت می‌چرخد.

فایل‌های پیکربندی

با استفاده از چارچوب Mobly، باید یک فایل پیکربندی config.yml برای تعریف بستر آزمایشی Mobly ایجاد کنید. در ادامه مثال‌هایی برای موارد استفاده مختلف ارائه شده است.

فایل config.yml صحنه‌های مبتنی بر تبلت

در ادامه یک نمونه فایل config.yml برای صحنه‌های مبتنی بر تبلت آمده است. برای تست مبتنی بر تبلت، کلمه کلیدی TABLET باید در نام testbed باشد. در طول مقداردهی اولیه، اجراکننده تست 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.yml

در ادامه یک نمونه فایل config_yml برای تست‌های sensor_fusion آمده است. برای تست sensor_fusion ، کلمه کلیدی SENSOR_FUSION باید در نام testbed باشد. اندروید ۱۳ و بالاتر به دلیل پیش‌نمایش و تست تثبیت ویدیو، فقط از کنترلر آردوینو برای sensor fusion پشتیبانی می‌کند. اندروید ۱۲ از کنترلرهای آردوینو و 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 برای تست دستی آمده است. اندروید ۱۴ و بالاتر از تست دستی برای همه تست‌ها به جز تست‌های scene_extensions پشتیبانی می‌کند. برای تست دستی، کلمه کلیدی MANUAL باید در نام testbed باشد. همچنین، بخش AndroidDevice نمی‌تواند شامل بخش سریال یا برچسب برای تبلت باشد.

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

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

فایل config.yml تست دکل Gen2

در ادامه یک نمونه فایل config.yml از یک بستر آزمایشی TEST_BED_GEN2 آمده است. این بستر آزمایشی برای آزمایش‌های scene_ip استفاده می‌شود که از یک Gen2 rig](/docs/compatibility/cts/camera-its-box-gen2) استفاده می‌کند. مثال زیر پارامترهای بستر آزمایشی را در زمانی که Gen2 rig در دسترس است و آزمایش‌های 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

مثال زیر پارامترهای بستر آزمایش را در زمانی که دستگاه 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 Verifer را باز کنید. در منوی تست‌ها، Camera ITS Test را انتخاب کنید.

  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)
    

    هر بار اجرای اسکریپت، یک گزارش (log) چاپ می‌کند که برای هر تست ITS، گزینه‌های PASS ، FAIL ، FAIL* یا SKIP را نشان می‌دهد. FAIL* نشان می‌دهد که تست ناموفق بوده است، اما از آنجایی که تست هنوز اجباری نشده است، تست به عنوان PASS به CtsVerifier گزارش می‌شود. SKIP نشان می‌دهد که تست با موفقیت انجام شده است، زیرا دستگاه قابلیت اصلی مورد آزمایش را اعلام نکرده است. به عنوان مثال، اگر دستگاهی از طریق رابط‌های دوربین اعلام نکند که از DNG پشتیبانی می‌کند، تست‌های مربوط به ضبط فایل DNG رد شده و به عنوان PASS شمارش می‌شوند.

  3. برای تأیید اینکه آزمایش‌ها الزامات آزمایش را برآورده کرده‌اند، روی دکمه علامت سبز ضربه بزنید. سپس ورودی Camera ITS Test در منوی آزمایش‌های CTS Verifier سبز می‌شود و نشان می‌دهد که تلفن از Camera ITS عبور کرده است.

آزمایش موازی DUT

دستگاه‌هایی که اندروید ۱۴ یا بالاتر دارند، از تست DUT موازی پشتیبانی می‌کنند. این به شما امکان می‌دهد DUTها را به صورت موازی با چندین دستگاه تست کنید تا سرعت تست کلی افزایش یابد. به عنوان مثال، تست موازی به شما امکان می‌دهد دوربین ۰ را در یک دستگاه و دوربین ۱ را در دستگاه دیگر به طور همزمان تست کنید. تمام تست‌های مربوط به جلسات تست موازی در جلسه CTS Verifier روی DUT مرجع تجمیع می‌شوند. شما باید تست موازی را با کنترل روشنایی آردوینو انجام دهید، زیرا کنترل روشنایی دستی با تست موازی پشتیبانی نمی‌شود. مطمئن شوید که یک کانال متفاوت در همان کنترلر آردوینو، روشنایی هر دستگاه را کنترل می‌کند.

در ادامه یک نمونه فایل 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 را تبلیغ می‌کنند، باید یک مدل نویز در فراداده نتیجه ضبط هر عکس خام ارائه دهند. این مدل نویز باید برای هر دوربین (به عنوان مثال، دوربین‌های جلو و عقب) روی دستگاهی که ادعای پشتیبانی دارد، در HAL دوربین تعبیه شود.

پیاده‌سازی مدل نویز

برای پیاده‌سازی یک مدل نویز، این مراحل را دنبال کنید تا یک مدل نویز تولید کنید و مدل را در HAL دوربین جاسازی کنید.

  1. برای تولید مدل نویز برای هر دوربین، اسکریپت dng_noise_model.py را در دایرکتوری tools اجرا کنید. این یک قطعه کد C را خروجی می‌دهد. برای اطلاعات بیشتر در مورد نحوه تنظیم دوربین و محیط ضبط، به سند DngNoiseModel.pdf در دایرکتوری tools مراجعه کنید.

  2. برای پیاده‌سازی مدل نویز برای دستگاه، قطعه کد C را کپی کرده و در HAL دوربین قرار دهید.

اعتبارسنجی مدل نویز

تست خودکار ITS در tests/scene1_1/test_dng_noise_model.py با تأیید صحت مقادیر نویز برای نوردهی و بهره شات ارائه شده در داده‌های دوربین، مدل نویز را اعتبارسنجی می‌کند.