Exposure mode#

Cameras can operate in different exposure modes that can be configured with Camera APIs:

  • automatic: Automatic exposure mode.

  • automaticPreferIsoSensitivity: Automatic exposure mode, prefer increasing iso sensitivity.

  • automaticPreferShutterSpeed: Automatic exposure mode, prefer reducing shutter speed.

  • manualIsoSensitivity: Manual ISO sensitivity mode.

  • manualShutterSpeed: Manual shutter speed mode.

  • manual: Manual mode.

Camera 1#

Exposure mode is configured with field CameraExposureSettings.mode. The list of supported modes is given by CameraExposureSettings.supportedModes.

Some exposure modes are configured with other settings:

  • automatic, automaticPreferIsoSensitivity and automaticPreferShutterSpeed

    • configured with field CameraExposureSettings.maximumIsoSensitivity

    • supported values given by CameraExposureSettings.supportedMaximumIsoSensitivity

    • configured with field CameraExposureSettings.autoExposureMeteringMode

  • manualIsoSensitivity

    • configured with field CameraExposureSettings.manualIsoSensitivity

    • supported values given by CameraExposureSettings.supportedManualIsoSensitivity

  • manualShutterSpeed

    • configured with field CameraExposureSettings.manualShutterSpeed`

    • supported values given by CameraExposureSettings.supportedManualShutterSpeeds

  • manual

    • configured with field CameraExposureSettings.manualShutterSpeed

    • supported values given by CameraExposureSettings.supportedManualShutterSpeeds

    • configured with field CameraExposureSettings.manualIsoSensitivity

    • supported values given by CameraExposureSettings.supportedManualIsoSensitivity

Sample code to monitor exposure settings:

/// Keep reference on MainCamera peripheral to get notified of changes.
private var cameraRef: Ref<MainCamera>?

/// Monitors and prints exposure settings.
func monitorExposureSettings(drone: Drone) {
    cameraRef = drone.getPeripheral(Peripherals.mainCamera) { camera in
        // called on main thread when the camera peripheral changes
        if let camera = camera {
            // get exposure settings
            let exposureSettings = camera.exposureSettings
            if exposureSettings.supportedModes.isEmpty {
                // setting value is not relevant if there is no supported value
                print("No exposure mode supported")
            } else {
                // get setting value
                let mode = exposureSettings.mode
                print("Exposure mode: \(mode)")
                switch mode {
                case .automatic, .automaticPreferShutterSpeed, .automaticPreferIsoSensitivity:
                    // get maximum iso sensitivity
                    if exposureSettings.supportedMaximumIsoSensitivity.isEmpty {
                        print("No maximumIsoSensitivity supported")
                    } else {
                        let maximumIsoSensitivity = exposureSettings.maximumIsoSensitivity
                        print("Exposure : maximumIsoSensitivity \(maximumIsoSensitivity)")
                    }
                    // get auto exposure metering mode
                    let autoExposureMeteringMode = exposureSettings.autoExposureMeteringMode
                    print("Exposure: autoExposureMeteringMode \(autoExposureMeteringMode)")
                case .manualShutterSpeed:
                    // get manual shutter speed
                    if exposureSettings.supportedManualShutterSpeeds.isEmpty {
                        print("No manualShutterSpeed supported")
                    } else {
                        let manualShutterSpeed = exposureSettings.manualShutterSpeed
                        print("Exposure : manualShutterSpeed \(manualShutterSpeed)")
                    }
                case .manualIsoSensitivity:
                    // get manual iso sensitivity
                    if exposureSettings.supportedManualIsoSensitivity.isEmpty {
                        print("No manualIsoSensitivity supported")
                    } else {
                        let manualIsoSensitivity = exposureSettings.manualIsoSensitivity
                        print("Exposure : manualIsoSensitivity \(manualIsoSensitivity)")
                    }
                case .manual:
                    // get manual iso sensitivity
                    if exposureSettings.supportedManualIsoSensitivity.isEmpty {
                        print("No manualIsoSensitivity supported")
                    } else {
                        let manualIsoSensitivity = exposureSettings.manualIsoSensitivity
                        print("Exposure : manualIsoSensitivity \(manualIsoSensitivity)")
                    }
                    // get manual shutter speed
                    if exposureSettings.supportedManualShutterSpeeds.isEmpty {
                        print("No manualShutterSpeed supported")
                    } else {
                        let manualShutterSpeed = exposureSettings.manualShutterSpeed
                        print("Exposure : manualShutterSpeed \(manualShutterSpeed)")
                    }
                }
            }
        }
    }
}

Example of output:

Exposure mode: automatic
Exposure : maximumIsoSensitivity iso3200
Exposure: autoExposureMeteringMode
Exposure : manualShutterSpeed oneOver80
Exposure : manualIsoSensitivity iso400

Sample code to modify exposure settings:

/// Sets exposure mode.
func setExposureMode(drone: Drone, mode: CameraExposureMode) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        // set setting value
        camera.exposureSettings.mode = mode
    }
}

 /// Sets manual shutter speed.
func setManualShutterSpeed(drone: Drone, manualShutterSpeed: CameraShutterSpeed) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        // set setting value
        camera.exposureSettings.manualShutterSpeed = manualShutterSpeed
    }
}

/// Sets manual iso sensitivity.
func setManualIsoSensitivity(drone: Drone, manualIsoSensitivity: CameraIso) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        // set setting value
        camera.exposureSettings.manualIsoSensitivity = manualIsoSensitivity
    }
}

/// Sets maximum ISO sensitivity.
func setMaxIsoSensitivity(drone: Drone, maxIsoSensitivity: CameraIso) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        // set setting value
        camera.exposureSettings.maximumIsoSensitivity = maxIsoSensitivity
    }
}

/// Sets auto exposure metering mode.
func setAutoExposureMeteringMode(drone: Drone, autoExposureMeteringMode: CameraAutoExposureMeteringMode) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        // set setting value
        camera.exposureSettings.autoExposureMeteringMode = autoExposureMeteringMode
    }
}

Camera 2#

Exposure mode is configured with parameter Camera2Params.exposureMode.

Some exposure modes are configured with other settings:

  • automatic, automaticPreferIsoSensitivity and automaticPreferShutterSpeed

    • configured with parameter Camera2Params.maximumIsoSensitivity

    • configured with parameter Camera2Params.autoExposureMeteringMode

  • manualIsoSensitivity

    • configured with parameter Camera2Params.isoSensitivity

  • manualShutterSpeed

    • configured with parameter Camera2Params.shutterSpeed`

  • manual

    • configured with parameter Camera2Params.shutterSpeed

    • configured with parameter Camera2Params.isoSensitivity

Sample code to monitor exposure settings:

/// Keep reference on MainCamera2 peripheral to get notified of changes.
private var cameraRef: Ref<MainCamera2>?

/// Monitors and prints exposure settings.
func monitorExposureSettings(drone: Drone) {
    cameraRef = drone.getPeripheral(Peripherals.mainCamera2) { camera in
        // called on main thread when the camera peripheral changes
       if let camera = camera {
            // get configuration parameter
            if let configParam = camera.config[Camera2Params.exposureMode] {
                if configParam.currentSupportedValues.isEmpty {
                    // parameter value is not relevant
                    // if there is not supported values in current configuration
                    print("No exposure mode supported")
                } else {
                    // get parameter value
                    let mode = configParam.value
                    print("Exposure mode: \(mode)")

                    switch mode {
                    case .automatic, .automaticPreferIsoSensitivity, .automaticPreferShutterSpeed:
                        // get maximum iso sensitivity
                        if let maximumIsoSensitivityParam = camera.config[Camera2Params.maximumIsoSensitivity] {
                            if maximumIsoSensitivityParam.currentSupportedValues.isEmpty {
                                print("No maximumIsoSensitivityParam supported")
                            } else {
                                let maximumIsoSensitivity = maximumIsoSensitivityParam.value
                                print("Exposure : maximumIsoSensitivity \(maximumIsoSensitivity)")
                            }
                        }
                        // get auto exposure metering mode
                        if let autoExposureMeteringModeParam = camera.config[Camera2Params.autoExposureMeteringMode] {
                            let autoExposureMeteringMode = autoExposureMeteringModeParam.value
                            print("Exposure : autoExposureMeteringMode \(autoExposureMeteringMode)")
                        }
                    case .manualShutterSpeed:
                        // get manual shutter speed
                        if let shutterSpeedParam = camera.config[Camera2Params.shutterSpeed] {
                            if shutterSpeedParam.currentSupportedValues.isEmpty {
                                print("No shutterSpeed supported")
                            } else {
                                let shutterSpeed = shutterSpeedParam.value
                                print("Exposure : shutterSpeed \(shutterSpeed)")
                            }
                        }
                    case .manualIsoSensitivity:
                        // get manual iso sensitivity
                        if let isoSensitivityParam = camera.config[Camera2Params.isoSensitivity] {
                            if isoSensitivityParam.currentSupportedValues.isEmpty {
                                print("No isoSensitivity supported")
                            } else {
                                let isoSensitivity = isoSensitivityParam.value
                                print("Exposure : isoSensitivity \(isoSensitivity)")
                            }
                        }
                    case .manual:
                        // get manual iso sensitivity
                        if let isoSensitivityParam = camera.config[Camera2Params.isoSensitivity] {
                            if isoSensitivityParam.currentSupportedValues.isEmpty {
                                print("No isoSensitivity supported")
                            } else {
                                let isoSensitivity = isoSensitivityParam.value
                                print("Exposure : isoSensitivity \(isoSensitivity)")
                            }
                        }
                        // get manual shutter speed
                        if let shutterSpeedParam = camera.config[Camera2Params.shutterSpeed] {
                            if shutterSpeedParam.currentSupportedValues.isEmpty {
                                print("No shutterSpeed supported")
                            } else {
                                let shutterSpeed = shutterSpeedParam.value
                                print("Exposure : shutterSpeed \(shutterSpeed)")
                            }
                        }
                    }
                }
            }
        }
    }
}

Example of output:

Exposure mode: automatic
Exposure : maximumIsoSensitivity iso3200
Exposure: autoExposureMeteringMode
Exposure : manualShutterSpeed oneOver80
Exposure : manualIsoSensitivity iso400

Sample code to modify exposure settings:

/// Sets exposure mode.
func setExposureMode(drone: Drone, mode: Camera2ExposureMode) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // create configuration editor, starting from current configuration
        let editor = camera.config.edit(fromScratch: false)
        // retrieve configuration parameter
        if let configParam = editor[Camera2Params.exposureMode] {
            // change parameter value
            configParam.value = mode
            // automatically complete configuration
            editor.autoComplete()
            // send new configuration to drone
            _ = editor.commit()
        }
    }
}

/// Sets shutter speed.
func setExposureManualShutterSpeed(drone: Drone, shutterSpeed: Camera2ShutterSpeed) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // create configuration editor, starting from current configuration
        let editor = camera.config.edit(fromScratch: false)
        // retrieve configuration parameter
        if let configParam = editor[Camera2Params.shutterSpeed] {
            // change parameter value,
            // and unset other parameters conflicting with this new value
            configParam.value = shutterSpeed
            // automatically complete configuration
            editor.autoComplete()
            // send new configuration to drone
            _ = editor.commit()
        }
    }
}

/// Sets iso sensitivity.
func setExposureManualIsoSensitivity(drone: Drone, isoSensitivity: Camera2Iso) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // create configuration editor, starting from current configuration
        let editor = camera.config.edit(fromScratch: false)
        // retrieve configuration parameter
        if let configParam = editor[Camera2Params.isoSensitivity] {
            // change parameter value,
            // and unset other parameters conflicting with this new value
            configParam.value = isoSensitivity
            // complete configuration, by setting missing parameters values
            editor.autoComplete()
            // send new configuration to drone
            _ = editor.commit()
        }
    }
}

/// Sets maximum iso sensitivity.
func setExposureMaximumIsoSensitivity(drone: Drone, isoSensitivity: Camera2Iso) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // create configuration editor, starting from current configuration
        let editor = camera.config.edit(fromScratch: false)
        // retrieve configuration parameter
        if let configParam = editor[Camera2Params.maximumIsoSensitivity] {
            // change parameter value,
            // and unset other parameters conflicting with this new value
            configParam.value = isoSensitivity
            // complete configuration, by setting missing parameters values
            editor.autoComplete()
            // send new configuration to drone
            _ = editor.commit()
        }
    }
}

/// Sets auto exposure mode.
func setExposureAutoExposureMeteringMode(drone: Drone, mode: Camera2AutoExposureMeteringMode) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // create configuration editor, starting from current configuration
        let editor = camera.config.edit(fromScratch: false)
        // retrieve configuration parameter
        if let configParam = editor[Camera2Params.autoExposureMeteringMode] {
            // change parameter value,
            // and unset other parameters conflicting with this new value
            configParam.value = mode
            // complete configuration, by setting missing parameters values
            editor.autoComplete()
            // send new configuration to drone
            _ = editor.commit()
        }
    }
}