Fix two cross-dataset convention bugs found by scoring against ground truth
Aryan Sethi+1: Claude Opus 5 (1M context)
b9ff8f9
Argoverse 2 cameras are not pinhole. They ship k1,k2,k3 of roughly
-0.24/-0.22/+0.34 and the images are not rectified, so projecting through K
alone put boxes tens of pixels off the objects they label. Calibration now
carries the coefficients and owns both directions, project() and ray();
nuScenes passes zeros, for which the model is the identity, so one code path
serves both.
The datasets also disagree about the ego frame. nuScenes puts its origin on the
ground, so camera height is the sensor z translation. AV2 puts its origin at the
rear axle centre, about 0.26 m up, and taking z translation as camera height
made every AV2 ground-plane distance read ~18% short at every range. Rather
than hardcode a vehicle constant, measure it: cones and barrels rest on the
road, so the median underside of their near-field cuboids is the road surface.
Per log, so it absorbs road grade too. Deliberately not applied to nuScenes,
where it would make a calibration that already checks out at 0.986 worse.…