Zed X IMU odr issues

Hi,

I’ve been collecting some camera + IMU data on the Zed X and I noticed I am getting ~186Hz against the advertised 400Hz. I am using your APIs directly, no ROS. But, as the ROS2 implementation, I have two separate threads for getting camera images and sensors data. I tried on two different Zed X cameras and I get the same outcome. I’ve been using the Zed Box Orin mini NX 16gb.

I also get ~190Hz when dumping data with your Zed Sensor Viewer, although I am selecting 400Hz in the settings.

Lastly, the only setup where I can actually get ~400Hz is through Zed Explorer saving data into an .svo2

Moreover, I noticed that I am getting kind of two rate distributions in the data I collect. Here I am plotting the period between IMU samples. This is also visible in the data I collect using the Zed Explorer, or the sensor viewer. The only setup without this two distributions is using the Zed Explorer with 1080p 15Hz cameras.

I would like to know why I am able to get the desired frequency through the explorer but not through other tools and through the APIs, and why the odr is so unstable with seemingly two distributions and with big spikes. Is there any fundamental difference in how the data is collected when using the different tools and APIs? Is the Zed Box Mini not keeping up with the data coming from the camera?

Thanks,

Marco

Hi @picci,

Welcome to the forums :waving_hand:

We’ve recently released the ZED SDK 5.2 and ZED X Driver 1.4, which come with improvements in IMU stability where the IMU rate spread improved from ~11 Hz (185–197 Hz) to < 1 Hz (199.5–200 Hz) and fixed data drop issues in complex setups involving 8+ IMUs.

You can find both releases and changelogs here:

However, in order to support multi-camera setups, we have reduced the rate from 400Hz to 200Hz on all cameras. As 400Hz IMU has an impact on the overall performance, we are investigating to add a mode when using a reduced number of cameras.

Hi @mattrouss ,

I updated to 5.2 and updated the drivers too, and I am getting weird results:

  • APIs are recording the IMU at ~125Hz regardless of the camera res
  • ZED Explorer records an .svo with IMU at ~90Hz
  • ZED Sensor Viewer recorded ~199Hz

Hi @picci,

Sorry for the late reply, we’re taking a look at this internally to reproduce

We’re seeing the same issue on our setup — 3× ZED-X cameras on a Jetson AGX Orin (L4T R36.4.4), running ZED SDK 5.2.1 + ZED X Driver 1.4.0.

After adding deduplication to our getSensorsData(TIME_REFERENCE::CURRENT) polling loop (filtering out repeated samples with the same timestamp), the actual unique IMU sample rates we
observe are:

  • Camera 0: ~129 Hz
  • Camera 1: ~138 Hz
  • Camera 2: ~130 Hz

This is consistent with @picci’s observation of ~125 Hz via the APIs after the 5.2 update. The rate varies per camera, suggesting the issue may be related to GMSL2 deserialization
scheduling rather than the IMU hardware itself.

Our polling thread runs at ~400 Hz (well above the 200 Hz target), so we’re confident we’re not missing samples due to insufficient polling frequency. Before the dedup fix, the raw
callback rate appeared higher since getSensorsData returns the same sample multiple times between updates.

Environment:

  • ZED SDK: 5.2.1
  • ZED X Driver: 1.4.0 (stereolabs-zedlink-quad)
  • L4T: R36.4.4 (JetPack 6.2)
  • Hardware: Jetson AGX Orin, 3× ZED-X Mini via GMSL2
  • Polling method: getSensorsData(TIME_REFERENCE::CURRENT) in a dedicated SCHED_FIFO thread

Would be great to hear if there’s a timeline for getting closer to the 200 Hz target with multi-camera setups.

Hi @dieng-calder ,

To be sure we can reproduce the same issues, can you confirm that you have the same performance using the following script?

zed_svo_diagnostic.zip (5.3 KB)

Thanks for the diagnostic tool and suggestions! We ran extensive testing on our 4-camera ZED-X setup (Jetson Orin, ZED SDK 5.x) and found the root cause of our IMU rate issues.

Root Cause

Our capture pipeline was using getSensorsData(sl::TIME_REFERENCE::CURRENT) in a dedicated polling thread running at ~400 Hz. Under multi-camera CPU load, this polling thread
couldn’t keep up and only retrieved the latest IMU sample each call, losing ~30% of data:

Config Observed IMU Rate Expected Loss
1 camera ~195 Hz 200 Hz ~2%
3 cameras 130-138 Hz 200 Hz ~30%
4 cameras 130-135 Hz 200 Hz ~33%

Fix: getSensorsDataBatch()

Switching to getSensorsDataBatch() called inline after each grab() in the capture loop completely resolved the issue. This API returns all IMU samples accumulated since the
last grab() (~6-7 samples per frame at 200 Hz / 30 fps), which is the same mechanism the SDK uses internally for SVO recording.

Results after fix:

Config IMU Rate Image Rate IMU/Frame Loss
3 cameras 200-207 Hz 30.0 fps 6-7 0%
4 cameras 200-207 Hz 30.0 fps 6-7 0%

SVO Recording Validation

We also validated using your svo_diagnostic tool that SVO recordings capture the full 200 Hz IMU rate even under 4-camera load. The SVO encoder itself doesn’t drop IMU data — it
uses the batch mechanism internally.

Key Takeaway

getSensorsData(TIME_REFERENCE::CURRENT) should not be used for high-frequency IMU capture in multi-camera setups. It only returns the single latest sample and is subject to
thread scheduling jitter. getSensorsDataBatch() is the correct API for reliable IMU data retrieval.

It would be helpful if the SDK documentation more prominently recommended getSensorsDataBatch() for multi-camera or high-throughput use cases, as getSensorsData appears to be the
“default” API in most examples.

Hi @dieng-calder,

Thank you for the feedback. The recommendation would indeed be either to use getSensorsDataBatch(), which provides the batch of IMU data retrieved since the latest grab(), or to retrieve all of the IMU data in a separate thread than the grab() thread, at a higher rate (i.e. 200Hz for the ZED X).

We will update our samples to reflect this better.

I’ll make sure to use getSensorsDataBatch too. Thanks!

Following up on the new API. I get a steady ~200 Hz now with no big gaps between measurements. Many thanks!

I noticed, however, this weird drop at a steady rate. Have you experienced this too?

Hi @picci,

This is indeed a behavior that is known, and due to the updated algorithm in 1.4.0 that tracks the drift between the host Jetson’s clock and the IMU’s internal clock. Unfortunately, to fix this behavior this would require a hardware change to the camera, which we are preparing for our future camera line.

Fair enough. Looking forward to the new cameras then!