1. 无人船系统架构概述
2USV-M系列无人船采用典型的双层控制系统架构,由飞控单元(Flight Controller)和机载计算机(Onboard Computer)构成核心控制体系。这种设计在工业级无人系统中非常普遍,既保证了实时控制的可靠性,又为复杂算法提供了足够的算力支持。
飞控单元通常采用STM32F7系列微控制器,运行基于FreeRTOS的实时控制系统,负责:
- 传感器数据采集(IMU、GPS、罗盘等)
- 舵机/电机控制信号生成
- 低延迟的PID控制回路
- 硬件看门狗监控
机载计算机则多选用NVIDIA Jetson系列或Intel NUC平台,运行Ubuntu系统,主要承担:
- 视觉SLAM计算
- 路径规划算法
- 通信协议栈处理
- 任务调度管理
关键设计原则:飞控处理毫秒级响应的硬实时任务,机载计算机处理秒级响应的软实时任务,二者通过确定的通信接口进行数据交换。
2. 通信接口技术选型
2.1 物理层连接方案
实际项目中常见的连接方式有三种:
-
串口直连(UART)
- 典型配置:115200bps,8N1
- 优点:接线简单(TX/RX/GND三线制),协议栈轻量
- 缺点:传输距离受限(建议<3米),无硬件流控
-
以太网连接
- 典型方案:百兆PHY芯片+RJ45接口
- 优势:带宽充足(适合传输图像数据),传输距离长
- 挑战:需要飞控端集成网络协议栈
-
CAN总线
- 配置示例:500kbps终端电阻匹配
- 特点:抗干扰强,适合多设备组网
- 应用场景:需要扩展多个外设的复杂系统
我们团队在2USV-M上最终选择了串口+以太网双通道方案:
- 关键控制指令走串口(保障实时性)
- 大数据量传输走以太网(如图像流)
2.2 协议栈实现细节
MAVLink协议实践
python复制# 机载电脑端MAVLink初始化示例
from pymavlink import mavutil
# 创建串口连接
master = mavutil.mavlink_connection(
'/dev/ttyACM0',
baud=115200,
source_system=1,
source_component=91)
# 发送心跳包
master.mav.heartbeat_send(
mavutil.mavlink.MAV_TYPE_SURFACE_BOAT,
mavutil.mavlink.MAV_AUTOPILOT_GENERIC,
0, 0, 0)
关键参数说明:
source_system:本机系统ID(需与飞控区分)source_component:组件类型标识(91表示机载计算机)- 心跳间隔:建议1Hz(超时判定建议3秒)
3. 数据交互设计规范
3.1 消息分类与优先级
根据我们的实测数据,建议按以下标准划分消息类型:
| 消息类型 | 频率 | 延迟要求 | 传输通道 |
|---|---|---|---|
| 姿态控制指令 | 50Hz | <20ms | 串口 |
| 传感器原始数据 | 100Hz | <50ms | 串口 |
| 路径点数据 | 0.2Hz | <500ms | 以太网 |
| 图像数据 | 0.1Hz | <1s | 以太网 |
3.2 数据包校验方案
在海洋环境中,我们采用三级校验机制:
- 字节级校验:每个数据包附加CRC16校验码
- 会话级校验:关键指令要求ACK确认
- 应用层校验:重要数据带时间戳和序列号
校验失败处理策略:
- 单次错误:重传(最大3次)
- 连续错误:触发通信报警
- 持续故障:切换备用通道
4. 实战问题排查指南
4.1 典型故障现象与处理
案例1:心跳包超时
- 现象:地面站显示"飞控丢失"
- 排查步骤:
- 检查物理连接(万用表测量串口电压)
- 使用
minicom查看原始数据流 - 确认双方波特率设置一致
- 检查飞控固件版本兼容性
案例2:数据包校验失败率高
- 解决方案:
- 降低通信速率(从115200改为57600)
- 增加磁环抑制干扰
- 改用屏蔽双绞线
4.2 通信性能优化技巧
-
带宽分配策略
- 串口通道:预留20%带宽余量
- 网络通道:启用QoS优先级标记
-
数据压缩方案
- 姿态数据:采用delta编码(可减少40%体积)
- 路径数据:使用相对坐标表示
-
缓存管理
- 飞控端:环形缓冲区(建议深度50-100包)
- 机载端:双缓冲交换机制
5. 系统集成测试方案
5.1 测试环境搭建
推荐使用以下工具链:
-
硬件层面:
- USB转串口调试器(建议FTDI芯片)
- 网络封包分析仪(如Wireshark)
-
软件工具:
bash复制# 串口调试命令示例 stty -F /dev/ttyUSB0 115200 raw cat /dev/ttyUSB0 | hexdump -C
5.2 自动化测试脚本
我们开发的Python测试框架核心逻辑:
python复制class ComTest:
def __init__(self):
self.mav = MAVConnection()
self.logger = DataLogger()
def test_latency(self):
"""往返延迟测试"""
t1 = time.time()
self.mav.send_ping()
while not self.mav.got_pong():
if time.time() - t1 > 1.0:
raise TimeoutError
latency = (time.time() - t1) * 1000
self.logger.record(latency)
测试指标合格标准:
- 平均延迟:<50ms(串口)、<100ms(网络)
- 丢包率:<0.1%(关键指令)
- 持续稳定时间:>8小时
6. 可靠性设计要点
6.1 看门狗机制实现
飞控端看门狗配置示例(基于STM32 HAL库):
c复制// 独立看门狗初始化
void IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Reload = 0xFFF;
hiwdg.Init.Window = 0xFFF;
[HAL](https://taotoken.net/?utm_source=hardware)_IWDG_Init(&hiwdg);
}
// 喂狗任务(1kHz定时器调用)
void IWDG_Refresh(void)
{
if(comms_ok) {
HAL_IWDG_Refresh(&hiwdg);
}
}
6.2 故障恢复流程
通信中断后的处理逻辑:
- 第一阶段(<1秒):尝试原通道恢复
- 第二阶段(1-3秒):切换备用通道
- 第三阶段(>3秒):进入安全模式(悬停或返航)
我们在实际项目中验证的恢复成功率:
- 瞬时干扰:99.7%自动恢复
- 持续故障:100%触发安全机制
7. 开发调试心得
-
示波器使用技巧
- 测量串口信号时,注意触发方式设置为"下降沿"
- 网络信号建议用差分探头测量
-
日志分析要点
- 关键字段:时间戳、信号强度、CRC错误计数
- 推荐工具:PlotJuggler可视化分析
-
现场调试禁忌
- 避免同时使用多个无线设备(如WiFi图传)
- 不要带电插拔串口连接器
- 海上测试时做好防水处理(特别是RJ45接口)
经过多个项目的迭代,我们总结出最稳定的参数组合:
- 串口参数:115200 8N1 + 50ms超时
- 网络参数:MTU 1500 + TCP_NODELAY
- 缓冲设置:双128字节环形缓冲
