The robot has no lidar and no stereo pair — one forward camera, nothing else. As it flies forward, every obstacle it sees slides across the image; how fast it slides (its optical flow) depends purely on geometry: a pillar close to the flight path sweeps past in a blur, while one far away barely seems to move. That's the same apparent-motion effect you notice looking out a car window — nearby fence posts blur past, distant hills barely shift.
flow(feature) ∝ forwardSpeed / distance
steerBias = avgFlow(right half) − avgFlow(left half)
heading += steerBias · gain // turn away from the faster (closer) side
- Flow steering — turn it off and the robot ignores the camera entirely, flying dead straight until it hits whatever is first in its path.
- Forward speed — faster flight makes every flow vector longer, so the controller reacts sooner but also has less time to correct.
- Obstacle density — a busier field gives the flow controller more (and noisier) signal to average over each side.
- Steering gain — how strongly the left/right flow imbalance is converted into a turn; too low and the robot clips obstacles, too high and it oscillates.
This is exactly how a honeybee or a fly avoids walls with a brain far too small for anything resembling a depth map: balancing the optical flow it senses on each eye is enough to keep it centred in a gap, with no notion of "how many centimetres away" that gap actually is.