Outputs
This page records the output artifacts written by the app during a normal run.
Each successful run writes:
output/gps.jsonoutput/eskf_sim_log.csv
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 microsecondspos[0]: global x position in meterspos[1]: global y position in meters
Notes:
poshas 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 microsecondsest_x,est_y,est_z: estimated position after the GPS updategps_x,gps_y: GPS-like measurement used in that updatetrue_x,true_y: pose-truth position at the same timestampinnov_x,innov_y: horizontal innovation returned by the update stepnis: normalized innovation squared for that updateerr_x,err_y: horizontal estimator error relative to pose trutherr_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