Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get gain control returns a null pointer for a switchable camera #764

Closed
trc492 opened this issue Oct 11, 2023 · 4 comments
Closed

Get gain control returns a null pointer for a switchable camera #764

trc492 opened this issue Oct 11, 2023 · 4 comments
Assignees

Comments

@trc492
Copy link

trc492 commented Oct 11, 2023

The following code caused a NullPointerException because gainControl was null, so I had to add code to test for null before using it.

    /**
     * This method returns the camera min and max gain setting.
     *
     * @return array containing min and max gain values, null if unsuccessful.
     */
    public int[] getGainSetting()
    {
        int[] gains = null;

        if (visionPortal.getCameraState() == VisionPortal.CameraState.STREAMING)
        {
            GainControl gainControl = visionPortal.getCameraControl(GainControl.class);

            if (gainControl != null)
            {
                gains = new int[2];
                gains[0] = gainControl.getMinGain();
                gains[1] = gainControl.getMaxGain();
            }
            // TODO: Figure out why gainControl is NULL?!
        }

        return gains;
    }
@Windwoes
Copy link
Member

It looks like switchable cameras are not currently set up to support controls besides focus and exposure.

From RefCountedSwitchableCameraImpl

    @Override protected void constructControls()
        {
        delegatingCameraControls.add(new SwitchableFocusControl(this));
        delegatingCameraControls.add(new SwitchableExposureControl(this));
        }

@lizlooney lizlooney self-assigned this Oct 13, 2023
@ftc19743
Copy link

ftc19743 commented Nov 28, 2023

We are seeing multiple related issues while utilizing 3 Logitech 270s:

  • Attempts to set up each on their own VisionPortal hang indefinitely during the build process (drove us to switchableCamera) CORRECTION: This works (see note below from Westside robotics), we fell into the same trap of not setting up a multiPortal first as others have.
  • Inability to set gain on switchableCameras makes fine tuning exposure rates for AprilTags problematic (noted above)
  • Setting exposure on the current camera sets the exposure on all the cameras (was this intended behavior?)
  • Setting exposure ExposureControl.Mode back to Auto appears to have no effect on any of the cams.
   public void setAutoExposure() {
        // Wait for the camera to be STREAMING to use CameraControls (FTC SDK requirement)
        if (visionPortal.getCameraState() != VisionPortal.CameraState.STREAMING) {
            while (visionPortal.getCameraState() != VisionPortal.CameraState.STREAMING) {
                teamUtil.pause(20);
            }
        }
        ExposureControl exposureControl = visionPortal.getCameraControl(ExposureControl.class);
        if (exposureControl==null) {
            teamUtil.log("Failed to get ExposureControl object");
            return;
        }
        if (exposureControl.getMode() != ExposureControl.Mode.Auto) {
            exposureControl.setMode(ExposureControl.Mode.Auto);
            teamUtil.pause(50);
        }
    }

@WestsideRobotics
Copy link
Collaborator

WestsideRobotics commented Dec 1, 2023

We are seeing multiple related issues while utilizing 3 Logitech 270s:
Attempts to set up each on their own VisionPortal hang indefinitely during the build process (drove us to switchableCamera)

The MultiPortal feature of the FTC VisionPortal does handle three portals normally.

To verify this, I started with the two-portal sample OpMode described here, and simply added a third instance of key variables and methods.

Here's the RC LiveView, courtesy of scrcpy:

3xMultiPortal LiveView

And here is the corresponding DS telemetry (merged three screenshots to list it all):

DH 3x telemetry all

To help manage resources, this sample uses the compressed MJPEG format and a lower webcam resolution of 320x240. The sample ran well, without needing to disable any streams (gamepad toggles in this OpMode).

The sample continued to run well, even after allowing the default 640x480 resolutions. The above images use 640x480, thus giving usable pose results (for the 2 calibrated webcams). Naturally a competition scenario might require tighter controls including stream toggling.

Camera controls, including gain and exposure, should be available on each portal.

Note the calibration warning (red text), as one of the webcams was a Logitech QuickCam Pro 5000 for which the FTC SDK does not provide lens intrinsics. The other two webcams were Logitech C270 and Logitech C920. One was plugged into the Control Hub's USB 2.0 port, and the other 2 shared a powered USB hub in the 3.0 port.

The FTC Blocks code is posted here, with image below (expand in new browser tab):

W_3xMultiPortal_v01

Java users can study the Blocks code, and easily follow along in OnBot Java or Android Studio.

============

All of this is not intended to diminish the valid points here about gain and exposure control under switchableCamera. Just wanted to demonstrate that "MultiPortal" does fundamentally perform as expected. Big points for robustness to developer @Windwoes.

@lizlooney lizlooney changed the title Get gain control returns a null pointer Get gain control returns a null pointer for a switchable camera Mar 24, 2024
@Windwoes
Copy link
Member

This was fixed in v9.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants