ZED VIO outputs all zeros

Hello,

I am using a ZED 2i camera with ZED SDK 5.1 and ROS 2 on a Jetson AGX Orin. I am observing the /zed/odom topic and occasionally see failures where the odometry runs correctly for some time, then suddenly starts outputting a position of (0, 0, 0) and an orientation quaternion of (0, 0, 0, 1).

There are no warnings or error messages when this occurs, and I haven’t been able to identify any external or environmental trigger. I have attempted to reset the odometry using /zed/reset_odometry/request, but this does not resolve the issue. Restarting the SDK is the only way I’ve found to recover normal behavior.

Do you have any advice on how to avoid or fix this behavior?

Hello,

Thanks for your question.

From the information, I’m gathering, it seems the parameter reset_odom_with_loop_closure is activated within your ROS2 wrapper parameter configuration. This triggers the behavior to automatically reset the odometry whenever a loop closure is detected. Setting it to false should prevent this behavior.

Thanks,

Stereolabs Support

Hello,

Thank you for the response! I already have the reset_odom_with_loop_closure parameter set to False in my ROS2 wrapper. I think there is a different issue, because when the odometry gets reset to zero, it stays at exactly zero in each message even when the camera continues moving.

Thanks,
Ana

Hi Ana,

Thanks for your feedback. Are you able to share with me your current SDK version and exact Yaml file configuration you’re using for ROS wrapper ? Odometry should not remain at zero when the camera continues moving indeed.

Thanks,

Stereolabs Support

Hello,

I am using ZED SDK 5.1.0 (from here: https://stereolabs.sfo2.cdn.digitaloceanspaces.com/zedsdk/5.1/ZED_SDK_Tegra_L4T36.4_v5.1.0.zstd.run).

Here is the ROS wrapper configuration I’m using:

=== ZED Configuration ===

General Settings:
  Camera Model: zed2i
  Capture FPS: 30
  Capture Resolution: 720p
  Retrieve FPS: auto (30.000000)
  Retrieve Resolution: auto (720p)
  Retrieve Frame Skip: 1
ROS Output Settings (2 outputs):
  Output 0:
    Resolution: 360p
    FPS: 30
    Depth: true
    Topic Suffix: (none)
    Frame Skip: 1
    Dimensions: 640x360
  Output 1:
    Resolution: 720p
    FPS: 15
    Depth: false
    Topic Suffix: 720p
    Frame Skip: 2
    Dimensions: 1280x720
GStreamer Settings:
  Enable GStreamer: true
  GStreamer Resolution: 720p
  GStreamer FPS: 30
  GStreamer Frame Skip: 1
  GStreamer Output Dimensions: 1280x720
  Gstreamer Image: both
  Gstreamer Encoder: nvv4l2h264enc
Shared Memory Settings:
  Enable Shared Memory: true
  Shared Memory Resolution: 720p
  Shared Memory FPS: 30
  Shared Memory Frame Skip: 1
  Shared Memory Output Dimensions: 1280x720
Depth Settings:
  Depth Enable: true
  Depth Mode: NEURAL
  Min Depth: 0.3
  Max Depth: 6
  Depth FPS: 30.000000
  Depth Resolution: 360p
  Depth Frame Skip: 1
  Depth Stabilization: 30
  Remove Saturated Areas: false
  Pointcloud Publishing: true
VIO (Visual-Inertial Odometry):
  Enable: true
  Area Memory: false
IMU Settings:
  Sync with Camera: true
  IMU Frequency: Auto (camera FPS)
Quality Settings:
  Confidence Threshold: 50
  Texture Confidence Threshold: 100
Timestamp Settings:
  Timestamp Offset (ms): 0

Because vio.area_memory is set to false, VIO shouldn’t be finding any loop closures.

Thanks,
Ana

Hi Ana,

Thanks for sharing this information.

The configuration you’ve provided does not appear to come from our official ROS2 wrapper. Unfortunately, I’m unable to provide direct support for a custom wrapper, since I don’t have visibility on how it is using our SDK and different services it enables.

To help us better support you, would it be possible for you to use our official ROS2 wrapper and see if that solves your issue ? The wrapper can be found on here: https://github.com/stereolabs/zed-ros2-wrapper.

Best,

Stereolabs Support