Outputs

This page records the output artifacts written by the app during a normal run.

Each successful run writes:

Both files are written under output/.

output/gps.json

This file records the synthetic GPS data generated and used during the run.

It gives users a direct view of the GPS stream used by initialization and update.

Minimal example:

[
  {
    "utime": 1700000000000000,
    "pos": [122.6922507841072, -45.019789916419654]
  }
]

Fields:

  • utime: GPS sample timestamp in microseconds
  • pos[0]: global x position in meters
  • pos[1]: global y position in meters

Notes:

  • pos has length 2

output/eskf_sim_log.csv

The log stores one row per GPS update time.

CSV columns

The log header is:

utime,est_x,est_y,est_z,gps_x,gps_y,true_x,true_y,innov_x,innov_y,nis,err_x,err_y,err_norm

The columns mean:

  • utime: GPS update timestamp in microseconds
  • est_x, est_y, est_z: estimated position after the GPS update
  • gps_x, gps_y: GPS-like measurement used in that update
  • true_x, true_y: pose-truth position at the same timestamp
  • innov_x, innov_y: horizontal innovation returned by the update step
  • nis: normalized innovation squared for that update
  • err_x, err_y: horizontal estimator error relative to pose truth
  • err_norm: horizontal error norm

The file uses high floating-point precision so the logged values remain useful for checks or plotting.

RMSE reporting

The app also reports two horizontal RMSE values on stdout after a successful run:

  • raw GPS RMSE against pose truth
  • ESKF RMSE against pose truth

Both are computed over the GPS update times:

\[ \operatorname{RMSE}_{xy} = \sqrt{\frac{1}{N} \sum_{k=1}^{N} \left(dx_k^2 + dy_k^2\right)} \]

where:

  • for raw GPS RMSE, \(dx_k, dy_k\) come from the GPS-like sample minus pose truth
  • for ESKF RMSE, \(dx_k, dy_k\) come from the estimated position minus pose truth

The app also reports:

  • the number of GPS updates processed
  • the path of the written log file