WHOI-ROS: Shared ROS2 Foundations for all Platforms

I’m Isaac Vandor and I work at WHOI (Woods Hole Oceanographic Institution) on open source infrastructure for marine robotics. Along with Toby and the rest of the NSF POSE team, I’m working on the grant that’s bringing you this forum and the broader Open Ocean Software effort.

I want to introduce the WHOI-ROS workspace — a set of shared ROS 2 packages that we use across WHOI’s ocean-going vehicles. The code is publicly available on WHOI’s community GitLab at git.whoi.edu/whoi-ros and is a ROS 2 migration of the Deep Submergence Lab’s original ROS 1 packages, which some of you may know from Bitbucket. Those original ds_* packages have been forked and built on by a number of groups over the years — the DVL message definitions ended up influencing the community-standard marine_acoustic_msgs, and WHOI’s ds_sim is one of the foundations that Project DAVE was built on.

The ROS 2 workspace is organized around a few shared layers:

  • wr2_asio — asynchronous transport layer handling serial, TCP, UDP, and ROS raw connections. This is the I/O backbone — instead of every driver writing its own socket code, they use a common transport abstraction.

  • wr2_base — node scaffolding with parameter helpers, fault monitoring, and comms primitives. If you’re writing a new driver or component, this gives you a consistent starting point.

  • wr2_msgs — shared message definitions for control, telemetry, and sensor data consumed across all nodes.

On top of that foundation, sensor drivers follow a wr2_<sensor> naming pattern. Current drivers include:

  • wr2_rdi_dvl — Teledyne RDI Doppler Velocity Logs

  • wr2_nortek_dvl — Nortek Doppler Velocity Logs

  • wr2_phins_ins — iXblue/Exail Phins inertial navigation

  • wr2_paro_depth — Paroscientific Digiquartz depth sensor

  • wr2_keller_pressure — Keller pressure transducers

  • wr2_sbe_ctd — Sea-Bird Electronics CTD

  • wr2_svp70 — Reson SVP70 sound velocity profiler

  • wr2_nmea_gps — NMEA GPS receiver

  • wr2_nbosi_ct — Neil Brown Ocean Sensors CT

  • wr2_aps_mag — Applied Physics Systems magnetometer

  • wr2_mst_sas — Marine Sonic Technology synthetic aperture sonar

  • wr2_sonoptix_fls — Sonoptix forward-looking sonar

Supporting packages include wr2_sensor_base (common driver scaffolding), wr2_sonar_visualizers, and wr2_sim for simulation hooks. Each driver ships with its own config, launch files, and tests. The navigation stack (wr2_nav) consumes sensor outputs for state estimation, and wr2_components handles system-level concerns like power monitoring, calibration, and fault management.

A key design decision: vehicle-specific configurations don’t live in this workspace. The shared packages provide the building blocks — transport, messages, drivers, navigation — and individual vehicle repos reference them. This keeps the shared code general and avoids the problem of one vehicle’s quirks breaking another’s build.

The workspace targets ROS 2 Humble, with many packages also tested on Jazzy. C++ 17, standard ament build. Getting started is straightforward if you want to pull a subset:

# include wr2_base, wr2_asio, wr2_msgs, plus the drivers you need
rosdep install -r -y --ignore-src --from-paths src/
colcon build
source install/setup.bash
ros2 launch wr2_rdi_dvl test_dvl.launch serial_port:=/dev/ttyS14

Nathan McGuire and I maintain the workspace. If you have questions, you can reach us at nmcguire@whoi.edu and ivandor@whoi.edu, or post here.

If you’re working with similar oceanographic instruments and have your own ROS 2 drivers, I’d be interested to hear how you’ve approached the transport and message layers. We’re covering DVLs, INS, CTDs, depth sensors, SVPs, GPS, sonar, and magnetometers — but there’s a lot more hardware out there. One of the goals of this forum and the Open Ocean Software effort is to find places where we can share infrastructure instead of everyone writing their own serial parser for the same instruments.

Questions welcome — happy to go deeper on any of the packages.