Android 9 پشتیبانی از «میانای برنامهسازی کاربردی» را برای دستگاههای چنددوربینی ازطریق دستگاه دوربین منطقی جدیدی که از دو یا چند دستگاه دوربین فیزیکی که در یک جهت قرار دارند تشکیل شده است معرفی کرد. دستگاه دوربین منطقی بهعنوان یک CameraDevice/CaptureSession واحد دراختیار برنامه قرار میگیرد و امکان تعامل با ویژگیهای چنددوربینی یکپارچهشده در HAL را فراهم میکند. برنامهها میتوانند بهصورت اختیاری به جاریسازیهای دوربین فیزیکی زیرین، فراداده، و کنترلها دسترسی داشته باشند و آنها را کنترل کنند.
شکل ۱. پشتیبانی از چند دوربین
در این نمودار، شناسههای دوربین مختلف با رنگ کدگذاری شدهاند. برنامه میتواند همزمان از هر دوربین فیزیکی بافرهای خام جاریسازی کند. همچنین میتوان کنترلهای جداگانهای تنظیم کرد و فرادادههای جداگانهای از دوربینهای فیزیکی مختلف دریافت کرد.
مثالها و منابع
دستگاههای چنددوربینه باید با قابلیت چنددوربینه منطقی تبلیغ شوند.
کلاینتهای دوربین میتوانند با فراخوانی
getPhysicalCameraIds()، شناسه دوربین دستگاههای فیزیکیای را که یک دوربین منطقی خاص از آنها ساخته شده است جستجو کنند.
سپس از شناسههای برگشتی بهعنوان بخشی از نتیجه برای کنترل کردن دستگاههای فیزیکی
بهصورت جداگانه ازطریق
setPhysicalCameraId() استفاده میشود.
نتایج حاصل از چنین درخواستهای فردی را میتوان با فراخوانی
getPhysicalCameraResults()
از نتیجه کامل جستجو کرد.
درخواستهای دوربین فیزیکی فردی ممکن است فقط از زیرمجموعه محدودی از پارامترها پشتیبانی کنند. برای دریافت فهرستی از پارامترهای پشتیبانیشده، توسعهدهندگان میتوانند
getAvailablePhysicalCameraRequestKeys() را فراخوانی کنند.
جاریسازیهای دوربین فیزیکی فقط برای درخواستهای غیربازپردازش و فقط برای حسگرهای تکرنگ و بایر پشتیبانی میشود.
پیادهسازی
بازبینه پشتیبانی
برای افزودن دستگاههای چنددوربینی منطقی در سمت HAL:
-
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAقابلیتی برای هر دستگاه دوربین منطقی که از دو یا چند دوربین فیزیکی پشتیبانی میکند و همچنین درمعرض دید برنامه قرار میگیرد اضافه کنید. - فیلد فراداده
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSایستا را با فهرستی از شناسههای دوربین فیزیکی تکمیل کنید. - فرادادههای ایستا مربوط به عمق را که برای همبستگی بین پیکسلهای جاریسازیهای دوربین فیزیکی لازم است پر کنید:
ANDROID_LENS_POSE_ROTATION،ANDROID_LENS_POSE_TRANSLATION،ANDROID_LENS_INTRINSIC_CALIBRATION،ANDROID_LENS_DISTORTION،ANDROID_LENS_POSE_REFERENCE. فیلد فراداده
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEایستا را روی این مقدار تنظیم کنید:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: برای حسگرهای در حالت اصلی-اصلی، هیچ همگامسازی سختافزاری شاتر/نوردهی وجود ندارد.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: برای حسگرها در حالت اصلی-فرعی، همگامسازی نوردهی/شاتر سختافزاری.
با فهرستی از پارامترهای پشتیبانیشده برای دوربینهای فیزیکی تکی،
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSرا تکمیل کنید. اگر دستگاه منطقی از درخواستهای فردی پشتیبانی نکند، این فهرست میتواند خالی باشد.اگر درخواستهای فردی پشتیبانی میشوند، درخواستهای فردی را که میتوانند بهعنوان بخشی از درخواستهای ضبط برسند پردازش و اعمال کنید و درخواستهای فردی را مطابق با آن پیوست کنید.
physicalCameraSettingsphysicalCameraMetadataبرای نسخههای ۳.۵ یا بالاتر دستگاه HAL دوربین (معرفیشده در Android 10)، کلید نتیجه
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_IDرا بااستفاده از شناسه دوربین فیزیکی فعال فعلی که از دوربین منطقی پشتیبانی میکند پر کنید.
برای دستگاههای دارای Android 9، دستگاههای دوربین باید از جایگزینی یک جاریسازی منطقی YUV یا RAW با جاریسازیهای فیزیکی با اندازه یکسان (برای جاریسازیهای RAW اعمال نمیشود) و قالب یکسان از دو دوربین فیزیکی پشتیبانی کنند. این مورد برای دستگاههای دارای Android 10 اعمال نمیشود.
برای دستگاههای دارای Android 10 که نسخه دستگاه HAL دوربین در آنها
۳.۵
یا بالاتر است، دستگاه دوربین باید از
isStreamCombinationSupported
پشتیبانی کند تا برنامهها بتوانند درباره پشتیبانی از ترکیب جاریسازی خاصی که حاوی
جاریسازیهای فیزیکی است پرسوجو کنند.
نقشه پیکربندی جاریسازی
برای دوربین منطقی، ترکیبهای جاریسازی اجباری برای دستگاه دوربین با
سطح سختافزاری معین همان چیزی است که در
CameraDevice.createCaptureSession لازم است.
همه جاریسازیها در نقشه پیکربندی جاریسازی باید جاریسازی منطقی باشند.
برای دستگاه دوربین منطقی که از قابلیت RAW با دوربینهای فرعی فیزیکی با اندازههای مختلف پشتیبانی میکند، اگر برنامهای جاریسازی RAW منطقی را پیکربندی کند، دستگاه دوربین منطقی نباید به دوربینهای فرعی فیزیکی با اندازههای حسگر مختلف تغییر کند. این کار تضمین میکند که برنامههای ضبط RAW موجود ازکار نیفتند.
برای بهرهگیری از زوم اپتیکال پیادهسازیشده با HAL ازطریق جابهجایی بین دوربینهای فرعی فیزیکی درطول ضبط RAW، برنامهها باید جاریسازیهای دوربین فرعی فیزیکی را بهجای جاریسازی منطقی RAW پیکربندی کنند.
ترکیب جاریسازی تضمینی
هم دوربین منطقی و هم دوربینهای فیزیکی زیربنایی آن باید ترکیبهای جاریسازی اجباری موردنیاز برای سطوح دستگاهشان را تضمین کنند.
دستگاه دوربین منطقی باید براساس سطح سختافزار و قابلیتهایش به همان روش دستگاه دوربین فیزیکی عمل کند. توصیه میشود مجموعه ویژگیهای آن مجموعه فرابالایی از ویژگیهای دوربینهای فیزیکی مجزا باشد.
در دستگاههای دارای Android 9، برای هر ترکیب جاریسازی تضمینشده، دوربین منطقی باید از موارد زیر پشتیبانی کند:
جایگزین کردن یک جاریسازی منطقی YUV_420_888 یا خام با دو جاریسازی فیزیکی با اندازه و قالب یکسان، که هرکدام از یک دوربین فیزیکی جداگانه میآیند، به شرطی که اندازه و قالب توسط دوربینهای فیزیکی پشتیبانی شود.
افزودن دو جاریسازی RAW، یکی از هر دوربین فیزیکی، اگر دوربین منطقی قابلیت RAW را تبلیغ نکند، اما دوربینهای فیزیکی زیرین این قابلیت را داشته باشند. این معمولاً زمانی اتفاق میافتد که دوربینهای فیزیکی اندازههای حسگر متفاوتی داشته باشند.
استفاده از جاریسازیهای فیزیکی بهجای جاریسازی منطقی با همان اندازه و قالب. وقتی حداقل مدت فریم جاریسازیهای فیزیکی و منطقی یکسان است، این کار نباید نرخ فریم ضبط را کاهش دهد.
ملاحظات عملکرد و توان
عملکرد:
- پیکربندی و جاریسازی کردن جریانهای فیزیکی ممکن است بهدلیل محدودیتهای منابع، نرخ ضبط دوربین منطقی را کاهش دهد.
- اگر دوربینهای زیرین در نرخ فریمهای متفاوتی قرار داده شوند، اعمال تنظیمات فیزیکی دوربین ممکن است نرخ ضبط را کاهش دهد.
برق:
- بهینهسازی توان HAL در حالت پیشفرض همچنان کار میکند.
- پیکربندی یا درخواست جاریسازی فیزیکی ممکن است بهینهسازی داخلی توان HAL را ملغی کند و باعث مصرف بیشتر توان شود.
سفارشیسازی
میتوانید پیادهسازی دستگاهتان را به روشهای زیر سفارشیسازی کنید.
- برونداد ترکیبشده دستگاه دوربین منطقی کاملاً به پیادهسازی HAL بستگی دارد. تصمیمگیری درباره نحوه استخراج جاریسازیهای منطقی ترکیبشده از دوربینهای فیزیکی برای برنامه و چارچوب دوربین Android شفاف است.
- درخواستها و نتایج فیزیکی فردی را میتوان بهصورت اختیاری پشتیبانی کرد. مجموعه پارامترهای دردسترس در چنین درخواستهایی نیز کاملاً به پیادهسازی HAL خاص بستگی دارد.
- از Android 10، «لایه انتزاعی سختافزار» میتواند با انتخاب عدم تبلیغ برخی یا همه PHYSICAL_IDها در
getCameraIdList، تعداد دوربینهایی را که برنامه میتواند مستقیماً باز کند کاهش دهد. سپس تماس باgetPhysicalCameraCharacteristicsباید ویژگیهای دوربین فیزیکی را برگرداند.
اعتبارسنجی
دستگاههای چنددوربینه منطقی باید مانند هر دوربین معمولی دیگری CTS دوربین را بگذرانند.
موارد آزمایشی که این نوع دستگاه را هدفیابی میکنند را میتوانید در
LogicalCameraDeviceTest
پیمانه پیدا کنید.
این سه آزمایش ITS سیستمهای چنددوربینی را هدف قرار میدهد تا ترکیب مناسب تصاویر را تسهیل کند:
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
آزمایشهای صحنه ۱ و صحنه ۴ با دستگاه آزمایش
ITS-in-a-box اجرا میشوند. آزمایش test_multi_camera_match تأیید میکند که وقتی هر دو دوربین فعال باشند، روشنایی مرکز تصاویر یکسان است. آزمایش test_multi_camera_alignment تأیید میکند که فاصلههای دوربین، جهتگیریها، و پارامترهای اعوجاج بهدرستی بارگیری شدهاند. اگر سیستم چنددوربینی
شامل دوربین «میدان دید عریض» (>۹۰ درجه) باشد، نسخه ۲ جعبه ITS لازم است.
Sensor_fusion یک دستگاه آزمایش دوم است که امکان حرکتهای مکرر و ازپیشتعیینشده تلفن را فراهم میکند و تأیید میکند که مُهر زمان ژیروسکوپ و حسگر تصویر مطابقت دارند و قابهای چنددوربینی همگامسازی شدهاند.
همه جعبهها ازطریق AcuSpec, Inc. (www.acuspecinc.com، fred@acuspecinc.com) و MYWAY Manufacturing (www.myway.tw، sales@myway.tw) دردسترس است. علاوهبراین، جعبه rev1 ITS را میتوانید ازطریق West-Mark (www.west-mark.com, dgoodman@west-mark.com) خریداری کنید.
روالهای مطلوب
برای بهرهمندی کامل از ویژگیهای فعالشده توسط چنددوربین و درعینحال حفظ سازگاری برنامه، هنگام پیادهسازی دستگاه چنددوربین منطقی، این روالهای مطلوب را دنبال کنید:
- (Android 10 یا بالاتر) دوربینهای فرعی فیزیکی را از
getCameraIdListپنهان کنید. این کار تعداد دوربینهایی را که برنامهها میتوانند مستقیماً باز کنند کاهش میدهد و نیاز برنامهها به داشتن منطق پیچیده انتخاب دوربین را ازبین میبرد. - (Android 11 یا بالاتر) برای دستگاه چنددوربینی منطقی که از زوم نوری پشتیبانی میکند،
میانای برنامهسازی کاربردی
ANDROID_CONTROL_ZOOM_RATIOرا پیادهسازی کنید و فقط برای برش نسبت ابعادی ازANDROID_SCALER_CROP_REGIONاستفاده کنید.ANDROID_CONTROL_ZOOM_RATIOبه دستگاه امکان میدهد زومپس کند و دقت بهتری را حفظ کند. در این مورد، «لایه انتزاع سختافزار» باید سیستم مختصاتANDROID_SCALER_CROP_REGION،ANDROID_CONTROL_AE_REGIONS،ANDROID_CONTROL_AWB_REGIONS،ANDROID_CONTROL_AF_REGIONS،ANDROID_STATISTICS_FACE_RECTANGLES، وANDROID_STATISTICS_FACE_LANDMARKSرا تنظیم کند تا میدان دید پساز بزرگنمایی را بهعنوان آرایه فعال حسگر درنظر بگیرد. برای اطلاعات بیشتر درباره نحوه عملکردANDROID_SCALER_CROP_REGIONباANDROID_CONTROL_ZOOM_RATIO،camera3_crop_reprocess#croppingرا ببینید. - برای دستگاههای چنددوربینی با دوربینهای فیزیکی که قابلیتهای متفاوتی دارند، مطمئن شوید که دستگاه فقط درصورتی از مقدار یا محدوده خاصی برای کنترل پشتیبانی میکند که کل محدوده بزرگنمایی از آن مقدار یا محدوده پشتیبانی کند. برای مثال، اگر دوربین منطقی از یک دوربین زاویه فوقباز،
یک دوربین زاویه باز، و یک دوربین تلهفوتو تشکیل شده است، کارهای زیر را انجام دهید:
- اگر اندازه آرایه فعال دوربینهای فیزیکی متفاوت باشد،
HAL دوربین باید نگاشت را از آرایههای فعال دوربینهای فیزیکی به
آرایه فعال دوربین منطقی برای
ANDROID_SCALER_CROP_REGION،ANDROID_CONTROL_AE_REGIONS،ANDROID_CONTROL_AWB_REGIONS،ANDROID_CONTROL_AF_REGIONS،ANDROID_STATISTICS_FACE_RECTANGLES، وANDROID_STATISTICS_FACE_LANDMARKSانجام دهد تا از دیدگاه برنامه، سیستم مختصات اندازه آرایه فعال دوربین منطقی باشد. - اگر دوربینهای زاویه باز و تلهفوتو از فوکوس خودکار پشتیبانی میکنند، اما دوربین زاویه بسیار باز فوکوس ثابت دارد، مطمئن شوید دوربین منطقی پشتیبانی از فوکوس خودکار را تبلیغ میکند. «لایه انتزاعی سختافزار» باید ماشین حالت فوکوس خودکار را برای دوربین زاویه بسیار باز شبیهسازی کند تا وقتی برنامه روی لنز زاویه بسیار باز زومپای میکند، این واقعیت که دوربین فیزیکی زیرین دارای فوکوس ثابت است برای برنامه شفاف باشد و ماشینهای حالت فوکوس خودکار برای حالتهای فوکوس خودکار پشتیبانیشده طبق انتظار کار کنند.
- اگر دوربینهای عریض و تلهفوتو از 4K با سرعت ۶۰ فریم در ثانیه پشتیبانی میکنند، و دوربین فوقعریض فقط از 4K با سرعت ۳۰ فریم در ثانیه یا 1080p با سرعت ۶۰ فریم در ثانیه پشتیبانی میکند، اما از 4K با سرعت ۶۰ فریم در ثانیه پشتیبانی نمیکند، مطمئن شوید که دوربین منطقی 4K با سرعت ۶۰ فریم در ثانیه را در پیکربندیهای جاریسازی پشتیبانیشده خود تبلیغ نمیکند. این کار یکپارچگی قابلیتهای دوربین منطقی را تضمین میکند و مطمئن میشود که برنامه با مشکل عدم دستیابی به 4k @ 60 fps در مقدار کمتر از ۱
ANDROID_CONTROL_ZOOM_RATIOمواجه نخواهد شد.
- اگر اندازه آرایه فعال دوربینهای فیزیکی متفاوت باشد،
HAL دوربین باید نگاشت را از آرایههای فعال دوربینهای فیزیکی به
آرایه فعال دوربین منطقی برای
- در Android 10 و بالاتر، چنددوربین منطقی
برای پشتیبانی از ترکیبهای جاریسازی که شامل جاریسازیهای فیزیکی است لازم نیست.
اگر HAL از ترکیبی با جریانهای فیزیکی پشتیبانی کند:
- (Android 11 یا بالاتر) برای مدیریت بهتر موارد استفاده مانند عمق از استریو و ردیابی حرکت، میدان دید بروندادهای جاریسازی فیزیکی را تا حد امکان بزرگ کنید. بااینحال، اگر یک جاریسازی فیزیکی و یک جاریسازی منطقی از یک دوربین فیزیکی منشأ بگیرند، محدودیتهای سختافزاری ممکن است باعث شود میدان دید جاریسازی فیزیکی با جاریسازی منطقی یکسان باشد.
- برای رفع فشار حافظه ناشی از چند جاریسازی فیزیکی،
مطمئن شوید برنامهها از
discardFreeBuffersبرای تخصیصزدایی بافرهای آزاد (بافرهایی که توسط مصرفکننده آزاد شدهاند، اما هنوز توسط تولیدکننده از صف خارج نشدهاند) استفاده کنند، اگر انتظار میرود جاریسازی فیزیکی برای مدتی غیرفعال باشد. - اگر جاریسازیهای فیزیکی از دوربینهای فیزیکی مختلف معمولاً به درخواست یکسانی پیوست نمیشوند، مطمئن شوید برنامهها از
surface groupاستفاده کنند تا از یک صف میانگیر برای پشتیبانی از دو سطح رو به برنامه استفاده شود و مصرف حافظه کاهش یابد.