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()
}
}
}