# numbers_log for 011-unit11-planning (rerun 2026-10-11 03:17)

===== fig01_search.py (exit 0, 19.1 s)
grid (120, 200) cells 24000 free after inflation 16396 start (11, 11) goal (100, 120)
BFS (8-connected): 158 steps, metric length 8.728 m, expanded 12255, 49.9 ms
Dijkstra: length 8.728 m, expanded 12760, 59.5 ms
A* octile: length 8.728 m, expanded 5627, 31.7 ms ; ratio of expansions Dijkstra/A* = 2.27
A* euclid: length 8.728 m, expanded 6843
weighted A* w=3: length 8.936 m (ratio 1.0237), expanded 3280
4-connected Dijkstra: length 9.900 m (Manhattan metric, steps cost 1)
150 random start-goal pairs: BFS metric length / optimal: mean 1.0001, max 1.0077, pairs where BFS is longer: 1
networkx shortest path: 8.728 m ; A* and Dijkstra agree: True

===== fig02_inflation.py (exit 0, 1.2 s)
rover circle radius 0.13 m; the gap between bed 2 and the crate is 0.20 m wide (needs 2 x radius = 0.26 m)
largest clearance (distance to the nearest obstacle cell centre) in the middle of the gap: 0.1 m
inflation 0 m: A* length 4.781 m, sample points where the rover's disc hits an obstacle: 37 of 191; after line-of-sight smoothing: length 4.555 m, collisions 47, waypoints 90 -> 3
inflation 0.1 m: A* length 4.881 m, sample points where the rover's disc hits an obstacle: 37 of 195; after line-of-sight smoothing: length 4.642 m, collisions 41, waypoints 92 -> 3
inflation 0.175 m: A* length 6.771 m, sample points where the rover's disc hits an obstacle: 0 of 270; after line-of-sight smoothing: length 6.548 m, collisions 0, waypoints 124 -> 5
inflation 0 m: reachable plants {'P1': True, 'P2': True, 'P3': True, 'P4': True}; free cells 20064
inflation 0.1 m: reachable plants {'P1': True, 'P2': True, 'P3': True, 'P4': True}; free cells 18830
inflation 0.175 m: reachable plants {'P1': True, 'P2': True, 'P3': True, 'P4': True}; free cells 16396
inflation 0.2 m: reachable plants {'P1': True, 'P2': True, 'P3': True, 'P4': True}; free cells 16380
inflation 0.3 m: reachable plants {'P1': True, 'P2': True, 'P3': True, 'P4': True}; free cells 13964

===== fig03_weights_visit.py (exit 0, 1.9 s)
optimal cost 8.728 m, expanded 5627
w =  1.0: cost ratio 1.0000 (bound 1.0), expanded 5627
w =  1.2: cost ratio 1.0000 (bound 1.2), expanded 4926
w =  1.5: cost ratio 1.0000 (bound 1.5), expanded 4078
w =  2.0: cost ratio 1.0000 (bound 2.0), expanded 3031
w =  3.0: cost ratio 1.0237 (bound 3.0), expanded 3280
w =  5.0: cost ratio 1.0664 (bound 5.0), expanded 3682
w = 10.0: cost ratio 1.0664 (bound 10.0), expanded 4021
inadmissible heuristic 1.5 x octile: cost ratio 1.0000, expanded 4078
inadmissible heuristic 3.0 x octile: cost ratio 1.0237, expanded 3280
h = 0 (Dijkstra): expanded 12760
path-length matrix (m), order ['dock', 'P1', 'P2', 'P3', 'P4']
[[ 0.    4.59  9.66  3.51  8.73]
 [ 4.59  0.    5.18  5.61 10.83]
 [ 9.66  5.18  0.    6.15 12.92]
 [ 3.51  5.61  6.15  0.    6.77]
 [ 8.73 10.83 12.92  6.77  0.  ]]
nearest neighbour order ['dock', 'P3', 'P1', 'P2', 'P4'] 27.215 m ; best order ['dock', 'P1', 'P2', 'P3', 'P4'] 22.696 m ; worst of the 24 orders 39.011 m ; number of orders 24
nearest neighbour is 19.91 percent longer than the best; the worst order is 71.9 percent longer

===== fig04_pursuit.py (exit 0, 2.5 s)
smoothed path: 159 -> 4 waypoints, length 8.212 m ; waypoints [(0.58, 0.58), (1.88, 4.33), (4.12, 4.98), (6.03, 5.03)]
lookahead 0.1 m: finished True, time 17.20 s, max cross-track error 1.5 cm, rms 0.1 cm, sample points where the rover disc hits an obstacle 0
lookahead 0.2 m: finished True, time 17.46 s, max cross-track error 3.2 cm, rms 0.3 cm, sample points where the rover disc hits an obstacle 0
lookahead 0.3 m: finished True, time 17.46 s, max cross-track error 5.1 cm, rms 0.7 cm, sample points where the rover disc hits an obstacle 3
lookahead 0.4 m: finished True, time 17.42 s, max cross-track error 6.8 cm, rms 1.0 cm, sample points where the rover disc hits an obstacle 3
lookahead 0.6 m: finished True, time 17.38 s, max cross-track error 10.6 cm, rms 1.9 cm, sample points where the rover disc hits an obstacle 5
lookahead 0.8 m: finished True, time 17.32 s, max cross-track error 14.1 cm, rms 3.0 cm, sample points where the rover disc hits an obstacle 8
lookahead 1.2 m: finished True, time 17.24 s, max cross-track error 21.4 cm, rms 5.2 cm, sample points where the rover disc hits an obstacle 11
lookahead 0.1 m: max error with no lag 1.6 cm, 30 ms lag 1.5 cm, 200 ms lag 2.8 cm
lookahead 0.4 m: max error with no lag 7.0 cm, 30 ms lag 6.8 cm, 200 ms lag 5.2 cm
max turn rate along the run (rad/s) at lookahead 0.4: 0.82 ; rover's feasible limit at 0.5 m/s: 2.39
speed 0.2 m/s, lookahead 0.4 m: time 41.0 s, max error 7.1 cm, finished True
speed 0.5 m/s, lookahead 0.4 m: time 17.4 s, max error 6.8 cm, finished True
speed 0.65 m/s, lookahead 0.4 m: time 14.0 s, max error 6.7 cm, finished True

===== fig05_stop_budget.py (exit 0, 1.0 s)
braking distance at 0.5 m/s: 2.124 cm
ping period   10.0 ms: worst-case latency   25.0 ms ; formula stop   3.37 cm ; simulated worst case   3.36 cm
ping period   30.0 ms: worst-case latency   45.0 ms ; formula stop   4.37 cm ; simulated worst case   4.36 cm
ping period   40.0 ms: worst-case latency   55.0 ms ; formula stop   4.87 cm ; simulated worst case   4.86 cm
ping period   42.5 ms: worst-case latency   57.5 ms ; formula stop   5.00 cm ; simulated worst case   4.99 cm
ping period   60.0 ms: worst-case latency   75.0 ms ; formula stop   5.87 cm ; simulated worst case   5.86 cm
ping period  100.0 ms: worst-case latency  115.0 ms ; formula stop   7.87 cm ; simulated worst case   7.86 cm
ping period  150.0 ms: worst-case latency  165.0 ms ; formula stop  10.37 cm ; simulated worst case  10.36 cm
ping period  250.0 ms: worst-case latency  265.0 ms ; formula stop  15.37 cm ; simulated worst case  15.36 cm
largest ping period for a 5 cm stop: 42.53 ms (=  23.5 Hz) ; for a 10 cm stop: 142.53 ms
echo time for a 1.5 m target at 20 degC: 8.74  ms ; for 4 m: 23.31 ms (so a ping period below 23 ms is impossible at 4 m range)
latency 15 ms: max speed that stops within 1.5 m - 5 cm margin = 4.044 m/s ; within 0.30 m - 5 cm = 1.629 m/s ; vs rover top speed 0.691
latency 75 ms: max speed that stops within 1.5 m - 5 cm margin = 3.714 m/s ; within 0.30 m - 5 cm = 1.330 m/s ; vs rover top speed 0.691
latency 150 ms: max speed that stops within 1.5 m - 5 cm margin = 3.342 m/s ; within 0.30 m - 5 cm = 1.046 m/s ; vs rover top speed 0.691
watchdog timeout 0.05 s: distance after the last good command at 0.5 m/s = 5.4 cm ; at 0.25 m/s = 2.2 cm
watchdog timeout 0.10 s: distance after the last good command at 0.5 m/s = 7.9 cm ; at 0.25 m/s = 3.4 cm
watchdog timeout 0.20 s: distance after the last good command at 0.5 m/s = 12.9 cm ; at 0.25 m/s = 5.9 cm
watchdog timeout 0.50 s: distance after the last good command at 0.5 m/s = 27.9 cm ; at 0.25 m/s = 13.4 cm
watchdog timeout 1.00 s: distance after the last good command at 0.5 m/s = 52.9 cm ; at 0.25 m/s = 25.9 cm
watchdog timeout 2.00 s: distance after the last good command at 0.5 m/s = 102.9 cm ; at 0.25 m/s = 50.9 cm

===== fig06_graph.py (exit 0, 0.9 s)
message flow: ['/range', '/pose', '/path', '/cmd_vel']
state: {'pose': (1.0, 0.5, 0.0), 'path': [(0.6, 0.6), (1.9, 4.3), (6.0, 5.0)], 'cmd': (0.5, 0.0)}
range_sensor in the map frame: x 3.087 y 1.610 heading -178.9 deg
inverse lookup composes to the identity: True
typed topic rejects a wrong message: topic /range carries float, got str
