The robot, and my corner of it
SubVision Robotics is building ZIMA — a hull-climbing subsea rover that prevents biofouling by making short, repeatable passes over a ship's hull instead of waiting for heavy growth and scraping it off later. It holds position on curved steel using independently steered drive units. I joined as Electrical & Software, one of several engineers, and my work sat on the navigation side: how the rover sees where to go, and how it knows where it is.
Teaching it to follow a line
I built the autonomous line-detection pipeline in Python and OpenCV — the vision layer that turns a murky underwater camera frame into a line the rover can actually steer along. The concrete output is a cross-track error: how far off the line it has drifted, and at what angle. Those are exactly the two numbers a steering controller needs, which is what turns a camera into guidance rather than just a picture.
Choosing the right senses
A camera alone does not survive silty water, so I ran a trade study across sonar, ultrasonic and IMU, scoring each on range, resolution, cost, and behaviour inches away from a large flat steel plate. That last constraint decides more than the datasheets do — a flat hull throws acoustic energy straight back in ways that quietly wreck a sensor picked on spec-sheet numbers alone.
The architecture underneath
I prototyped the software architecture in ROS 2 Jazzy, using EKF/UKF filtering to fuse the sensor feeds into a single position estimate the navigation stack could trust. I also drew the STM32-to-Raspberry-Pi interface diagrams that split the work along the right seam: the Pi runs perception and the ROS 2 nodes, the STM32 owns hard real-time motor control — where a few milliseconds of jitter is the difference between a straight cleaning pass and a drifting one.
Appendix — Figures & Plots
2 figures · click to enlargeSupporting imagery for this project — boards, plots, screenshots and build shots that did not make the narrative above. Click any figure to open it full-screen.