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:
- Why are all translation values zero, even though the camera is clearly moving?
- 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.