Data pipeline from ROV movement to bathymetric surface generation.
python csv_to_png_depth_points.py MAP00.csv
python csv_to_png_depth_interpolated.py MAP00.csv
python csv_to_png_depth_contours.py MAP00.csv
python csv_to_kml_points_colored.py MAP00.csv
python csv_to_kmz_depth_overlay.py MAP00.csv
A compact underwater survey system that collects depth, position, and environmental data from a moving ROV and converts those measurements into bathymetric maps and georeferenced outputs. Measurements are filtered in real time using quality and spatial constraints, producing both a complete log and a reduced mapping dataset. A continuous surface is generated from the filtered points through spatial interpolation.
The system is built around an Arduino-based capture device and a Python-based processing workflow.
It is designed to:
arduino/
rov_logger_mapping.ino
docs/
SYSTEM.md
SCRIPTS.md
scripts/
csv_to_png_depth_points.py
csv_to_png_depth_interpolated.py
csv_to_png_depth_contours.py
csv_to_kml_points_colored.py
csv_to_kmz_depth_overlay.py
example_data/
MAP00.CSV
flowchart LR
A[GPS Module] --> G[Arduino Logger]
B[Ultrasonic Depth Sensor] --> G
C[DS18B20 Temperature] --> G
D[BNO085 IMU] --> G
E[SD Card] <-->|logs| G
F[LCD] <-->|status| G
G --> H[dataXX.csv]
G --> I[mapXX.csv]
I --> J[Python Scripts]
J --> K[Depth Map]
J --> L[Interpolated Surface]
J --> M[Contour Map]
J --> N[KML Output]
J --> O[Earth Overlay]
| Layer | Function |
|---|---|
| Capture (Arduino) | GPS (position + UTC), sonar depth, temperature, IMU orientation, SD logging |
| Processing (Python) | CSV parsing, filtering, interpolation (IDW), contour generation |
| Output | Depth maps, contour maps, KML files, Google Earth overlays |
| Component | Connection |
|---|---|
| GPS | RX1 (19), TX1 (18) |
| Ultrasonic | RX2 (17), TX2 (16) |
| SD Card | CS pin 53 |
| Temperature Sensor | Pin 6 |
| LCD / IMU | SDA (20), SCL (21) |
The Arduino logger writes two files:
dataXX.csv — complete system log (diagnostics)mapXX.csv — filtered survey datasetMapping points are recorded only when the system detects:
Run scripts on the mapping dataset:
python csv_to_png_depth_points.py MAP00.CSV
python csv_to_png_depth_interpolated.py MAP00.CSV
python csv_to_png_depth_contours.py MAP00.CSV
python csv_to_kml_points_colored.py MAP00.CSV
python csv_to_kmz_depth_overlay.py MAP00.CSV
All timestamps are recorded in UTC to eliminate timezone ambiguity.
A moving average filter reduces sonar noise and rejects transient spikes.
Depth is adjusted using a temperature-based estimate of sound speed.
Measurements are evaluated during acquisition to ensure mapping data meets defined quality thresholds.
Inverse Distance Weighting (IDW) converts discrete samples into continuous surfaces.
mapXX.csv)point,date_utc,time_utc,lat,lng,depth_cm,temp_c,satellites,hdop,speed_kmph,fix_age_ms,pitch_deg,roll_deg,imu_acc
dataXX.csv — complete acquisition logmapXX.csv — filtered survey dataset*_depth_map.png — raw point coverage*_interpolated.png — interpolated surface*_contours.png — contour visualization*_colored.kml — colorized Google Earth points*_overlay.kmz — Google Earth ground overlaypython csv_to_png_depth_points.py MAP00.csv
python csv_to_png_depth_interpolated.py MAP00.csv
python csv_to_png_depth_contours.py MAP00.csv
python csv_to_kml_points_colored.py MAP00.csv
python csv_to_kmz_depth_overlay.py MAP00.csv
Running the scripts produces:
*_depth_map.png*_interpolated.png*_contours.png*_colored.kml*_overlay.kmzThis project implements a self-contained bathymetric survey system using a mobile ROV platform.
As the device moves, it continuously samples depth, position, and environmental data. Each measurement is evaluated in real time against defined quality constraints, including GPS validity, HDOP, satellite count, fix age, platform orientation, and spatial separation.
The system produces two datasets:
dataXX.csv) containing all measurementsmapXX.csv) containing only survey-quality pointsThe mapping dataset is generated by enforcing minimum spacing between points and rejecting measurements that do not meet stability or accuracy thresholds.
A continuous surface is constructed from the filtered dataset using spatial interpolation (Inverse Distance Weighting). The resulting map is a derived model, determined by sampling density, platform motion, and filtering criteria rather than direct sensor output.
This architecture separates acquisition, validation, and surface reconstruction into distinct stages, allowing control over data quality during both capture and processing.