This repository hosts the onboard software stack used to deploy the Robotic Decision Making Lab's (RDML) BlueROV2.
- BlueROV2 (Blue Robotics) -- Heavy Configuration with 150 m tether
- Navigator Flight Controller (with Raspberry Pi 4, 8 GB)
- Alpha 5 (Reach Robotics)
- Modifications: payload bay equipped with additional compute and sensing capabilities
| Device | Operating System |
|---|---|
Raspberry Pi 4, 16 GB (bluerov_pi) |
Raspberry Pi OS Lite (Bookworm) |
Raspberry Pi 5, 16 GB (autonomy_pi) |
Ubuntu 26.04 Server |
| Teensy 4.0 | Teensyduino |
| NVIDIA Jetson Orin Nano | Ubuntu 24.04 |
- Nucleus 1000 DVL (Nortek)
- SeaTrac Lightweight USBL (Blueprint Subsea)
- Oculus Sonar (Blueprint Subsea)
- stellarHD (Deep Water Exploration)
- See our corresponding topside repository
flowchart LR
subgraph ElectronicsBottle["Electronics Bottle"]
FC["Navigator Flight Controller\n(ArduSub)"]
subgraph BlueROVPi["bluerov_pi (Raspberry Pi 4)"]
BlueOS["BlueOS"]
MAVROS["mavros_node\n(Docker)"]
end
end
subgraph AutonomyBottle["Autonomy Electronics Bottle"]
subgraph AutonomyPi["autonomy_pi (Raspberry Pi 5)"]
Agent["teensy_driver"]
Bar30["bar30_router"]
DVL["nucleus_driver"]
BME["bme680_driver"]
EKF["robot_localization"]
RC["ros2_control\n(control stack)"]
Coord["controller_coordinator"]
end
subgraph Teensy["Teensy 4.0"]
IMU["BNO08x driver"]
end
end
FC -- MAVLink --> BlueOS
BlueOS -- MAVLink --> MAVROS
MAVROS -- "/uas1/mavlink_source" --> Bar30
IMU -- "serial, 921600 baud" --> Agent
Agent -- "/vehicle/imu01" --> EKF
DVL -- "/nucleus_driver/twist" --> EKF
Bar30 -- "/vehicle/depth" --> EKF
EKF -- "/vehicle/odometry/filtered" --> RC
Coord -- "controller_manager/switch_controller" --> RC
RC -- "mavros/rc/override" --> MAVROS
| Device | IP Address |
|---|---|
Raspberry Pi 4 (bluerov_pi) |
192.168.2.2 |
Raspberry Pi 5 (autonomy_pi) |
192.168.2.3 |
| NVIDIA Jetson Orin Nano | 192.168.2.4 |
| Nortek Nucleus 1000 | 192.168.2.201 |
| Barlus Underwater Camera (New) | 192.168.2.20 |
| Barlus Underwater Camera (Old) | 192.168.2.11 |
| Signal | Pin / value |
|---|---|
| I2C SDA | 18 |
| I2C SCL | 19 |
| BNO08x INT | 2 |
| BNO08x RST | 3 |
| I2C addr | 0x4A |
UART → autonomy_pi |
Serial1, 921600 baud → Pi UART0 (/dev/ttyAMA0) |
| USB debug | Serial, 9600 baud |
| Device | GPIO |
|---|---|
arm1 |
24 |
arm2 |
25 |
sonar |
26 |
dvl |
27 |
PLD (power-loss detect, pld_monitor) |
6 — no debounce, 1 low sample = shutdown |
- ArduSub: vX.X.X
- BlueOS's MAVLink router is configured with an additional UDP endpoint (UDP Client), in the MAVLink
Endpoints page, targeting
127.0.0.1:14755. This mirrors the flight controller's MAVLink stream to themavros_nodecontainer (network_mode: host), which listens on that port per itsfcu_urlinmavros.yaml.
- ROS 2 Lyrical
- MAVROS is loaded by default on the
bluerov_pivia service - The core autonomy stack, including transforms, state estimation, and control
are loaded by default on the
autonomy_pivia service
Each device is provisioned by its own install script, which sets up the ROS 2 workspace, system dependencies, and systemd services:
bluerov_pi:modules/bluerov_pi/scripts/install.shautonomy_pi:modules/autonomy_pi/scripts/install.shjetson:modules/jetson/scripts/install.sh
The Teensy firmware is built and flashed with PlatformIO:
cd modules/teensy
pio run -t uploadThis repository has been used in the following papers:
@article{palmer2026stochastic,
title = {{Stochastic Physics-Informed Neural Networks on Lie Groups for Learning Underwater Vehicle Dynamics}},
author = {Palmer, Evan F. and Hatton, Ross L. and Hollinger, Geoffrey A.},
journal = {arXiv preprint arXiv:2608.08356},
year = {2026},
eprint = {https://doi.org/10.48550/arXiv.2608.08356},
archivePrefix = {arXiv},
primaryClass = {cs.RO},
}This project is licensed under the MIT License. Any documentation included from an external source retains its original licensing.