Skip to content

Incorrect Linear Velocity RMSE Due to Index-Based Timestamp Alignment #4

Description

@MichaelMarav

First of all, thank you for your work on this repository. It is extremely helpful for benchmarking proprioceptive state estimators and obtaining quantitative performance comparisons.

I noticed a potential issue in the linear velocity RMSE computation in compute_vel_rmse.py.

Issue description

The script defines the following candidate timestamp columns:

TIME_CANDIDATES = ("t", "time", "timestamp", "stamp")

It then selects the first matching column using:

time_col = next((c for c in TIME_CANDIDATES if c in headers), None)

When none of the available column names are included in TIME_CANDIDATES, time_col is silently set to None.

However, the generated fused_state.csv files use the following columns:

t_rel t_abs px py pz vx vy vz qw qx qy qz

Since neither t_rel nor t_abs is included in TIME_CANDIDATES, the estimator and ground-truth velocities are not aligned by timestamp. Instead, the script silently falls back to row-index alignment.

This is reflected in the output:

MUSE:
  aligned by    : index
  frame align   : applied R_est_to_gt
  samples       : 104601
  RMSE vx [m/s] : 0.529185
  RMSE vy [m/s] : 0.661118
  RMSE vz [m/s] : 0.224765
  RMSE |v| [m/s]: 0.876147

The estimator runs at the IMU rate of approximately 400 Hz, while the ground truth is sampled at approximately 200 Hz. Therefore, matching the two trajectories by row index does not compare measurements taken at the same time and leads to an incorrect velocity RMSE.

When the estimator timestamps are taken from t_abs and the ground-truth velocity is interpolated at the estimator timestamps, the results become:

MUSE:
  aligned by    : timestamp interpolation (GT -> EST)
  frame align   : applied R_est_to_gt
  samples       : 207591
  RMSE vx [m/s] : 0.050812
  RMSE vy [m/s] : 0.058700
  RMSE vz [m/s] : 0.035221
  RMSE |v| [m/s]: 0.085253

Suggested fix

A minimal fix would be to include t_abs in the candidate timestamp columns, preferably with higher priority:

TIME_CANDIDATES = ("t_abs", "t", "time", "timestamp", "stamp")

Additionally, rather than requiring exact timestamp matches or silently falling back to index-based pairing, the ground-truth velocity should be interpolated at the estimator timestamps over their common time interval.

It may also be preferable to raise a warning or an exception when no valid timestamp column is found.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions