The ROV Locator is designed for low-cost, medium accuracy localization of underwater objects.

  • The system can be used to guide an ROV to an area of interest, either manually or autonomously.
  • The system can be used to locate an ROV.
  • Other applications are also possible.

A complete system requires both a transmitter and a receiver. After calibration, transmitters are paired with specific receivers and should not be interchanged.

The system works by syncing the clocks of a transmitter and receiver. The transmitter then sends a sound pulse once per second. The receiver uses time-of-flight to calculate slant range to the transmitter, and phase measurements to determine the arrival angle of the sound pulse.

General Specification

Maximum Depth100m
Volume, Receiver Unit295 ml
Mass, Receiver Unit278 gm
Volume, Transmitter Unit295 ml
Mass, Transmitter UnitTBD gm
Absolute Maximum Range1 km
Typical Usable Range300 m
Apparent Yaw/Azimuth resolution*
Apparent Elevation angle resolution*
Slant range measurement resolution*0.1 m
Slant range error accumulation (typical)2 m/hr
IMU Euler angle accuracy, typical **
Update rate 1 Hz
Ping Frequency25 kHz
Receiver V-in power4.5V to 28V DC
 <1 Watt
Transmitter V-in power4.5V to 28V DC
 <1 Watt

* Resolution does not equal Accuracy. ** Magnetic errors not included

Receiver Orientation Frame

Best Operating envelope

Data Communication from ROVL to ROV or Computer

Serial Parameters

Both transmitter and receiver support TTL-level communication at 115,200 baud, 8 bits, no parity, one stop bit.

Syncing and calibrating

There are two types of user calibrations:

  • Clock drift compensation (should be done when put into service and then every three months or so)
  • IMU Calibration

There are two methods of syncing the transmitter to the receiver: 

  • Fast sync with dumb or autonomous transmitter
  • Commanded sync with tethered transmitter and receiver

Clock Drift Compensation/Calibration

The clocks in the receiver and transmitter need to be synced in order to measure the distance between the two units. Time-of-flight is used for this. Slight differences in crystal manufacturing can cause the two clocks to run at slightly different speeds. Clock drift compensation is used to compensate for some of the difference. The method is as follows:

  • Put transmitter and receiver at a rigidly fixed distance from each other and at the same temperature (example, taped together in a 5-gallon bucket of water)
  • Power up transmitter
  • Power up receiver
  • Send receiver a “Crystal Calibration” command
  • Wait 30 minutes without disturbing positions or sending other commands. The receiver will send an informational message when complete

To be done when first put into service and then about every three months to account for crystal aging

IMU calibration

The Receiver contains an Inertial Measurement Unit (IMU) which has internal magnetometers, accelerometers and gyros. These sensors are imperfect and can have errors. Additionally, external magnetic disturbances can cause the magnetometers to make a bad estimate of magnetic north. The IMU has built-in processing that attempts to compensate for drift and offsets in the IMU’s sensors and for external magnetic influences. Calibrating the IMU can speed up the error correction process.

IMU calibration data is saved in flash memory and will result in much faster calibration on startup.

The IMU should be fully calibrated each time it is mounted in a new or different location.

You need to tell the receiver to invalidate its IMU calibration data when you remount it, then you need to do calibration maneuvers until calibration completes (see below calibration maneuvers).

Failing to invalidate old IMU data when re-mounting the receiver will result in long, annoying, difficult startups.

If you are only using apparent bearing and elevation outputs you can ignore the IMU and its calibration requirements. 

Calibration maneuvers are sometimes called the “IMU Dance,” and they go like this: 

  • Initial calibration – read the $USRTH data message to see when calibration is complete (Euler fields will become non-empty when calibration fully completes)
    1. Place the device in 6 different stable positions for a period of few seconds each to allow the accelerometers to calibrate. Make sure that there is slow smooth movement between stable positions. The 6 stable positions can be in any direction, but make sure that the device is lying at least once perpendicular to each of the x, y and z axes. 
    2. Make some random movements (for example: writing the number ‘8’ on air), and/or rotating slowly around all three axes.
    3. Repeat the two steps above until the unit indicates fully calibrated. 

Once the initial calibration is complete and stored in flash memory, on subsequent boot-ups only a few simple maneuvers are needed for the IMU to recognize the saved calibration is still valid and begin outputting data. These maneuvers are typically as simple as smoothly turning the receiver upside-down and then right-side up once or twice. 

If you re-mount the unit without invalidating the old calibration data and then completing an initial calibration, on subsequent boot-ups it may take quite a few maneuvers to complete calibration. 

Any time after either an initial calibration or a subsequent boot-up calibration is complete (i.e., data appears in Euler fields), you can invalidate stored data and the newest calibration data will immediately store in flash. An information message is sent when the flash storage operation is complete.

Fast Sync for distance measurements

Fast sync is used to quickly and easily sync clocks between the transmitter and receiver. This is most useful when there is no tether connection between the transmitter and receiver, and/or when the ROV Locator is not integrated into the system. This is how it is done:

  • Get transmitter and receiver in communication with each other (i.e., power them up and put them in the water) at a known distance from each other (e.g., 1 meter)
  • Send receiver a “known distance” command

Whatever error is in your known-distance command will appear in transmitter’s distance estimate. Generally, an error of two to three meters isn’t too noticeable.

Sync is good until power is interrupted to either transmitter or receiver. Sync is lost when power is lost.

Sync will drift due to clock error, typically accumulating errors at one to two meters per hour

commanded Sync for distance measurements

Commanded sync works if you have communication links to both transmitter and receiver from a central controller. This is how it is done:

  • Simultaneously send each unit a “Prepare to sync” command
  • Wait at least two, but not more than three, seconds. Then simultaneously send a sync command to each unit. The closer to simultaneous, the better the subsequent distance estimates will be. Expect an initial error of about 1.5 meters for every millisecond of non-simultaneity.

The transmitter will ping at exactly 1-second intervals from receipt of the sync command (within the limitations of the clock crystal, typically 1.5 PPM).

Sync is good until power is interrupted to either transmitter or receiver. Sync will drift due to clock error, typically accumulating errors at one to two meters per hour. 

New commanded syncs can be done at any time and any interval to keep clocks synced. ROVL operation is interrupted for about 3 seconds each time a sync is commanded.

Operating and accuracy considerations

Like all sonar systems, the ROVL system is affected by multipath. Reflections from the ROV body, the surface and bottom of the water body, environmental objects, launching platform body, thermoclines, etc. all can degrade accuracy and can cause ghost solutions. Multipath often manifests itself as random spurious solutions interspersed with good solutions. Spurious solutions can sometimes be filtered out.

Aquatic vegetation between the system elements can and will cause severe signal attenuation and phase disturbance of the signals.

sources of multipath



rov/deepside mounting

surface/topside mounting


transmitter & receiver data/power connector wiring

Data and power are connected to Transmitter connector J1, or Receiver connector J2

The connector is a JST-GH 4-pin connector. Pins are wired as follows:

  1. V-in power
  2. Serial-RX (from host, to ROVL)
  3. Serial-TX (from ROVL, to host)
  4. Ground (for power and serial)

Pinout is the same for both Transmitter and Receiver

Both units are supplied with a 4-conductor cable with a JST GH 4-pin connector on the unit end, suitable to connect to:

Blue Robotics BLUART USB to Serial and RS485 Adapter

transmitter wiring notes

For the transmitter, the simplest configuration is just supplying power to the transmitter. In operating scenarios, serial communication is only used for commanding sync and the serial data lines can be left unconnected.

simple wiring for either transmitter or receiver


Standard cable supplied with units

math for computing remote latitude/longitude

Receiver & GPS at Topside and Transmitter Deepside

This configuration is best used when there is no tether between the topside and deepside, or when the ROV Locator is not integrated electronically into the tether.

latitude_rx :: from GPS co-located with receiver (in degrees that include minutes and seconds)

longitude_rx :: from GPS co-located with receiver (in degrees that include minutes and seconds)

bearing :: true bearing (not compass bearing) from $USRTH message

elevation :: elevation from $USRTH message

slant_range :: slant range from $USRTH message

depth (best, if available) :: from ROV depth sensor (minus depth of receiver unit)

depth (use if ROV depth sensor not available) = abs( sin(elevation) x slant_range )     [note 1]

map_radius = cos(elevation) x slant_range

CE = 40,074,000 m      //  Circumference of earth in meters

long_m_per_deg = CE / 360      // meters per degree of longitude 

lat_m_per_deg = long_m_per_deg x cos(latitude_rx)      // meters per degree of latitude    [note 1] 

latitude_tx = latitude_rx + (sin(bearing) x map_radius / lat_m_per_deg) [note 1, 2]

longitude_tx = longitude_rx + (cos(bearing) x map_radius / long_m_per_deg  [note 1, 2]

Note 1: remember, most computer functions require you to convert degrees to radians

Note 2: the signs are needed in the computations

Note 3: longitude degrees that are West are negative, East are positive. Latitude degrees that are North are positive, South are negative.

Transmitter & GPS Topside and Receiver Deepside

In the case where the transmitter is topside with a co-located GPS, and the receiver is deepside, and the GPS data can be downlinked to the deepside system, the location of the receiver can be computed. The process is almost identical to the above case, with the positions inverted. The changes to the above case look like this: 

latitude_tx :: from GPS co-located with transmitter (in degrees that include minutes and seconds)

longitude_tx :: from GPS co-located with transmitter (in degrees that include minutes and seconds)

lat_m_per_deg = long_m_per_deg x cos(latitude_tx)      // meters per degree of latitude    [note 1] 

latitude_rx = latitude_tx + (sin(bearing + 180°) x map_radius / lat_m_per_deg) [note 1, 2]

longitude_rx = longitude_tx + (cos(bearing + 180°) x map_radius / long_m_per_deg  [note 1, 2]

ROV-locator window application

Cerulean Sonar provides a simple Windows application for the ROV-Locator that can be used to test your devices and to install firmware updates. 

Connection and Configuration

The ROV-Locator app assumes the transmitter is connected to the deepside unit, and the deepside unit is supplying power to but may not be communicating with the transmitter. It also assumes the receiver is topside and is optionally co-located with a GPS unit. 

The ROV-Locator application assumes the Receiver is connected to the Windows computer using an FTDI TTL 5V USB adaptor. The Blue Robotics BLUART device is equivalent to the FDI cable.

Either the BLUART or the FTDI cable will register with a PC when initially connected, and thereafter will try to always use the same COM port it was initially assigned. To be clear, the COM port assignment associates with the specific FTDI cable or BLUART board, not with the receiver. Keep track of the COM port number; it will make your life just a little easier. 

Compatible GPS Devices

The ROV-Locator app is compatible with any GPS that:

  • plugs into a PC,
  • emulates a COM port
  • sends at 115,200 baud, 8 data bits, 1 stop bit
  • outputs the standard $GPRMC NMEA-0183 sentence

We have tested the GPS/GLONASS U-blox7 (115,200 baud) with the ROV-Locator application. 

We have tested the GlobalSat BU-353S4 USB GPS Receiver (4800 baud) with the ROV-Locator application.

We have tested the VK-162 G-Mouse USB GPS Dongle (115,200 baud) with the ROV-Locator application.

Many other GPS units should also suitable.

The GPS is optional and is only used for the Map display. If no GPS is available, ROV-Locator map display assumes the receiver is located at (0,0) latitude-longitude and that the receiver does not move.

Known Points Database

If a GPS is used, you can load a database of known points into the ROV-Locator and known points will display on the map along with the receiver and transmitter location if they are with the bounds of the current map display. ROV-Locator finds the database by looking for the file “Known Points.txt” on the desktop, and if found, automatically loads it.

ROV-Locator Main Panel

ROV-Locator Map Display

The MAP display is a simple interface that shows the geographic relationship of the transmitter to the receiver. The display shows the receiver icon at the center of the dial (small blue square) and the relationship to the transmitter icon (purple square). The small red circles are the trail of the receiver. The lat/long of the transmitter (in degrees) is shown below the transmitter icon.

If no GPS is connected the receiver is assumed to be at lat/long (0,0). If a GPS is connected the center of the dial is the current GPS location. As the GPS moves (or the fix drifts), the display will show its trail as small blue circles.  

Objects in the known points database described earlier will appear on the display if they are in range.