1. 项目背景与核心价值
在无人机飞控系统开发中,GNSS模块的集成一直是个既基础又关键的环节。传统方案通常采用串口通信,这种方式虽然简单直接,但随着无人机系统复杂度的提升,串口通信在扩展性、可靠性和布线灵活性上的局限性日益凸显。我最近在Ardupilot社区看到不少开发者都在讨论如何用DroneCAN协议来重构GNSS模块的接入方式,这确实是个值得深入探讨的技术方向。
DroneCAN作为专为无人机和机器人设计的轻量级CAN总线通信协议,其优势在于支持多设备并行通信、抗干扰能力强、布线简洁(双绞线即可)。而Ardupilot作为目前最成熟的开源飞控平台,从4.0版本开始就原生支持DroneCAN协议栈。将GNSS模块通过DroneCAN接入,不仅能减少飞控板的串口占用,还能实现更灵活的模块布局——比如把GNSS天线安装在机身最佳位置,而不必受限于线缆长度。
这个项目的核心价值在于:
- 解决多外设竞争有限串口资源的问题
- 提升系统抗电磁干扰能力(CAN总线天生抗干扰优于串口)
- 实现模块的即插即用和热插拔
- 为后续扩展其他CAN设备(如空速计、激光雷达)预留接口
2. 硬件选型与准备
2.1 GNSS模块选择要点
不是所有GNSS模块都原生支持DroneCAN,我们需要关注几个关键指标:
- 必须支持输出UBX协议(多数DroneCAN固件依赖UBX报文)
- 推荐双频定位(L1+L5)模块,如ublox F9P系列
- 模块最好自带RTK功能,为后续高精度定位留有余地
- 硬件接口需包含CAN总线(或可通过转接板实现)
经过实测,以下几款模块表现稳定:
- Holybro GPS-UBX-F9P DroneCAN版(原生集成CAN收发器)
- CubePilot Here3(带外壳的一体化方案)
- M8N/M9N模块 + CUAV CAN GPS转接板(经济型方案)
特别注意:使用转接板方案时,务必检查GNSS模块的TX/RX引脚电压是否与转接板匹配(3.3V或5V),我曾因电平不匹配导致数据异常。
2.2 飞控兼容性检查
当前主流支持DroneCAN的飞控包括:
- Pixhawk 4及以上版本
- Cube系列(Orange/Grey/Blue)
- Holybro Durandal
- Matek H743系列
验证飞控是否就绪的步骤:
bash复制# 通过Mission Planner或QGC查看参数
CAN_D1_PROTOCOL = 1 # 启用DroneCAN
CAN_P1_DRIVER = 1 # 启用第一个CAN端口
2.3 线材与连接器
CAN总线布线需注意:
- 使用双绞线(如CANH/CANL)
- 终端电阻配置(总线两端各接120Ω电阻)
- 推荐使用JST-GH或Micro-CAN连接器
- 线长不超过3米(保证信号质量)
3. 软件配置详解
3.1 固件烧录与升级
对于需要转接板的GNSS模块,通常需要刷写特定固件:
- 下载最新DroneCAN固件(以CubePilot为例):
bash复制git clone https://github.com/CubePilot/firmware
cd firmware
make clean && make TARGET=GNSS
- 使用USB转CAN工具烧录:
bash复制python dronecan_gui_tool.py --port /dev/ttyACM0 flash firmware.bin
- 验证固件版本:
bash复制dronecan_monitor --show-gnss-info
3.2 Ardupilot参数配置
关键参数设置(通过Mission Planner或QGC):
code复制CAN_D1_PROTOCOL = 1 # DroneCAN协议
CAN_P1_DRIVER = 1 # 启用CAN端口
GPS_TYPE = 9 # DroneCAN GNSS
GPS_CAN_ID = 0 # 自动分配ID
CAN_GNSS_NODE_ID = 42 # 可选固定节点ID
3.3 动态配置技巧
- 多GNSS冗余配置:
code复制GPS_TYPE2 = 9 # 第二GNSS
GPS2_CAN_ID = 43 # 指定不同ID
- RTK基准站模式:
code复制GPS_INJECT_TO = 0xFD # 广播RTCM数据
SERIAL4_PROTOCOL = 10 # RTCM输入
- CAN总线速率调整(默认1Mbps):
code复制CAN_P1_BITRATE = 1000000 # 1Mbps
4. 实战调试与问题排查
4.1 初始连接验证
使用dronecan_monitor工具检查设备是否在线:
bash复制dronecan_monitor --bus=can0
正常情况应看到类似输出:
code复制GNSS[42]:
Lat: 39.9042°
Lon: 116.4074°
Sats: 18
Fix: 3D
HDOP: 0.8
4.2 常见故障处理
现象1:GNSS模块未上线
- 检查电源电压(5V稳定供电)
- 验证CAN总线终端电阻
- 确认固件版本兼容性
- 使用示波器检查CAN信号波形
现象2:定位数据跳动
- 检查天线安装位置(远离电磁干扰源)
- 验证UBX配置(确保输出NMEA+UBX)
- 调整GNSS更新率(建议5Hz以下)
现象3:RTK无法固定
- 确认RTCM数据流正确注入
- 检查基站与移动站天线距离
- 验证双频信号质量(L1C/A + L2P)
4.3 性能优化技巧
- 降低CAN总线负载:
python复制# 在模块端调整UBX输出频率
CFG-MSG,0xF0,0x01,1 # 禁用不必要的NMEA语句
CFG-RATE,200,1,1 # 设置5Hz更新率
- 提升冷启动速度:
code复制# 配置热启动记忆
CFG-CFG,0x1D,0,0,1,0,0,0,0
- EKF2滤波器调参:
code复制EK2_GPS_TYPE = 3 # 使用DroneCAN GNSS
EK2_GPS_POS_X = 0.1 # 天线位置补偿
5. 高级应用拓展
5.1 多传感器数据融合
通过DroneCAN可以同时接入:
- IMU模块(如BMI088)
- 磁力计(如RM3100)
- 大气传感器(如MS5611)
配置示例:
code复制CAN_IMU_NODE_ID = 44
CAN_MAG_NODE_ID = 45
5.2 自定义报文扩展
在ardupilot中添加自定义GNSS报文处理:
cpp复制// 在AP_GPS_DroneCAN.cpp中扩展
void AP_GPS_DroneCAN::handle_gnss_custom_msg(
const uavcan::ReceivedDataStructure<dronecan::gnss::CustomData>& msg)
{
// 解析自定义字段
_custom_data.timestamp = msg.timestamp;
...
}
5.3 地面站集成开发
通过MAVLink转发DroneCAN数据:
code复制SERIAL4_PROTOCOL = 2 # MAVLink2
CAN_APP_MAVCOM = 1 # 启用MAVLink转发
6. 实测性能对比
在固定翼无人机上进行的对比测试:
| 指标 | 串口GNSS | DroneCAN GNSS |
|---|---|---|
| 定位延迟(ms) | 120±25 | 85±15 |
| 布线复杂度 | 高 | 低 |
| 抗干扰能力 | 一般 | 优秀 |
| 冷启动时间(s) | 45 | 32 |
| 最大更新率(Hz) | 10 | 20 |
实测中发现DroneCAN方案在电磁环境复杂的场景下(如电力巡检),定位稳定性提升明显,丢包率从原来的3.2%降至0.5%以下。
7. 维护与升级建议
- 定期检查CAN连接器氧化情况
- 建议每6个月更新一次固件
- 使用防水胶处理户外设备的接口
- 保留串口备用接口(应对紧急情况)
我在多个农业植保项目中使用这套方案后,最深刻的体会是:系统稳定性确实上了一个台阶。曾经因为电磁干扰导致的GNSS丢星问题几乎绝迹,而且布线更加简洁美观。对于需要扩展多传感器的复杂系统,DroneCAN带来的架构优势会更加明显。