# numbers_log for 010-unit10-perception (rerun 2026-10-11 03:16)

===== fig01_gauss_bayes.py (exit 0, 0.9 s)
within 1 sigma: measured 0.6868 ; erf formula 0.6827
within 2 sigma: measured 0.9562 ; erf formula 0.9545
within 3 sigma: measured 0.9968 ; erf formula 0.9973
sample mean error (mm): -0.109  sample std (mm): 9.985  std of the mean (mm): 1.0
after 0 positive readings: P(dry) = 0.0500
after 1 positive readings: P(dry) = 0.3719
after 2 positive readings: P(dry) = 0.8695
after 3 positive readings: P(dry) = 0.9868
after 4 positive readings: P(dry) = 0.9988
one positive: 0.3719 ; false alarms among positives: 0.6281
prior 0.01: posterior after one positive = 0.1020
prior 0.05: posterior after one positive = 0.3719
prior 0.2: posterior after one positive = 0.7377
prior 0.5: posterior after one positive = 0.9184

===== fig02_histogram.py (exit 0, 1.5 s)
sensing # 1: P(peak is the true cell) = 0.092   mean probability on true cell = 0.080   mean entropy = 3.842 bits
sensing # 2: P(peak is the true cell) = 0.130   mean probability on true cell = 0.107   mean entropy = 3.495 bits
sensing # 3: P(peak is the true cell) = 0.200   mean probability on true cell = 0.141   mean entropy = 3.221 bits
sensing # 4: P(peak is the true cell) = 0.245   mean probability on true cell = 0.170   mean entropy = 3.003 bits
sensing # 5: P(peak is the true cell) = 0.300   mean probability on true cell = 0.210   mean entropy = 2.786 bits
sensing # 6: P(peak is the true cell) = 0.385   mean probability on true cell = 0.265   mean entropy = 2.594 bits
sensing # 7: P(peak is the true cell) = 0.450   mean probability on true cell = 0.321   mean entropy = 2.418 bits
sensing # 8: P(peak is the true cell) = 0.455   mean probability on true cell = 0.347   mean entropy = 2.209 bits
sensing # 9: P(peak is the true cell) = 0.497   mean probability on true cell = 0.387   mean entropy = 2.078 bits
sensing #10: P(peak is the true cell) = 0.520   mean probability on true cell = 0.415   mean entropy = 1.965 bits
sensing #11: P(peak is the true cell) = 0.580   mean probability on true cell = 0.461   mean entropy = 1.822 bits
sensing #12: P(peak is the true cell) = 0.615   mean probability on true cell = 0.493   mean entropy = 1.731 bits
sensing #13: P(peak is the true cell) = 0.640   mean probability on true cell = 0.519   mean entropy = 1.621 bits
sensing #14: P(peak is the true cell) = 0.662   mean probability on true cell = 0.537   mean entropy = 1.582 bits
uniform start: P(peak) = 1/20 = 0.05, entropy 4.322 bits ; runs: 400
snapshot run: seed 273 chosen because its probability on the true cell after 10 readings 0.319 is closest to the median 0.325 of 400 runs
after sensing #1 (read wall) : true cell 2 peak 1 p(true) 0.073
after sensing #3 (read door) : true cell 3 peak 9 p(true) 0.087
after sensing #6 (read wall) : true cell 6 peak 19 p(true) 0.211
after sensing #10 (read door) : true cell 10 peak 10 p(true) 0.319

===== fig03_kalman1d.py (exit 0, 1.3 s)
steady-state gain 0.09512  prior variance P- 0.001051  posterior P 0.000951  (std 0.0308); raw std 0.100
RMSE after sample 100 (mean of 200 runs): raw       0.0997
RMSE after sample 100 (mean of 200 runs): kf        0.0302
RMSE after sample 100 (mean of 200 runs): ema_kinf  0.0302
RMSE after sample 100 (mean of 200 runs): ema_0.5   0.0576
RMSE after sample 100 (mean of 200 runs): ema_0.02  0.0481
gain at samples 1, 2, 5, 10, 50, 399: [0.9901, 0.5, 0.2114, 0.1264, 0.0951, 0.0951]
coverage: fraction of samples after 100 with |error| < 2 sigma_P (200 runs): 0.957

===== fig04_range_cv.py (exit 0, 1.7 s)
true range 0.5 m: reported-minus-true at 0 degC 1.8 cm, at 35 degC -1.2 cm
true range 2.0 m: reported-minus-true at 0 degC 7.2 cm, at 35 degC -4.9 cm
true range 4.0 m: reported-minus-true at 0 degC 14.4 cm, at 35 degC -9.9 cm
speed of sound at 0 degC: 331.30 m/s
speed of sound at 10 degC: 337.31 m/s
speed of sound at 20 degC: 343.21 m/s
speed of sound at 30 degC: 349.02 m/s
speed of sound at 40 degC: 354.73 m/s
relative range error per degC near 20 degC: 0.1704 percent
naive speed from differencing: std 0.145 m/s (theory sqrt2 sigma/dt = 0.141); Kalman speed error after 5 s: rms 0.0201 m/s
steady state (Riccati): position std 0.697 cm ; velocity std 0.0356 m/s ; gains [0.4861 1.603 ]
raw position error std (cm) 1.0  Kalman position rms error after 5 s (cm) 0.645
300 runs after 5 s: speed rms error 0.0192 m/s ; position rms error 0.635 cm (the filter assumes acceleration noise 0.05, the true motion has none, so its reported 0.0356 m/s is conservative)

===== fig05_ekf_patrol.py (exit 0, 36.3 s)
odom : reached x = 5.52 m, true y = 1.401 m, estimate-vs-truth error 0.905 m, crashed into the wall: True, minimum wall gap -0.1 cm
gyro : reached x = 20.00 m, true y = -0.949 m, estimate-vs-truth error 1.474 m, crashed into the wall: False, minimum wall gap 89.2 cm
ekf  : reached x = 20.00 m, true y = 0.516 m, estimate-vs-truth error 0.053 m, crashed into the wall: False, minimum wall gap 87.5 cm
odom : final estimate-minus-truth: dx 8.6 cm, dy -90.1 cm, dtheta -15.76 deg
gyro : final estimate-minus-truth: dx 2.4 cm, dy 147.4 cm, dtheta 8.47 deg
ekf  : final estimate-minus-truth: dx -5.3 cm, dy 0.6 cm, dtheta 0.22 deg
EKF final sigma (x, y, theta): [1.34 0.34] cm 0.143 deg
EKF gyro-bias estimate at 20 m over 20 runs: mean 0.00354 rad/s, std 0.00018 (true 0.0035)
Unit 8 open-loop 20 m, 0.5% radius error, no slip: odometry error 6.188 m
odom : 60 runs, final error median 0.902 m, mean 0.902, 90th percentile 0.903 m ; crashes 60/60
gyro : 60 runs, final error median 1.389 m, mean 1.392, 90th percentile 1.492 m ; crashes 0/60
ekf  : 60 runs, final error median 0.050 m, mean 0.049, 90th percentile 0.056 m ; crashes 0/60
EKF lateral error std over runs: 0.003 m ; mean reported sigma_y: 0.0034 m
R5 limit (10 percent of 20 m): 2.0 m
wall range every  0.2 s: median final error 0.048 m, crashes 0/20
wall range every  1.0 s: median final error 0.050 m, crashes 0/20
wall range every  5.0 s: median final error 0.053 m, crashes 0/20
wall range every 20.0 s: median final error 0.060 m, crashes 0/20

===== fig06_grid.py (exit 0, 5.5 s)
340 scans, path length 13.45 m; final pose error of the odometry: 0.918 m, heading 21.82 deg
true occupied cells: 899
true pose        : true cells recovered within 1 cell 0.711; spurious occupied cells (more than 1 cell from truth) 0; occupied cells 583; accuracy on known cells 0.994; known fraction 0.954
EKF-quality pose : true cells recovered within 1 cell 0.747; spurious occupied cells (more than 1 cell from truth) 0; occupied cells 674; accuracy on known cells 0.987; known fraction 0.955
encoder odometry : true cells recovered within 1 cell 0.239; spurious occupied cells (more than 1 cell from truth) 236; occupied cells 429; accuracy on known cells 0.922; known fraction 0.903
