World W = GNSS world, ENU (East-North-Up → XYZ); z is up.
Outdoor/Mars truth positions live in a campaign-shared ENU datum, not a per-run takeoff-zeroed frame: p[0] is far from origin (e.g. mars_1 starts ≈ (-865, -463, 16)).
Read the actual start position; never assume p[0] ≈ 0.
Quaternions are (w, x, y, z) in every CSV (verified empirically on mocap: the rigid-body +Z aligns to mocap +Z within 0.7° only under wxyz).
ROS stored (x, y, z, w); the export reorders.
Read positionally.
Notation (matches sensor_calibration.yaml):
R_A_B rotates frame B into A
p_A_B is the A→B translation expressed in A
T_A_B is the homogeneous form
T_cam_px4imu maps PX4-IMU into camera frame
T_cn_cnm1 maps previous- into current-camera (Kalibr)
Ground-truth reference point: the PX4 IMU. ground_truth_* quaternions are PX4-IMU → ENU. Mocap quaternions are tracked-rigid-body → mocap-world — a different point (room-centered) and frame from the ENU truth.
IMU data are body/sensor-frame specific force (m/s²) and angular rate (rad/s).
The ENU [...] label the README.txt prints on IMU streams is a header artifact, not a world-frame claim: at rest the gravity vector sits on a body axis, not [0,0,+9.81].
The RealSense IMU is mounted rotated (~45°), so its rest gravity splits across two axes (T_pximu_rsimu).
Magnetometer vectors are sensor/body-frame and raw (neither intrinsic- nor extrinsic-corrected) on every flight, by design — to enable online self-calibration. The calibration YAMLs ship the corrections separately.
MaRS core state (the maintainers’ estimator): x = [W p_WI, W v_WI, W q_I, b_a, b_ω], 15-element error state, R(q_WI) maps body→world, gravity in world.
each added sensor appends an online extrinsic/calibration block.