دوربین ITS

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

ITS در مهار تست تأییدکننده CTS در 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
    

راه اندازی هاست

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

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

Android SDK Platform Tools

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

پایتون

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

موبلی

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

pip install mobly

راه اندازی محیط

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

cd CameraITS
source build/envsetup.sh

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

اگر پیغام خطای libtinfo.so.6: no version information available (required by /bin/sh) در زمان اجرا، دستور زیر را برای تغییر نام فایل libtinfo.so.6 اجرا کنید.

mv $ENV_DIRECTORY/lib/libtinfo.so.6 $ENV_DIRECTORY/lib/libtinfo.so.6.bak

تنظیم صحنه

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

برای تست دستی، از موارد زیر اطمینان حاصل کنید:

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

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

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

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

با استفاده از چارچوب 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=1 scenes=2,1,0

فایل config.yml صحنه sensor_fusion

در زیر یک نمونه فایل config_yml برای تست های sensor_fusion آورده شده است. برای تست sensor_fusion ، کلمه کلیدی SENSOR_FUSION باید در نام بستر آزمایش باشد. اندروید 13 و بالاتر به دلیل پیش نمایش و تست تثبیت ویدئو، تنها از کنترلر آردوینو برای ترکیب سنسور پشتیبانی می کند. اندروید 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

فایل config.yml چندین testbeds

در زیر یک نمونه فایل 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 برای آزمایش دستی آورده شده است. از اندروید 14، تست دستی برای همه تست ها به جز تست های scene_extensions پشتیبانی می شود. برای تست دستی، کلمه کلیدی MANUAL باید در نام بستر تست باشد. همچنین، بخش AndroidDevice نمی‌تواند شامل قسمت سریال یا برچسب برای رایانه لوحی باشد.

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

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

اجرای تست های 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)
    

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

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

تست DUT موازی

دستگاه‌هایی که اندروید 14 یا بالاتر دارند، از تست DUT موازی پشتیبانی می‌کنند. این به شما امکان می دهد DUT ها را به صورت موازی با چندین ریگ آزمایش کنید تا آزمایش کلی را سرعت بخشید. به عنوان مثال، آزمایش موازی به شما امکان می دهد دوربین 0 را در یک دکل و دوربین 1 را در یک دکل دیگر آزمایش کنید. تمام آزمایشات برای جلسات تست موازی در جلسه تأیید کننده CTS در 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 مدل نویز را با تأیید صحت مقادیر نویز برای نوردهی و بهره ارائه شده در داده های دوربین تأیید می کند.