Monoscale Visual Odometry
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.
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 drives | Ford Multi-AV, 5.2 km | |
|---|---|---|
| ATE / distance | 0.0237% / 0.1781% | 0.451% / 0.182% |
| Final error / distance | 0.0324% / 0.2659% | 0.519% / 0.097% |
Accumulation over a random walk (walk) | 1.10 / 0.76 | 5.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 source | No extra hardware | Needs no excitation | Metric without initialisation | Needs 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
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.
- 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.