Monoscale Visual Odometry
ROS 2 · C++/CUDA · Ground-plane geometry · Cameras + IMU
Monoscale is a lightweight, learning-free perception stack that derives metric vehicle motion and dense occupancy from one or more cameras, an IMU, known camera mounting height, and the ground plane. It does not require stereo, vehicle-mounted LiDAR, a learned model, or a prebuilt map.
Estimation Design
Camera + IMUC++ KLT tracks, road-image observations, and inertial measurements
→
Separated Estimationphotometric distance plus anchor-map direction, position correction, roll, and pitch
→
Metric OdometryROS 2 kinematic state and ground-point output
Why the Signals Stay Separate
- Without an anchor match, feature tracking keeps motion direction and the forward/reverse sign while photometric alignment supplies the distance.
- With an anchor match, the anchor update is kept intact because it contains both current motion and accumulated position-error correction.
- For attitude, roll and pitch are estimated directly from repeated anchor-bearing errors instead of continuously integrating photometric frame-to-frame increments.
- This separation prevents a locally useful distance estimate from overwriting the longer-term correction carried by the anchor map.
Dense Occupancy
The occupancy path reads the raw fisheye images rather than accumulating sparse feature points. It sweeps world-horizontal planes through each pixel, scores photometric agreement with ZNCC, aggregates the cost with SGM, and uses the odometry roll/pitch directly in the image warp.
- Output: a 0.1 m occupancy grid for the parking environment.
- Deployment path: C++/CUDA; the recorded CUDA runtime is about 0.2 s per keyframe.
- Measured CARLA case: coverage 0.831, false occupied cells 29, and no path ghosts on
approach_hd60_occ_b.
Measured Results
| Measurement | Result | What It Tests |
|---|---|---|
| Final configuration | 0.0237% mean distance-normalized ATE over 9 CARLA drives | Combined long-term trajectory accuracy |
| Anchor-map attitude disabled | 0.0223% → 0.1114% | Effect of direct ground-relative roll/pitch estimation on a straight drive |
| Photometric distance reapplied during anchor matches | 5 m RTE 0.145% → 0.108%, but best ATE 0.0369% versus 0.0237% baseline | Short-window distance accuracy versus accumulated trajectory correction |
| Photometric pitch/roll increment bias | up to about 0.038° per frame | Why continuously integrating the increment is drift-prone |
Software Boundaries
- Estimator core: C++ and ROS-independent, so it can be tested without a graph or composed into another process.
- Tracking: C++ KLT front end with an optional OpenCV CUDA path.
- ROS 2 integration: odometry node, deterministic bag replay, launch and deployment parameters.
- Evaluation: CARLA ground truth scoring, held-out runs, and explicit ablations.
- Tests: 132 core tests covering geometry, anchors, filtering, inertial processing, attitude, and synthetic-drive estimator behavior.
Validation Scope
- The trajectory figures above are CARLA measurements under the repository's recorded evaluation conditions.
- The photometric increment is an inter-frame estimate, not an absolute ground attitude measurement.
- The occupancy and odometry paths share camera geometry and pose information but remain separate consumers of the image stream.