120 FPS camera stuck at 30 FPS
My camera reports that it supports 120 FPS at 320x240, but PhotonVision is maxing out at 30 FPS, even in driver mode. I tried another camera, different model, and that was able to get past 30 FPS, so it seems like an issue with this camera specifically.
Hardware:
- RUBIK Pi 3, powered through USB-C
- ELP-USBFHD01M-L 180
PhotonVision version: dev-v2025.3.2-83-ge84e3e7c
ubuntu@photonvision:~$ v4l2-ctl --list-devices
cam-req-mgr-devnode (no bus info):
/dev/media2
/dev/media3
msm_vidc_media (platform:aa00000.video-codec):
/dev/media1
msm_vidc_decoder (platform:msm_vidc_bus):
/dev/video32
/dev/video33
USB 2.0 Camera: HD USB Camera (usb-0000:01:00.0-2):
/dev/video0
/dev/video1
/dev/media0
ubuntu@photonvision:~$ v4l2-ctl --device /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.008s (120.101 fps)
Size: Discrete 800x600
Interval: Discrete 0.017s (60.000 fps)
Size: Discrete 1280x1024
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 320x240
Interval: Discrete 0.008s (120.101 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 1920x1080
Interval: Discrete 0.167s (6.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.111s (9.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.167s (6.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.050s (20.000 fps)
Size: Discrete 1280x1024
Interval: Discrete 0.167s (6.000 fps)
Size: Discrete 320x240
Interval: Discrete 0.033s (30.000 fps)
Note for other devs: this camera model uses an OV2710 sensor
I think we should give one of the v4l cli tools to make sure the camera will give at least userland frames at full rate and go from there
That screenshot has exposure configured to 300. I believe OmniVision sensors like to do exposure in units of 0.1 ms, and at 300 * 0.1 ms, that's 30 ms of exposure, which is just faster than 30 FPS. Did you ever replicate this in Driver Mode, with a very low exposure? I think you might've, based on the log, but the logs also show a lot of instances of what appears to be non-Driver Mode pipelines, or Driver Mode accidentally using a 30 FPS video mode, and either way, it looked like some of the exposure sets may have failed as well? But that might be something separate to investigate. The logs also contain a lot of messages from the Rubik Pi system, making it hard to parse.