IMU Translation Values Always Zero in Recorded Data (ZED X One, SDK 5.0.0)

Hi,

I am currently working with two ZED X One cameras configured in a calibrated stereo rig on an NVIDIA Jetson AGX Orin, using SDK version 5.0.0 (early access). To record IMU data, I used the following C++ code snippet to format and save the output as a CSV file:

// ==== IMU Data Formatter ====
std::string imu_to_csv(const sl::SensorsData::IMUData& imu_data) {
    sl::Orientation q = imu_data.pose.getOrientation();
    sl::Translation t = imu_data.pose.getTranslation();
    auto acc = imu_data.linear_acceleration;
    auto gyro = imu_data.angular_velocity;

    std::ostringstream ss;
    ss << imu_data.timestamp.getNanoseconds() << ","
       << imu_data.is_available << ","
       << std::fixed << std::setprecision(9)
       << q.ox << "," << q.oy << "," << q.oz << "," << q.ow << ","
       << t[0] << "," << t[1] << "," << t[2] << ","
       << acc[0] << "," << acc[1] << "," << acc[2] << ","
       << gyro[0] << "," << gyro[1] << "," << gyro[2] << ","
       << imu_data.effective_rate << "\n";
    return ss.str();
}

However, I noticed that in the generated CSV file, the translation values (tx, ty, tz) are consistently 0, even when the camera is physically moved significantly. Here’s a sample of the recorded output:

timestamp,is_available,qx,qy,qz,qw,tx,ty,tz,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,effective_rate
1745933290523933000,1,0.069895811,-0.039178766,-0.098751634,0.991880834,0.000000000,0.000000000,0.000000000,1.473029375,-9.623333931,-0.462115914,3.564056635,-1.693951368,5.263886452,0.000000000
1745933290526570000,1,0.069826394,-0.039093819,-0.098712586,0.991893053,0.000000000,0.000000000,0.000000000,1.455126405,-9.637645721,-0.437082469,3.316383600,-1.755166411,5.386616707,379.218811035
1745933290529207000,1,0.069750123,-0.038998526,-0.098674379,0.991905928,0.000000000,0.000000000,0.000000000,1.447961330,-9.644816399,-0.429930061,2.851809978,-1.816383839,5.448025227,379.218811035
1745933290532123000,1,0.069658481,-0.038892053,-0.098632753,0.991920710,0.000000000,0.000000000,0.000000000,1.437204123,-9.655594826,-0.426353842,2.387069225,-1.847089767,5.355993271,367.094085693
1745933290535038000,1,0.069560371,-0.038788520,-0.098591186,0.991935849,0.000000000,0.000000000,0.000000000,1.430034637,-9.666366577,-0.422777653,2.015290499,-1.877787232,5.294630051,361.061279297
1745933290537953000,1,0.069458306,-0.038687892,-0.098550886,0.991950870,0.000000000,0.000000000,0.000000000,1.426447272,-9.669962883,-0.422777653,1.767406940,-1.847009778,5.233434677,357.441589355
1745933290540228000,1,0.069374882,-0.038613468,-0.098521084,0.991962612,0.000000000,0.000000000,0.000000000,1.433612347,-9.662794113,-0.429930061,1.488670349,-1.785248876,5.295209885,371.213867188
1745933290542501000,1,0.069289804,-0.038543019,-0.098494656,0.991973877,0.000000000,0.000000000,0.000000000,1.437190056,-9.655630112,-0.437082469,1.240828753,-1.631305695,5.295888424,381.106781006
1745933290544775000,1,0.069201417,-0.038476665,-0.098472923,0.991984785,0.000000000,0.000000000,0.000000000,1.444355130,-9.648461342,-0.444234878,0.993105054,-1.415627599,5.419635296,388.502044678

Although the quaternion values change over time, indicating updates in orientation, the translation values remain zero throughout.

My Questions:

  1. Why are all translation values zero, even though the camera is clearly moving?
  2. In which frame are the translation and orientation values measured or referenced?
    • Are they aligned to a specific frame (e.g., world frame)? If so, what is the definition of this reference frame?
    • Are the rotation and translation values calculated by integrating gyroscope and accelerometer measurements? If so, could you provide the corresponding equation for the integration?
    • Is additional initialization (global localization) or motion tracking configuration required to enable pose estimation?

I appreciate your help and would be grateful for any clarification on this issue.

Hi @syc

The IMU sensor does not provide this information that is normally generated by the Positional Tracking module (Visual Inertial SLAM) of the ZED SDK.
This module is not available with monocular cameras, so this information is not filled.

In the coordinate system that you define in InitParametersOne when you open the camera. See coordinate_system.

No integration is performed; they are direct data readings from the sensor.

Yes, but this is only available for Stereo Cameras.

Thanks for the reply and clarification.

Actually I am using two monocular ZED X One cameras in the calibrated stereo rig. I started data streaming in ZED_Media_Server and used my script to acquire IMU data. Are translation values still unavilable in this case?

Since I used ZED_Media_Server for data streaming, insead of using InitParametersOne I used InitParameters.

sl::InitParameters init_params;
init_params.input.setFromStream("127.0.0.1", port);

I didn’t change the default paramter for coordinate_system_ which is set COORDINATE_SYSTEM::IMGAE. I assume that all rotation values are given in the first image coordinate system. Is it correct?

So rotation values are not integrated by gyroscope measurements. Could you provide me a sight into how the rotation values are calculated by the sensor itself and what about the accuracy?

In this case they are available if the positional tracking module is started.

Yes, this is Z Forward, X right, Y bottom.

This is part of the ZED SDK pipeline. I’m not allowed to disclose this information.