一、传统网络架构的局限性与 DRONE CAN 的革新
在无人机及机器人控制系统中,多设备协同依赖高效通信协议。传统架构(如串口、I2C)采用 “主从模式”,由中央控制器统一协调所有设备,存在三大核心缺陷:
- 单点故障风险:主节点失效将导致全系统瘫痪,例如飞控故障会使传感器数据传输中断。
- 扩展性受限:新增设备需重新配置通信参数,涉及地址分配、波特率匹配等,增加开发周期。
- 带宽瓶颈:单帧数据量限制(如串口单帧最大 255 字节)无法满足实时传输多传感器融合数据(如 GPS+IMU 组合信息)的需求。
DRONE CAN 基于 CAN 总线扩展而来,采用去中心化架构,所有节点平等参与通信,无需中央控制器。这一设计从根本上解决了传统架构的痛点,成为无人机、自动驾驶等领域的主流通信协议。其核心优势在于:通过分布式节点协作提升系统可靠性,通过标准化数据结构降低设备互联成本,通过灵活的传输机制适配多场景数据需求。
二、DRONE CAN 去中心化架构的核心要素
1. 节点平等性与身份标识机制
DRONE CAN 网络中,所有设备(节点)地位平等,无主从之分。每个节点通过唯一的节点 ID(1-127 的整数)实现身份标识,ID 分配方式有两种:
- 静态配置:适用于固定拓扑网络,如飞控节点 ID 固定为 1,电机控制器固定为 10-15。
- 动态分配(DNA):通过 DNA 服务器(通常由飞控或网关担任)自动分配 ID。新节点接入时,广播 uavcan.protocol.DynamicNodeID.Claim 消息请求 ID,服务器通过 uavcan.protocol.DynamicNodeID.Allocation 消息确认分配结果,避免冲突。
节点 ID 是网络通信的基础,直接关联消息帧的源地址字段,确保数据路由的唯一性。
2. 数据传输的底层机制
(1)帧结构设计
DRONE CAN 采用 29 位扩展帧 ID,按功能划分为四个字段:
- 优先级(5 位):取值 0-31,数值越小优先级越高。紧急指令(如制动信号)设为 0,常规传感器数据设为 5-10。
- 服务 ID(8 位):标识消息所属服务类型,如传感器数据(0x64)、控制指令(0x0A)。
- 消息类型(9 位):细分服务下的具体功能,如陀螺仪数据(0xC8)、电池状态(0x20)。
- 源节点 ID(7 位):发送节点的唯一标识,对应 1-127 的节点 ID。
帧数据段承载实际 payload,结合高层协议可支持超 8 字节的大数据传输。
(2)通信模式
- 广播模式:节点向全网发送数据(如传感器周期性推送测量值),接收节点通过 ID 过滤机制仅处理相关消息。
- 请求 - 响应模式:节点发送特定请求(如查询电池电压),目标节点返回响应。该模式通过服务 ID 与目标节点 ID 实现定向通信。
(3)大数据传输方案
针对超过 8 字节的数据(如 3D 地图切片、固件升级包),DRONE CAN 采用分片传输机制:
- 首帧:包含总长度、传输 ID(用于标识同一数据块),标记传输开始。
- 续帧:携带分片数据,按序号递增传输。
- 末帧:标记传输结束,接收方基于传输 ID 重组数据。
传输 ID 为 3 位整数(0-7),支持并发传输 8 个数据块,避免分片混淆。
3. 冗余与容错设计
为满足安全关键场景需求,DRONE CAN 引入多层冗余机制:
- 硬件冗余:支持双 CAN 总线接口,主总线故障时自动切换至备用总线。例如 Pixhawk 飞控的 CAN1 与 CAN2 接口可配置为冗余通道。
- 数据冗余:关键指令(如电机控制信号)采用多节点交叉验证,接收方需收到至少两个节点的一致指令才执行操作。
- 超时容错:节点定期发送心跳包(uavcan.protocol.NodeStatus),超时未收到则标记为离线,触发备用节点接管流程。
4. 时间同步机制
高精度时间同步是多传感器数据融合的前提,DRONE CAN 采用主从同步模式:
- 同步主节点:周期性(默认 10ms)广播 uavcan.protocol.GlobalTimeSync 消息,包含 UTC 时间与本地时钟偏差。
- 从节点:接收同步消息后校准本地时钟,同步精度可达 ±1μs。
同步消息优先级设为最高(0 级),确保在总线拥堵时仍能优先传输。
三、DSDL:数据结构的标准化描述
1. DSDL 的核心作用
DRONE CAN 采用 DSDL(Data Structure Description Language)定义数据结构,确保不同厂商设备对数据的解析一致性。其核心价值在于:
- 强类型约束:明确字段类型(如 uint8、float32)与取值范围,避免解析歧义。
- 紧凑编码:按小端字节序(Little-Endian)打包数据,无冗余字段,提升传输效率。
- 可扩展性:支持嵌套结构与数组,适配复杂数据类型(如姿态角四元数)。
2. 语法规则与数据类型
DSDL 语法简洁,支持以下核心元素:
- 基本类型:整数(uint8/16/32/64、int8/16/32/64)、浮点数(float16/32/64)、布尔值(bool)。
- 复合类型:
- 结构体(struct):组合多个字段,如 NodeStatus 包含健康状态、运行模式、uptime 等。
- 枚举(enum):定义离散状态,如 Health 枚举包含 OK(0)、WARNING(1)、CRITICAL(3)。
- 数组:固定长度(如 float32[3] 表示三维向量)或动态长度(需指定最大长度)。
- 常量与注释:支持常量定义(如 MAX_SPEED = 50.0)与单行注释(//)。
3. 编译与代码生成
DSDL 定义需通过编译器转换为目标语言代码(C、Python 等),流程如下:
- 编写 DSDL 文件(如 uavcan/si/unit/angle/AngularVelocity.1.0.dsdl)。
- 使用 libcanard 或 dronecan 库的编译器生成序列化 / 反序列化代码。
- 生成的代码包含字段偏移量计算、CRC 校验等逻辑,直接集成到设备固件中。
示例 DSDL 定义:
# 角速度数据结构定义
float32 x # 绕X轴角速度,单位:rad/s
float32 y # 绕Y轴角速度,单位:rad/s
float32 z # 绕Z轴角速度,单位:rad/s
编译器生成的 C 代码片段:
// 序列化函数
static int serialize_AngularVelocity(const AngularVelocity* obj, uint8_t* buffer, size_t buffer_len) {
// 字段打包逻辑
memcpy(buffer, &obj->x, 4);
memcpy(buffer + 4, &obj->y, 4);
memcpy(buffer + 8, &obj->z, 4);
return 12; // 总长度12字节
}
4. DSDL 与其他协议的对比
| 特性 | DSDL | JSON | PROTOBUF |
| 数据体积 | 最小(紧凑编码) | 最大(文本格式) | 中等(二进制编码) |
| 解析效率 | 高(固定偏移量) | 低(文本解析) | 中(动态解析) |
| 类型安全性 | 强(编译时校验) | 弱(运行时校验) | 强(编译时校验) |
| 实时性支持 | 优(适配嵌入式) | 差(不适用于实时) | 中(需优化配置) |
DSDL 专为资源受限的嵌入式场景设计,在无人机领域的适配性显著优于其他协议。
四、网络管理与监控
1. 节点状态监控
每个节点需周期性(默认 1s)广播 uavcan.protocol.NodeStatus 消息,包含以下字段:
- 健康状态(health):8 位整数,映射至 Health 枚举。
- 模式(mode):8 位整数,标识节点工作模式(如 OPERATIONAL、CONFIGURATION)。
- 运行时间(uptime_sec):32 位整数,节点启动后的秒数。
- ** vendor_specific_status_code**:16 位整数,厂商自定义状态码(如传感器校准状态)。
网络中的节点通过监听该消息构建拓扑图,飞控可基于健康状态触发故障处理(如电量低时切换至返航模式)。
2. 动态配置与固件升级
DRONE CAN 支持远程配置设备参数与固件升级:
- 参数配置:通过 uavcan.protocol.param.Get 与 uavcan.protocol.param.Set 消息读写参数,如调整传感器采样率。
- 固件升级:采用 uavcan.protocol.file.Read 与 uavcan.protocol.file.Write 消息传输固件包,支持断点续传。
升级过程中,节点需发送 uavcan.protocol.UpdateProgress 消息反馈进度,避免升级超时。
3. 调试工具链
- DroneCAN GUI Tool:图形化界面,支持实时显示网络拓扑、消息收发、参数配置。
- CAN 总线分析仪:如 Vector VN1630,捕获原始 CAN 帧用于协议调试。
- 命令行工具:dronecan-cli 支持脚本化测试,如批量发送控制指令。
五、实战案例:无人机传感器网络部署
1. 硬件配置
- 主控制器:Pixhawk 6X 飞控(节点 ID=1)。
- 传感器:
- 陀螺仪(节点 ID=10):通过 CAN 总线传输角速度数据。
- 气压计(节点 ID=11):提供高度信息。
- GPS 模块(节点 ID=12):输出位置与速度。
- 执行器:4 个无刷电调(节点 ID=20-23)。
- 冗余总线:CAN1(主)与 CAN2(备用)通过 CANHUB 连接所有节点。
2. 软件配置
- 飞控参数:
- CAN_P1_DRIVER=1(启用 CAN1 接口)。
- CAN_D1_PROTOCOL=1(配置为 DRONE CAN 协议)。
- CAN_TIMEOUT=500(节点超时阈值 500ms)。
- 节点 ID 分配:
- 飞控与电调采用静态 ID。
- 传感器通过 DNA 动态获取 ID,飞控作为 DNA 服务器。
- 数据流程:
- 传感器按 100Hz 广播数据(优先级 5)。
- 飞控融合数据后,按 500Hz 向电调发送控制指令(优先级 0)。
- 电调反馈转速与温度(优先级 3)。
3. 性能指标
- 总线负载:峰值负载 < 50%(确保紧急消息传输带宽)。
- 端到端延迟:传感器数据从发送到飞控接收 < 10ms。
- 容错能力:单传感器离线时,飞控自动切换至冗余传感器数据。
六、协议安全性与可靠性保障
1. 数据完整性校验
DRONE CAN 采用 CRC-16-CCITT 算法对以下内容校验:
- 数据 payload(分片传输时对整个数据块校验)。
- 消息元数据(如传输 ID、分片序号)。
接收方校验失败则发送错误帧,发送方触发重传(最多 3 次)。
2. 总线冲突仲裁
CAN 总线采用 CSMA/CA(载波监听多路访问 / 冲突避免)机制:
- 节点发送前监听总线,空闲时开始传输。
- 冲突发生时,优先级低的节点主动退避,优先级高的节点继续传输。
该机制确保紧急消息(如故障报警)在总线冲突时仍能优先传输。
3. 负载控制
节点发送频率受以下规则限制:
- 高优先级消息(如控制指令)≤ 1kHz。
- 中优先级消息(如传感器数据)≤ 100Hz。
- 低优先级消息(如日志)≤ 1Hz。
飞控可通过 uavcan.protocol.Limit 消息动态调整节点发送速率,避免总线拥塞。
七、DRONE CAN 与 UAVCAN 的演进关系
DRONE CAN 源于 UAVCAN v0.9 版本,因 UAVCAN v1.0 引入不兼容变更,行业选择以 DRONE CAN 名义延续 v0.9 生态。两者核心差异在于:
- 兼容性:DRONE CAN 保持与 v0.9 设备兼容,UAVCAN v1.0 需重新开发。
- 功能扩展:DRONE CAN 新增无人机专用消息类型(如植保机喷头控制),UAVCAN v1.0 侧重通用性。
未来 DRONE CAN 将逐步支持 CAN FD(灵活数据速率),提升单帧数据量至 64 字节,传输速率至 8Mbps,满足高清图像传输需求。
八、总结
DRONE CAN 以去中心化架构为核心,通过节点平等通信、标准化数据结构(DSDL)、冗余容错设计,解决了传统协议在可靠性、扩展性与实时性上的不足。其技术特点可概括为:
- 无主节点设计提升系统抗故障能力。
- 分片传输与优先级机制适配多类型数据需求。
- DSDL 实现跨设备数据解析一致性。
- 冗余与同步机制满足安全关键场景要求。
对于无人机开发者,掌握 DRONE CAN 可显著降低多设备互联成本,加速系统集成。随着 CAN FD 与 AI 传感器的普及,DRONE CAN 将在更广泛的智能装备领域发挥核心作用。
参考资料
- DRONE CAN 官方规范:Page Redirection
- ArduPilot DRONE CAN 配置指南:DroneCAN Setup — Plane documentation
- Libcanard 库文档:https://github.com/Canard-Network/libcanard
2202

被折叠的 条评论
为什么被折叠?



