调整相机和系统配置

增强型视觉系统 (EVS) 1.1 还对相机和系统的配置管理及用法进行了更新。由于 EVS 1.0 未提供查询相机设备信息和系统配置的方法,因此应用开发者必须自行获取相应信息。例如,客户端拥有相机校准数据时才能实现某些计算机视觉应用。

为缓解这种情况,EVS 1.1 会使用相机元数据扩展相机设备描述符,并提供多种方法来供客户端获取相机设备和系统配置信息。

import android.frameworks.cameraservice.device@2.0::CameraMetadata;
import android.frameworks.cameraservice.common@2.0::CameraMetadataType;

/**
 * Structure describing the basic properties of an EVS camera, extended
 * from its v1.0 declaration.
 *
 * The HAL is responsible for filling out this structure for each
 * EVS camera in the system.
 */
struct CameraDesc {
    @1.0::CameraDesc v1;
    /**
     * Store camera metadata such as lens characteristics.
     */
    CameraMetadata metadata;
};

CameraDesc 已扩展为包含相机设备元数据,且可从 android.frameworks.cameraservice.device@2.0 导入此类型。借助这种设计,供应商可在其实现中使用 camera_metadata_t 并充分利用 camera_metadata.h 中定义的 API。此外,供应商无法使用自己的元数据类型提供未在 Android 中定义的其他信息(如 camera_vendor_tags.h 中所述)。

使用所需的数据流配置打开相机设备

import android.hardware.camera.device@3.2::Stream;

/**
 * Get the IEvsCamera associated with a cameraId from a CameraDesc
 *
 * Given a camera's unique cameraId from CameraDesc, returns the
 * IEvsCamera interface associated with the specified camera. When
 * done using the camera, the caller may release it by calling closeCamera().
 *
 * @param  cameraId  A unique identifier of the camera.
 * @param  streamCfg A stream configuration the client wants to use.
 * @return evsCamera EvsCamera object associated with a given cameraId.
 */
openCamera_1_1(string cameraId, Stream streamCfg) generates (IEvsCamera evsCamera);

Android 定义的其中一个元数据字段是 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS。EVS 驱动程序可以使用此类型来确定各个相机模块支持的数据流配置。例如,以下参考实现列出了每个受支持数据流配置的相关信息:

  • 数据流 ID
  • 宽度
  • 高度
  • 方向(输入还是输出)
  • 帧速率

单相机硬件实例上的多个客户端

如果客户端请求打开已处于活动状态的相机设备,则 EVS 管理器会将所请求的数据流配置与处于活动状态的配置进行比较。如果二者有所不同,EVS 管理器会返回空的 IEvsCamera 对象。客户端必须正确处理这种可能出现的故障。

参考配置文件

EVS 1.1 中包含的参考配置文件是采用 XML 格式编写的,且供应商可以使用包含的 DTD 文件(如下所示)来验证(经过修改的)的示例配置文件,也可以使用自己的文件(如果要采用相同的格式)。DTD 文件还详细描述了各个元素和属性。

<?xml version='1.0' encoding='utf-8'?>
<!-- Copyright (C) 2019 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- Author : changyeon@google.com Version: 1.0 --> <!ELEMENT configuration (system,camera,display)> <!-- System Configuration that contains below informations: - The dimension of the vehicle. - Number of cameras available to EVS. - List of predefined use cases. --> <!ELEMENT system (dimension,num_cameras,supported_use_case*)> <!-- The x, y, and z dimension of the vehicle in the unit of centimeters. Axes are defined at https://source.android.com/docs/core/interaction/sensors/sensor-types#auto_axes --> <!ELEMENT dimension EMPTY> <!ATTLIST dimension x CDATA '0' y CDATA '0' z CDATA '0' > <!-- The number of cameras that are available to EVS on the vehicle. This must be equal to the number of camera elements of the device element. --> <!ELEMENT num_cameras EMPTY> <!ATTLIST num_cameras value CDATA #REQUIRED > <!-- List of predefined use cases --> <!ELEMENT supported_use_case (use_case)*> <!-- Predefined configurations for each of listed use cases. @attr id : Unique string identifier of this use case. @attr camera : ID of either a single camera device or a camera group. @attr stream_id: Preferred stream configuration of camera device/group that is set by camera attribute. --> <!ELEMENT use_case EMPTY> <!ATTLIST use_case id CDATA #REQUIRED camera CDATA #REQUIRED stream_id CDATA #REQUIRED > <!-- Device descriptions --> <!ELEMENT camera (group|device)*> <!-- Camera group descriptor @attr group_id : Unique logical camera group identifier. Camera device use this to be a member of the group. @attr device_id : Comma-separated list of unique camera identifiers of member camera devices. @attr synchronized: Boolean field that tells whether or not this camera is synchronized with other cameras in the same group. This will be ineffective if there is a single camera in the group or a group is invalid. --> <!ELEMENT group (caps)> <!ATTLIST group group_id CDATA #REQUIRED device_id CDATA #REQUIRED synchronized CDATA #REQUIRED > <!-- Please note that a camera may have stream configurations. If it has, all stream configurations must be supported by each camera device in the group. --> <!-- Camera device descriptor @attr id : Unique camera identifier. @attr position : Must be one of front, rear, left, or right. --> <!ELEMENT device (caps,characteristics*)> <!ATTLIST device id CDATA #REQUIRED position CDATA #REQUIRED > <!-- Camera metadata that contains: - A list of supported controls. - A list of supported stream configurations. --> <!ELEMENT caps (supported_controls|stream)*> <!-- A list of supported controls. This must be a subset of android.hardware.automotive.evs@1.1::CameraParam. --> <!ELEMENT supported_controls EMPTY> <!ATTLIST supported_controls value CDATA #REQUIRED > <!-- A list of supported output sizes. --> <!ELEMENT stream EMPTY> <!ATTLIST stream id CDATA #REQUIRED width CDATA #REQUIRED height CDATA #REQUIRED format CDATA #REQUIRED > <!-- Camera module characteristics including its optics and imaging sensor. --> <!ELEMENT characteristics (parameter)*> <!ELEMENT parameter EMPTY> <!-- A name of camera characteristic. This must be a subset of android.hardware.automotive.evs@1.1::CameraCharacteristics. --> <!ATTLIST parameter name CDATA #REQUIRED type CDATA #REQUIRED size CDATA #REQUIRED value CDATA #REQUIRED > <!-- Available display devices --> <!ELEMENT display (display_device)*> <!-- Display device descriptor @attr id : Unique display identifier. @attr position: Display mount location. --> <!ELEMENT display_device (supported_formats)*> <!ATTLIST display_device id CDATA #REQUIRED position CDATA #REQUIRED > <!-- A list of supported input data formats. @attr value: A comma separated list of input data formats --> <!ELEMENT supported_formats EMPTY> <!ATTLIST supported_formats value CDATA #REQUIRED >

示例配置文件如下所示(该示例包含虚拟数值数据)。

<?xml version='1.0' encoding='utf-8'?>
<!-- Copyright (C) 2019 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- Extended View System Example Configuration

     Android Automotive axes are used to define coordinates.
     See https://source.android.com/docs/core/interaction/sensors/sensor-types#auto_axes

     Use evs_configuration.dtd with xmllint tool, to validate XML configuration file
-->

<configuration>
    <!-- system configuration -->
    <system>
        <!-- reference dimension of the vehicle in the unit of centimeters -->
        <dimension x='200' y='400' z='100' />

        <!-- number of cameras available to EVS -->
        <num_cameras value='2'/>

        <!-- list of supported use cases -->
        <supported_use_case>
            <!-- use case configuration -->
            <use_case
                id='rear_view'
                camera='/dev/video1'
                stream_id='1'
            />

            <!-- use case configuration -->
            <use_case
                id='surround_view'
                camera='group1'
                stream_id='0'
            />
        </supported_use_case>
    </system>

    <!-- camera device information -->
    <camera>
        <!-- camera group 0 -->
        <group group_id='group0'
               device_id='/dev/video1,/dev/video2'
               synchronized='false'
        >
            <caps>
                <stream id='0' width='640' height='360' format='V4L2_PIX_UYUV'/>
            </caps>
        </group>

        <!-- camera device starts -->
        <device id='/dev/video1' position='rear'>
            <caps>
                <!-- list of supported controls -->
                <supported_controls
                    value='BRIGHTNESS,
                           CONTRAST,
                           AUTO_WHITE_BALANCE,
                           WHITE_BALANCE_TEMPERATURE,
                           SHARPNESS,
                           AUTO_EXPOSURE,
                           ABSOLUTE_EXPOSURE,
                           AUTO_FOCUS,
                           ABSOLUTE_ZOOM'
                />

                <!-- list of supported stream configurations -->
                <stream id='0' width='1280' height='1080' format='V4L2_PIX_NV21'/>
                <stream id='1' width='1280' height='1080' format='V4L2_PIX_YUYV'/>
                <stream id='2' width='1280' height='1080' format='V4L2_PIX_UYUV'/>
                <stream id='3' width='640'  height='360'  format='V4L2_PIX_NV21'/>
                <stream id='4' width='640'  height='360'  format='V4L2_PIX_YUYV'/>
                <stream id='5' width='640'  height='360'  format='V4L2_PIX_UYUV'/>
                <stream id='6' width='320'  height='240'  format='V4L2_PIX_NV21'/>
                <stream id='7' width='320'  height='240'  format='V4L2_PIX_YUYV'/>
                <stream id='8' width='320'  height='240'  format='V4L2_PIX_UYUV'/>
            </caps>

            <!-- list of parameters -->
            <characteristics>
                <!-- Lens distortion information. See
                     https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#LENS_DISTORTION
                -->
                <parameter
                    name='LENS_DISTORTION'
                    type='float'
                    size='5'
                    value='0.0,0.0,0.0,0.0,0.0'
                />

                <!-- Camera intrinsic calibration matrix. See
                     https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#LENS_INTRINSIC_CALIBRATION
                -->
                <parameter
                    name='LENS_INTRINSIC_CALIBRATION'
                    type='float'
                    size='5'
                    value='0.0,0.0,0.0,0.0,0.0'
                />

                <!-- Camera pose translation and rotation. See
                     https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#LENS_POSE_TRANSLATION
                     https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#LENS_POSE_ROTATION
                -->
                <parameter
                    name='LENS_POSE_TRANSLATION'
                    type='float'
                    size='3'
                    value='0.0,0.0,0.0'
                />
                <parameter
                    name='LENS_POSE_ROTATION'
                    type='float'
                    size='4'
                    value='0.0,0.0,0.0,0.0'
                />
            </characteristics>
        </device>
        <device id='/dev/video2' position='front'>
            <caps>
                <!-- list of supported stream configurations -->
                <stream id='0' width='1280' height='1080' format='V4L2_PIX_NV21'/>
            </caps>
        </device>
    </camera>

    <!-- display device starts -->
    <display>
        <display_device id='display0' position='driver'>
            <!-- list of supported input formats
                 This must be a subset of android_pixel_format_t enum.
            -->
            <supported_formats
                value='RGBA_8888,
                       YUYV,
                       UYVY'
            />
        </display_device>
    </display>
</configuration>