ROS 2 · C++17/CUDA · Ground-plane geometry · Cameras + IMU

Monoscale turns ordinary monocular cameras into a metric odometry and occupancy stack. It takes scale from the one distance a road vehicle already knows — the height of the camera above the road.

No stereo pair, no LiDAR in the loop, no learned model, no prior map, no wheel encoder. One camera is enough, any number is allowed, and they do not need to overlap: the development rig's two cameras face opposite ways and share no field of view.

0.182% ATE on a 5.2 km real drive (held out) 26 mm ATE over 111 m in CARLA Nothing added to the vehicle
Monoscale estimate against ground truth on the CARLA slalom and the held-out parking manoeuvre

Estimate against ground truth: CARLA slalom and held-out parking manoeuvre, with a zoomed panel and scale bar.

Where It Is Meant to Run

Where GNSS does not reach and the vehicle moves slowly — indoor parking structures, loading yards, the last thirty metres of an automated park. The rig is the surround-view camera set a production car already carries, so nothing has to be added to the vehicle to make those cameras metric. Accuracy scales with camera height over distance travelled per frame, so low and slow is its best regime — the opposite of what a stereo baseline prefers.

Results · Simulation and a Real Vehicle

Same code and the same metric definitions in both places; tuned figure first, held-out second.

CARLA, 29–150 m drivesFord Multi-AV, 5.2 km
ATE / distance0.0237% / 0.1781%0.451% / 0.182%
Final error / distance0.0324% / 0.2659%0.519% / 0.097%
Accumulation over a random walk (walk)1.10 / 0.765.07 / 1.15
  • In millimetres: 26 mm of ATE over a 111 m simulated drive, and 9.5 m over a 5.2 km real drive that ends 5.1 m from the true end point.
  • What transferred from simulation to the vehicle is accumulation — the hard half of odometry — at 1.15 held out against 1.10 and 0.76 in CARLA.
  • Held-out discipline: two CARLA parking drives and one Ford log are never used for tuning. In one week they rejected four changes that had won on the tuning set.

Why Scale from the Ground Plane

Scale sourceNo extra hardwareNeeds no excitationMetric without initialisationNeeds no prior map
Stereo baseline✗◎◎◎
LiDAR✗◎◎◎
IMU-only excitation◎✗✗◎
Learned monocular depth◎◎○◎
Prior map / HD map◎◎◎✗
Ground plane (Monoscale)◎◎◎◎

A plane-induced homography between two frames recovers t/h, and h is the mounting height — so the answer is metric without anything else on the vehicle measuring length. What it needs instead is texture on the road.

Key Properties

  • Metric scale from mounting height alone — no baseline, no range sensor.
  • Non-overlapping cameras — on the development rig they cannot overlap (40.53° of gap per side).
  • One camera is a supported rig, not a degenerate case: it costs a factor of 2.6–6.2 and still solves every drive.
  • Any number of cameras, each contributing its own ground observation and anchor map.
  • Self-contained heading integrated from the gyro; dead reckoning through a failed solve follows the gyro's arc.
  • Anchor map of ground sightings bounds the random walk over 1,600 frames.
  • Every deployed constant carries the measurement that chose it, and the alternatives it rejected.

How It Works

KLT Trackerimages → feature tracks; the estimator never sees a frame
→
Ground Projectiontracks in a distance band projected onto the road plane by height and tilt
→
Hop + Photometricrobust translation vote, blended with road-texture alignment; heading from the gyro
→
Anchor Map + Filterpose correction against earlier ground sightings, cameras fused, inertial propagation
→
ROS 2 Outputkinematic state and ground points

Dense Occupancy from the Same Cameras

The occupancy path reads the raw fisheye frames rather than accumulating sparse features. World-horizontal planes are swept through each pixel, scored by ZNCC, and aggregated with SGM into a surface height, using the attitude the odometry publishes.

Scored occupancy grid of a CARLA parking scene
  • Output: 60 × 60 m grid at 0.1 m resolution.
  • Runtime: 34 ms per keyframe on CUDA, both cameras counted.
  • Scored against truth (approach_hd60_occ_b): no vehicle cell called free, coverage 0.831, 29 false occupied cells, zero path ghosts.

Software Architecture

  • Estimator core: C++ and ROS-independent, tested without a graph and ready to share a process with a controller.
  • Tracking: C++ KLT front end with an optional OpenCV CUDA path.
  • ROS 2 integration: odometry node and monoscale_replay, which scores a bag directly.
  • Evaluation: ground-truth scoring for CARLA and the Ford Multi-AV dataset, held-out drives, explicit ablations.
  • Tests: 149 tests across geometry, anchors, filtering, inertial processing, and synthetic-drive behavior.