Zoom#

Camera 1#

Zoom level is controlled with setting CameraZoom.

Sample code to monitor camera zoom:

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

/// Monitors and prints zoom information.
func monitorZoom(drone: Drone) {
    cameraRef = drone.getPeripheral(Peripherals.mainCamera) { camera in
        if let camera = camera {
            if let zoom = camera.zoom {
                let level = zoom.currentLevel
                print("Zoom level \(level)")
                let available = zoom.isAvailable
                print("Zoom isAvailable \(available)")
                let maxSpeed = zoom.maxSpeed.value
                print("Zoom maxSpeed \(maxSpeed) tan(degree)/second")
                let velocityQualityDegradationAllowance = zoom.velocityQualityDegradationAllowance.value
                print("Zoom velocityQualityDegradationAllowance \(velocityQualityDegradationAllowance)")
                let maxLossLessLevel = zoom.maxLossLessLevel
                print("Zoom maxLossLessLevel \(maxLossLessLevel)")
                let maxLossyLevel = zoom.maxLossyLevel
                print("Zoom maxLossyLevel \(maxLossyLevel)")
            } else {
                print("Zoom not supported by camera")
            }
        }
    }
}

Example of output:

Zoom level 1.0
Zoom isAvailable true
Zoom maxSpeed 0.3400000035762787 tan(degree)/second
Zoom velocityQualityDegradationAllowance true
Zoom maxLossLessLevel 1.0
Zoom maxLossyLevel 2.999976396560669

Details:

  • CameraZoom.level is the current zoom level.

  • CameraZoom.isAvailable indicates whether zoom control is available at present. For instance, zoom control may be unavailable temporarily during an animation.

  • CameraZoom.maxLossyLevel is the maximum zoom level supported by the camera.

  • CameraZoom.maxLossLessLevel is the zoom level above which image quality will be degraded.

  • CameraZoom.maxSpeed is used to configure the maximum zoom speed.

  • CameraZoom.velocityQualityDegradationAllowance tells whether zoom level changes using zoom velocity will stop at CameraZoom.maxLossyLevel or at CameraZoom.maxLossLessLevel.

Zoom level can be controlled either by defining a zoom level or by giving a zoom change velocity.

Sample code to control zoom level by defining a zoom level:

/// Sets zoom level.
func setZoomLevel(drone: Drone, level: Double) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        if camera.zoom?.isAvailable == true {
            camera.zoom?.control(mode: .level, target: level)
        } else {
            print("Zoom not available")
        }
    }
}

The zoom level target shall be contained between 1 (means no zoom) and maxLossyLevel.

Sample code to control zoom level by giving a zoom change velocity:

/// Sets zoom velocity.
func setZoomVelocity(camera: MainCamera, velocity: Double) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera) {
        if camera.zoom?.isAvailable == true {
            camera.zoom?.control(mode: .velocity, target: velocity)
        } else {
            print("Zoom not available")
        }
    }
}

The velocity value shall be in range [-1, 1]:

  • -1: the camera zooms out at the speed defined in CameraZoom.maxSpeed.

  • 0: the zoom level does not change.

  • 1: the camera zooms in at the speed defined in CameraZoom.maxSpeed.

Camera 2#

Zoom level is controlled with sub-component Camera2Components.zoom.

Zoom behavior is configured with parameters Camera2Params.zoomMaxSpeed and Camera2Params.zoomVelocityControlQualityMode.

Sample code to monitor video mode:

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

/// Monitors and prints zoom information.
func monitorZoom(drone: Drone) {
    cameraRef = drone.getPeripheral(Peripherals.mainCamera2) { [weak self] camera in

        // get zoom component reference and register listener
        self?.zoomRef = camera?.getComponent(Camera2Components.zoom) { zoom in
            if let zoom = zoom {
                let level = zoom.level
                print("Zoom level \(level)")
                let maxLossLessLevel = zoom.maxLossLessLevel
                print("Zoom maxLossLessLevel \(maxLossLessLevel)")
                let maxLevel = zoom.maxLevel
                print("Zoom maxLevel \(maxLevel)")
            } else {
                print("Zoom unavailable")
            }
        }

        // get zoomMaxSpeed configuration parameter
        if let configParam = camera?.config[Camera2Params.zoomMaxSpeed] {
            if configParam.currentSupportedValues == nil {
                // parameter value is not relevant
                // if there is not supported values in current configuration
                print("zoomMaxSpeed: no supported value in current configuration")
            } else {
                // get parameter value
                let speed = configParam.value
                print("zoomMaxSpeed: \(speed) tan(degree)/second")
            }
        }

        // get zoomVelocityControlQualityMode configuration parameter
        if let configParam = camera?.config[Camera2Params.zoomVelocityControlQualityMode] {
            if configParam.currentSupportedValues.isEmpty {
                // parameter value is not relevant
                // if there is not supported values in current configuration
                print("zoomVelocityControlQualityMode no supported value in current configuration")
            } else {
                // get parameter value
                let mode = configParam.value
                print("zoomVelocityControlQualityMode: \(mode)")
            }
        }
    }
}

Example of output:

Zoom level 1.0
Zoom maxLossLessLevel 1.0
Zoom maxLevel 6.014731352298322
zoomMaxSpeed: 0.0 tan(degree)/second
zoomVelocityControlQualityMode: allowDegrading

Details:

  • Camera2Zoom.level is the current zoom level.

  • Camera2Zoom.maxLevel is the maximum zoom level supported by the camera.

  • Camera2Zoom.maxLossLessLevel is the zoom level above which image quality will be degraded.

  • Camera2Params.zoomMaxSpeed is used to configure the maximum zoom speed.

  • Camera2Params.zoomVelocityControlQualityMode tells whether zoom level changes using zoom velocity will stop at Camera2Zoom.maxLevel or at Camera2Zoom.maxLossLessLevel.

Zoom level can be controlled either by defining a zoom level or by giving a zoom change velocity.

Sample code to control zoom level by defining a zoom level:

/// Sets zoom level.
func setZoomLevel(drone: Drone, level: Double) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // get zoom component
        if let zoom = camera.getComponent(Camera2Components.zoom) {
            zoom.control(mode: .level, target: level)
        } else {
            // zoom component not available at present
            print("Zoom not available")
        }
    }
}

The zoom level target shall be contained between 1 (means no zoom) and Camera2Zoom.maxLevel.

Sample code to control zoom level by giving a zoom change velocity:

/// Sets zoom velocity.
func setZoomVelocity(drone: Drone, velocity: Double) {
    if let camera = drone.getPeripheral(Peripherals.mainCamera2) {
        // get zoom component
        if let zoom = camera.getComponent(Camera2Components.zoom) {
            zoom.control(mode: .velocity, target: velocity)
        } else {
            // zoom component not available at present
            print("Zoom not available")
        }
    }
}

The velocity value shall be in range [-1, 1]:

  • -1: the camera zooms out at the speed defined in Camera2Params.zoomMaxSpeed.

  • 0: the zoom level does not change.

  • 1: the camera zooms in at the speed defined in Camera2Params.zoomMaxSpeed.