10.3 Autonomous Vehicles
Autonomous underwater and surface vehicles are revolutionizing ocean observation. They can operate for months, access difficult areas, and provide targeted sampling that complements satellites and fixed moorings.
Vehicle Types
Gliders
Buoyancy-driven. No propeller. Months at sea. Sawtooth profiles 0-1000m. Slocum, Seaglider, Spray.
AUVs (Autonomous Underwater Vehicles)
Propeller-driven. Hours to days range. Detailed surveys. REMUS, Autosub, Bluefin.
USVs (Unmanned Surface Vehicles)
Surface operations. Wave or wind powered. Atmospheric boundary layer. Saildrone, Wave Glider.
ROVs (Remotely Operated Vehicles)
Human-controlled via tether. Deep-sea exploration. Manipulators. Jason, Alvin.
Glider Characteristics
~0.5 knot
Horizontal speed
3-6 months
Deployment duration
1000 m
Maximum depth
Gliders change buoyancy to dive/climb, using wings to convert vertical motion to horizontal. Energy efficient for long missions.
Applications
Hurricane Monitoring
Gliders sample ahead of storms. Ocean heat content for intensity prediction.
Boundary Current
Long-term monitoring. Gulf Stream, Kuroshio. Transport estimates.
Ecosystem Monitoring
Fisheries acoustics. Harmful algal blooms. Marine mammal detection.
Under-Ice Operations
Arctic/Antarctic access. Ice-tethered profilers. Ice shelf basal melt.
Python: Glider Path
#!/usr/bin/env python3
"""autonomous_vehicles.py - Glider path simulation"""
import numpy as np
import matplotlib.pyplot as plt
def glider_profile(t, dive_depth=1000, cycle_time=6):
"""
Simulate glider sawtooth profile
t: time (hours), cycle_time: hours per dive cycle
"""
phase = (t % cycle_time) / cycle_time
# Triangular wave for depth
if phase < 0.5:
depth = 2 * phase * dive_depth
else:
depth = 2 * (1 - phase) * dive_depth
return depth
def glider_path(t, speed=0.5, heading=45):
"""
Glider horizontal path
speed: knots, heading: degrees
"""
speed_ms = speed * 0.514 # knots to m/s
heading_rad = np.radians(heading)
x = speed_ms * np.sin(heading_rad) * t * 3600 / 1000 # km
y = speed_ms * np.cos(heading_rad) * t * 3600 / 1000 # km
return x, y
# Simulate 7-day mission
t = np.linspace(0, 7*24, 1000) # hours
depth = np.array([glider_profile(ti) for ti in t])
x, y = glider_path(t)
fig = plt.figure(figsize=(12, 5))
# 3D path
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot(x, y, -depth, 'b-', lw=0.5)
ax1.set_xlabel('East (km)')
ax1.set_ylabel('North (km)')
ax1.set_zlabel('Depth (m)')
ax1.set_title('Glider 3D Path')
# Depth vs time
ax2 = fig.add_subplot(122)
ax2.plot(t, depth, 'b-', lw=1)
ax2.set_xlabel('Time (hours)')
ax2.set_ylabel('Depth (m)')
ax2.set_title('Glider Sawtooth Profile')
ax2.invert_yaxis()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
# Mission statistics
distance = np.sqrt(x[-1]**2 + y[-1]**2)
num_profiles = int(t[-1] / 6)
print(f"7-day mission statistics:")
print(f" Distance traveled: {distance:.0f} km")
print(f" Number of profiles: {num_profiles}")