1. 项目背景与核心挑战
去年参加全国水下机器人巡检竞赛时,我们团队选择了树莓派+Pixhawk这套经典组合作为硬件基础。这种方案在学术界和工业界的水下探测领域已经应用了七八年,但真正要在竞赛中实现稳定可靠的自主巡检,依然需要解决三个核心问题:
首先是水下通信的实时性难题。普通WiFi在水下衰减严重,我们测试发现2.4GHz信号在3米水深时衰减达到20dB/m。这直接影响了树莓派与水面控制端的指令传输延迟,实测ROS话题传输延迟可能高达800ms。
其次是Pixhawk的姿态解算精度问题。虽然PX4固件已经对水下环境做了专门优化,但在有水流干扰的竞赛池中,仅靠IMU+气压计的组合定位,十分钟内就会产生1.5米以上的漂移误差。
最后是视觉算法的适应性挑战。水下图像存在严重的颜色失真和散射效应,标准OpenCV管道处理后的图像,SIFT特征点匹配成功率不足40%。这给基于视觉的管道缺陷检测带来了极大困难。
2. 硬件系统搭建与优化
2.1 树莓派外围电路改造
我们选用树莓派4B作为主控,但直接使用官方开发板会遇到两个致命问题:一是40pin GPIO接口在水下容易氧化短路,二是USB3.0接口在水压变化时可能接触不良。
解决方案:
- 使用环氧树脂封装GPIO排针,只保留必要的UART、I2C接口外露
- 用热熔胶固定所有USB接口,并改用IP68防水型USB-C供电接口
- 添加ADS1115模数转换模块,将Pixhawk的PWM信号转为I2C通信
实测防水改造后,系统可在5米水深连续工作4小时无故障。关键代码如下:
python复制def setup_gpio():
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 防水处理后的急停按钮
def read_ads1115():
import Adafruit_ADS1x15
adc = Adafruit_ADS1x15.ADS1115()
return adc.read_adc(0, gain=1) # 读取Pixhawk PWM转电压值
2.2 Pixhawk参数调优
针对水下场景,我们对PX4固件做了以下关键参数调整:
- EKF2_AID_MASK:禁用GPS,启用视觉位置估计
- MPC_THR_HOVER:设置为65%(默认值在水下推力不足)
- ROV_CTRL_LOSS_TIMEOUT:延长至10秒(防止通信短暂中断触发保护)
通过QGroundControl进行参数刷写时,发现USB连接经常中断。后来改用串口烧录固件,稳定性大幅提升:
bash复制px_uploader.py --port /dev/ttyACM0 px4fmuv5_default.px4
3. 水下视觉处理方案
3.1 图像增强算法
传统的水下图像增强方法如UDCP在处理绿色水体时效果不佳。我们改进的方案结合了:
- 基于物理模型的背景光估计
- 自适应颜色校正矩阵
- 引导滤波去噪
算法流程:
python复制def enhance_image(cv2_img):
# 第一步:估计背景光
bg_light = estimate_background_light(cv2_img)
# 第二步:传输图计算
transmission = calculate_transmission(cv2_img, bg_light)
# 第三步:颜色校正
corrected = color_correction(cv2_img, transmission)
return guided_filter(corrected, radius=15, eps=0.01)
实测该算法在浑浊水体中可将特征点匹配成功率提升至72%。
3.2 管道缺陷检测
采用改进的YOLOv4-tiny模型,针对水下环境做了三项优化:
- 输入层改为416x416分辨率
- 使用CIoU损失函数替代原版IoU
- 添加注意力机制模块
训练数据增强策略:
- 随机模拟水下光学效应
- 添加气泡噪声
- 运动模糊模拟
最终在测试集上达到89%的mAP,推理速度在树莓派上保持12FPS。
4. 控制系统实现
4.1 运动控制架构
采用分层控制策略:
- 顶层:ROS节点发布全局路径
- 中层:MAVROS转换到PX4指令
- 底层:PX4的MC_AttitudeControl
关键控制代码片段:
python复制class Controller:
def __init__(self):
self.pub = rospy.Publisher('/mavros/setpoint_position/local', PoseStamped, queue_size=10)
def move_to(self, x, y, z):
pose = PoseStamped()
pose.pose.position.x = x
pose.pose.position.y = y
pose.pose.position.z = z
self.pub.publish(pose)
4.2 抗流控制算法
针对竞赛场地的人造水流,设计了基于IMU反馈的PID抗流控制器:
- 水流扰动观测器:
math复制\hat{d} = \tau - J\ddot{q} - C(q,\dot{q})\dot{q} - g(q) - 自适应PID参数:
python复制def update_pid(self, error): self.Kp = 1.2 + 0.3 * abs(error) self.Ki = 0.05 if error < 0.1 else 0.01
实测该算法可将定位误差控制在±0.3m以内。
5. 通信系统优化
5.1 水声通信协议
采用定制TDMA协议,关键参数:
- 载波频率:25kHz
- 符号率:4kbps
- 帧结构:前导码(8B) + 包头(4B) + 数据(64B) + CRC(2B)
协议栈实现:
c复制typedef struct {
uint8_t preamble[8];
uint16_t seq_num;
uint16_t payload_len;
uint8_t data[64];
uint16_t crc;
} acoustic_frame_t;
5.2 数据压缩算法
针对传感器数据特点,采用差分编码+霍夫曼压缩:
- IMU数据:只传输变化量
- 图像数据:JPEG2000压缩
- 控制指令:自定义8bit编码
压缩比达到5:1,有效降低了传输延迟。
6. 系统集成与测试
6.1 压力测试方案
设计了三阶段测试流程:
- 静态测试:5米水深静止12小时
- 动态测试:模拟竞赛全程动作序列
- 故障注入:随机断开传感器连接
测试中发现的关键问题:
- 水深超过3米时,树莓派CPU温度下降导致时钟漂移
- Pixhawk的I2C总线在低温下出现偶发错误
解决方案:
- 添加加热片维持核心温度
- I2C总线改用更低速模式(100kHz)
6.2 竞赛现场调试
比赛前一天发现场地存在两个意外情况:
- 池底有强磁铁干扰电子罗盘
- 水面波浪导致光流传感器失效
紧急应对措施:
- 禁用磁力计,纯靠IMU+视觉定位
- 在Pixhawk中配置更高的光流信任度阈值
7. 关键问题与解决方案
7.1 树莓派实时性问题
默认Linux内核存在调度延迟,我们做了以下优化:
- 安装RT-Preempt补丁
- 设置CPU频率为固定性能模式
- 关键进程绑定到独立核心
bash复制sudo apt install linux-image-rt-rpi-v7
sudo cpufreq-set -g performance
taskset -c 3 rosrun my_node my_script.py
7.2 电源管理优化
实测发现当机械臂动作时,电压会骤降导致Pixhawk重启。解决方案:
- 添加10000μF电容缓冲
- 采用双电池供电方案
- 在软件中实现电压监测和急停
python复制def voltage_monitor():
while True:
v = read_voltage()
if v < 10.5:
emergency_stop()
break
8. 实际竞赛表现
在正式比赛中,我们的系统完成了:
- 管道巡检任务:3分12秒(满分)
- 阀门操作任务:一次成功
- 目标识别准确率:94%
遇到的意外情况处理:
- 临时增加的光线干扰:启用了备用照明系统
- 通信中断3秒:自动执行预设避障动作
最终获得技术分第一名,这些经验后来也被应用到工业级ROV开发中。
