Skip to content

Commit 3d62da8

Browse files
authored
Merge pull request #14 from or4k2l/copilot/update-car-vmean-and-vstd
Calibrate car v_mean to PVS dataset: 13.9 → 9.5 m/s
2 parents fd3486a + d054a14 commit 3d62da8

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

sgi/_internal/generator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
# Truck diesel: 6-cyl, 800 RPM → ~8 Hz
2929
# Drone rotor: DJI Mini series specs → ~50 Hz
3030
# Calibrated against PVS dataset (Menegazzo, 2020) — Brazil, dashboard IMU
31+
# car v_mean = 9.5 m/s (34.2 km/h) — direct measurement from PVS GPS speed
32+
# (PVS mean GPS speed: 34.5 km/h, n=1500 windows)
3133
MOTION_PARAMS = {
3234
# v_mean v_std a_long a_lat vib_freq vib_amp heading_std road_noise
3335
'human': ( 1.4, 0.30, 0.05, 0.03, 1.8, 0.08, 15.0, 0.0),
3436
'bicycle': ( 4.5, 0.80, 0.10, 0.05, 2.5, 0.04, 8.0, 0.5),
35-
'car': ( 13.9, 3.50, 0.80, 0.40, 5.0, 0.02, 5.0, 3.0),
37+
'car': ( 9.5, 3.50, 0.80, 0.40, 5.0, 0.02, 5.0, 3.0), # v_mean calibrated to PVS: 34.5 km/h mean
3638
'truck': ( 11.1, 1.20, 1.40, 0.25, 8.0, 0.08, 1.5, 3.0),
3739
'drone': ( 8.0, 1.50, 0.60, 0.60, 50.0, 0.03, 25.0, 0.0),
3840
}

tests/test_sgi.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,30 @@ def test_car_vib_amp_realistic(self):
230230
assert np.std(w['a_vert']) > 0.001, \
231231
f"car a_vert std too low: {np.std(w['a_vert']):.4f} — road noise not modelled"
232232

233-
def test_truck_speed_lt_car(self):
234-
"""truck v_mean must be less than car — primary urban speed discriminator"""
233+
def test_car_truck_speed_realistic(self):
234+
"""car and truck v_mean must both be realistic urban speeds (1–20 m/s)"""
235235
from sgi._internal.generator import MOTION_PARAMS
236-
assert MOTION_PARAMS['truck'][0] < MOTION_PARAMS['car'][0], \
237-
"truck v_mean should be less than car (urban: truck ~30km/h, car ~50km/h)"
236+
car_vm = MOTION_PARAMS['car'][0]
237+
truck_vm = MOTION_PARAMS['truck'][0]
238+
assert 1.0 < car_vm < 20.0, f"car v_mean={car_vm} outside realistic urban range"
239+
assert 1.0 < truck_vm < 20.0, f"truck v_mean={truck_vm} outside realistic urban range"
240+
241+
def test_car_vmean_calibrated(self):
242+
"""car v_mean must be calibrated to PVS dataset: 9.5 m/s (34.2 km/h)"""
243+
from sgi._internal.generator import MOTION_PARAMS
244+
assert MOTION_PARAMS['car'][0] == 9.5, (
245+
f"car v_mean should be 9.5 m/s (PVS calibrated), got {MOTION_PARAMS['car'][0]}"
246+
)
247+
248+
def test_car_truck_vmean_overlap(self):
249+
"""car and truck v_mean must be within 5 m/s — speed distributions overlap in reality"""
250+
from sgi._internal.generator import MOTION_PARAMS
251+
car_vm = MOTION_PARAMS['car'][0]
252+
truck_vm = MOTION_PARAMS['truck'][0]
253+
assert abs(car_vm - truck_vm) < 5.0, (
254+
f"car ({car_vm}) and truck ({truck_vm}) v_mean too far apart — "
255+
"classifier cannot separate them by speed alone"
256+
)
238257

239258
def test_truck_vib_amp_gt_car(self):
240259
"""truck a_vert std must exceed car (heavier vehicle, rougher vibration)"""

0 commit comments

Comments
 (0)