diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/GenericUSBCameraSettables.java b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/GenericUSBCameraSettables.java index 7d956643e4..f6ee0ecd01 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/GenericUSBCameraSettables.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/GenericUSBCameraSettables.java @@ -167,7 +167,27 @@ public void setAutoWhiteBalance(boolean autoWB) { } } + @Override public void setAutoExposure(boolean cameraAutoExposure) { + if (configuration.cameraQuirks.hasQuirk(CameraQuirk.ArduOV9281Controls) + && !cameraAutoExposure) { + // OV9281 on Linux seems to sometimes ignore our exposure requests on first boot if we're in + // manual mode. Poking the camera into and out of auto exposure seems to fix it. + try { + setAutoExposureImpl(false); + Thread.sleep(2000); + setAutoExposureImpl(true); + Thread.sleep(2000); + setAutoExposureImpl(false); + } catch (InterruptedException e) { + logger.error("Thread interrupted while setting OV9281 exposure!", e); + } + } else { + setAutoExposureImpl(cameraAutoExposure); + } + } + + public void setAutoExposureImpl(boolean cameraAutoExposure) { logger.debug("Setting auto exposure to " + cameraAutoExposure); if (!cameraAutoExposure) { diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java index e0843e3919..b57b01d969 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java @@ -465,13 +465,13 @@ boolean setPipeline(int index) { pipelineSettings.cameraExposureRaw = 10; // reasonable default } - settables.setExposureRaw(pipelineSettings.cameraExposureRaw); try { settables.setAutoExposure(pipelineSettings.cameraAutoExposure); } catch (VideoException e) { logger.error("Unable to set camera auto exposure!"); logger.error(e.toString()); } + settables.setExposureRaw(pipelineSettings.cameraExposureRaw); if (cameraQuirks.hasQuirk(CameraQuirk.Gain)) { // If the gain is disabled for some reason, re-enable it if (pipelineSettings.cameraGain == -1) pipelineSettings.cameraGain = 75;