GNSS Ingest Error: "GNSS DATA COVARIANCE MUST VARY" on Jetson Orin with SDK 5.0

Dear Stereolabs Support Team,

I am currently working on GNSS-based global localization using ZED SDK 5.0 on a Jetson AGX Orin running JetPack 6.2. I’m feeding GNSS data obtained via GPSD into the SDK for fusion.

Although the GNSS data is accurate, I consistently encounter the following error: Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY

I verified that the covariance values are non-zero and added noise to the covariance fields as recommended in the latest ZED SDK global localization samples. Despite that, the error persists.

To help debug this, I modified my GPSDReader::grabGNSSData() function to print detailed GNSS output.

        std::cout << "currnt_gnss_data: " << current_gnss_data.latitude_std << ", " << current_gnss_data.longitude_std << ", " << current_gnss_data.altitude_std << std::endl;
        std::cout << "currnt_gnss_data: " << current_gnss_data.position_covariance[0] << ", " << current_gnss_data.position_covariance[1] << ", " << current_gnss_data.position_covariance[2] << std::endl;
        std::cout << "currnt_gnss_data: " << current_gnss_data.position_covariance[3] << ", " << current_gnss_data.position_covariance[4] << ", " << current_gnss_data.position_covariance[5] << std::endl;
        std::cout << "currnt_gnss_data: " << current_gnss_data.position_covariance[6] << ", " << current_gnss_data.position_covariance[7] << ", " << current_gnss_data.position_covariance[8] << std::endl;
        std::cout << "currnt_gnss_data: " << current_gnss_data.ts.getMicroseconds() << std::endl;
        std::cout << "currnt_gnss_data: " << current_gnss_data.gnss_status << ", " << current_gnss_data.gnss_mode << std::endl;

The logs look like this:

currnt_gnss_data: DGNSS, FIX_3D
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.113569, 0, 0
currnt_gnss_data: 0, 0.113569, 0
currnt_gnss_data: 0, 0, 0.253009
currnt_gnss_data: 1747034141000000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.114244, 0, 0
currnt_gnss_data: 0, 0.114244, 0
currnt_gnss_data: 0, 0, 0.255025
currnt_gnss_data: 1747034141200000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.114921, 0, 0
currnt_gnss_data: 0, 0.114921, 0
currnt_gnss_data: 0, 0, 0.256036
currnt_gnss_data: 1747034141400000
currnt_gnss_data: DGNSS, FIX_3D
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.114921, 0, 0
currnt_gnss_data: 0, 0.114921, 0
currnt_gnss_data: 0, 0, 0.256036
currnt_gnss_data: 1747034141400000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.114921, 0, 0
currnt_gnss_data: 0, 0.114921, 0
currnt_gnss_data: 0, 0, 0.257049
currnt_gnss_data: 1747034141600000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.114921, 0, 0
currnt_gnss_data: 0, 0.114921, 0
currnt_gnss_data: 0, 0, 0.258064
currnt_gnss_data: 1747034141800000
currnt_gnss_data: DGNSS, FIX_3D
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.114921, 0, 0
currnt_gnss_data: 0, 0.114921, 0
currnt_gnss_data: 0, 0, 0.258064
currnt_gnss_data: 1747034141800000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.1156, 0, 0
currnt_gnss_data: 0, 0.1156, 0
currnt_gnss_data: 0, 0, 0.259081
currnt_gnss_data: 1747034142000000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.116281, 0, 0
currnt_gnss_data: 0, 0.116281, 0
currnt_gnss_data: 0, 0, 0.2601
currnt_gnss_data: 1747034142200000
currnt_gnss_data: DGNSS, FIX_3D
currnt_gnss_data: 0.001, 0.001, 1
currnt_gnss_data: 0.116281, 0, 0
currnt_gnss_data: 0, 0.116281, 0
currnt_gnss_data: 0, 0, 0.2601
currnt_gnss_data: 1747034142200000
currnt_gnss_data: DGNSS, FIX_3D
Ingest error occurred when ingesting GNSSData: GNSS DATA COVARIANCE MUST VARY


Additionally, I attempted GNSS fusion via the ZED ROS2 wrapper, enabling GNSS fusion in the config file, but encountered the same issue. That’s why I’m now trying to run it outside of ROS entirely.

Is there a specific requirement for covariance variation that I might be missing?
How can I correctly feed GNSS data into the SDK to avoid this ingest error?

My goal is to enhance visual SLAM performance by incorporating GNSS fusion, and any help resolving this would be greatly appreciated.

Best regards,
whypushhh

Did you read the documentation to correctly configure the GNSS fusion module: Global Localization Overview - Stereolabs
In particular this point.

Hello @whypushhh,

Would it be possible to share the SVO2 file along with the GNSS data contained within it? This would help us reproduce the issue. Although the warning may seem alarming, please note that it is just a warning. The GNSS data is still being ingested even if the SDK displays this warning.

Best regards,
Tanguy

I was working with the ZED SDK code and then tried GNSS fusion using the ZED ROS2 wrapper. I kept getting covariance errors, and after checking the code, I found that the covariance in /zed/zed_node/pose/origin_fix was hardcoded to -1. At first, I thought the issue was with my GPS.

Also, the log kept showing “calibration in progress” and the covariance error continued, so I suspected something was wrong. After checking the code, I realized that once calibration is complete, there’s no log message indicating that it’s successful. Even with debug mode set to True, there was no log showing that calibration was complete. I ended up modifying the code myself to confirm when calibration was actually done.

In the end, it seems like the fusion is working well. I think it would be helpful if a message confirming that calibration is complete was shown in debug mode. Thanks!

This information is available by subscribing to the geo_pose/status topic or by monitoring the Diagnostic Status of the node by using the rqt plugin Runtime Monitor.

In any case, if you think that your modification is valuable, please do not hesitate to create a Pull Request to integrate it into our code.