水下潜航器 · 高中原理与实践

适合高中生,系统学习水下机器人的流体力学基础、推进系统设计、传感器融合、控制算法与编程实践。

一、水下环境物理基础

1.1 水压与深度关系

P = P₀ + ρgh
深度压力(atm)工程挑战
0m1水面
100m11普通密封
1000m101耐压舱体、油补偿
6000m601钛合金球舱、浮力材料
11000m1101马里亚纳海沟,特殊设计

1.2 水的密度与盐度影响

  • 淡水密度:1000 kg/m³
  • 海水密度:1025 kg/m³(盐度 3.5%)
  • ROV 从淡水进入海水,浮力增加约 2.5%,需要重新配平

1.3 水下通信

通信方式频率水中衰减适用场景
无线电(WiFi)2.4 GHz几厘米不可用
蓝牙2.4 GHz几厘米不可用
声波通信10-50 kHz低远距离(km 级),带宽低
有线(以太网)-无ROV 常用,高带宽
光通信蓝光 450nm中短距离高速(实验阶段)

二、推进系统设计

2.1 推进器选型

关键参数:

  • 推力(N):推进器产生的推力大小
  • 电压(V):工作电压(通常 12V-48V)
  • 响应时间(ms):从指令到推力的延迟
  • 防水等级:IP68(水下连续工作)

2.2 矢量推进布局

四推进器 X 型布局:

    [TL]         [TR]
      \         /
       \       /
        [舱体]
       /       \
      /         \
    [BL]         [BR]

运动混合算法:

F_TL = F_forward + F_yaw + F_pitch
F_TR = F_forward - F_yaw + F_pitch
F_BL = F_forward + F_yaw - F_pitch
F_BR = F_forward - F_yaw - F_pitch

2.3 PID 深度控制

class DepthPID:
    def __init__(self, kp, ki, kd):
        self.kp = kp
        self.ki = ki
        self.kd = kd
        self.integral = 0
        self.prev_error = 0
    
    def compute(self, target_depth, current_depth, dt):
        error = target_depth - current_depth
        self.integral += error * dt
        derivative = (error - self.prev_error) / dt
        self.prev_error = error
        
        output = (self.kp * error + 
                  self.ki * self.integral + 
                  self.kd * derivative)
        return output  # 正值=下潜,负值=上浮

三、传感器系统

3.1 深度传感器

MS5837 水压传感器:

  • 测量范围:0-120 bar(对应 ~1200m 深度)
  • 分辨率:0.2 mbar(约 2mm 水深)
  • 接口:I2C
  • 原理:压阻式,硅膜片变形 → 电阻变化 → 电压变化

3.2 IMU 水下导航

水下无法使用 GPS,靠 IMU 进行航位推算(Dead Reckoning):

位置(t+1) = 位置(t) + 速度(t) × Δt + 0.5 × 加速度(t) × Δt²

问题:IMU 有累积误差,长时间使用会漂移。

解决方案:

  • 多普勒速度仪(DVL):测量对地速度,修正漂移
  • USBL 水下定位:声学定位系统,精度 0.1% 水深
  • 视觉 SLAM:水下特征点匹配(实验性)

3.3 声呐系统

声呐类型用途原理
单波束测深正下方水深单点测量
多波束声呐海底地形扇形扫描,生成 3D 地图
前视声呐避障类似超声波,但频率更高
侧扫声呐海底成像左右扫描,生成灰度图

四、水下编程实践

4.1 Arduino ROV 控制板编程

#include <Servo.h>

Servo leftThruster;
Servo rightThruster;
Servo verticalThruster;

void setup() {
  Serial.begin(115200);
  leftThruster.attach(9);
  rightThruster.attach(10);
  verticalThruster.attach(11);
  
  // ESC 初始化
  leftThruster.writeMicroseconds(1500);
  rightThruster.writeMicroseconds(1500);
  verticalThruster.writeMicroseconds(1500);
  delay(2000);
}

void loop() {
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    int value = Serial.parseInt();
    
    switch(cmd) {
      case 'L':  // 左推进器
        leftThruster.writeMicroseconds(1500 + value);
        break;
      case 'R':  // 右推进器
        rightThruster.writeMicroseconds(1500 + value);
        break;
      case 'V':  // 垂直推进器
        verticalThruster.writeMicroseconds(1500 + value);
        break;
      case 'X':  // 停止
        leftThruster.writeMicroseconds(1500);
        rightThruster.writeMicroseconds(1500);
        verticalThruster.writeMicroseconds(1500);
        break;
    }
  }
}

4.2 Python 上位机控制

import serial
import time

class ROVController:
    def __init__(self, port='/dev/ttyUSB0', baud=115200):
        self.ser = serial.Serial(port, baud, timeout=1)
        time.sleep(2)
    
    def send(self, cmd, value=0):
        self.ser.write(f"{cmd}{value}\n".encode())
    
    def forward(self, speed=200):
        self.send('L', speed)
        self.send('R', speed)
    
    def turn(self, speed=150):
        self.send('L', speed)
        self.send('R', -speed)
    
    def dive(self, speed=100):
        self.send('V', speed)
    
    def surface(self, speed=100):
        self.send('V', -speed)
    
    def stop(self):
        self.send('X')
    
    def close(self):
        self.stop()
        self.ser.close()

# 使用示例
rov = ROVController()
rov.forward(200)
time.sleep(3)
rov.dive(100)
time.sleep(2)
rov.stop()
rov.close()

五、综合项目:水下搜索与救援模拟

5.1 项目目标

设计一台 ROV,在模拟水池中完成:

  • 从起点下潜到指定深度
  • 沿预定路线前进
  • 识别水底目标物(颜色/形状)
  • 用机械臂抓取目标
  • 带回起点并上浮

5.2 系统架构

摄像头 → 目标识别 → 位置决策
    ↓
深度传感器 → PID 深度控制 → 垂直推进器
    ↓
IMU → 航向保持 → 水平推进器
    ↓
控制板 ← 串口指令 ← 上位机/脑电接口

5.3 评分标准

项目分值
下潜到指定深度(±10cm)20 分
沿路线前进不偏离20 分
识别目标物20 分
抓取目标25 分
安全返回15 分

推荐资源