2. DroneCAN基础

DroneCAN 是无人机领域广泛使用的轻量级设备总线协议,它建立在经典 CAN 总线之上,用于电调、GPS、罗盘、空速计、电源模块等设备之间的可靠通信。理解 DroneCAN,不能只停留在“能连上、能识别”的层面,而应掌握其底层 CAN 差分信号原理、协议栈分层、报文格式、节点 ID 分配规则以及通信机制。只有把这些基础打牢,后续配置电调、调试 GPS、排查总线故障时才能有的放矢。

一、CAN总线原理:差分信号与仲裁机制

CAN(Controller Area Network)是一种多主、串行、差分总线。它使用两根信号线 CAN_H 和 CAN_L,通过两者电压差表示显性位(逻辑0)和隐性位(逻辑1)。差分传输使 CAN 对共模干扰有很强抑制能力,适合无人机上电机、电调、电源等强噪声环境。

CAN 总线两端必须各接一个 120Ω 终端电阻,用于吸收信号反射。若终端电阻缺失或只接一端,波形会出现振铃,表现为通信时断时续、错误帧增多。CAN 采用非破坏性逐位仲裁:当多个节点同时发送时,显性位会覆盖隐性位,发送隐性位却检测到显性位的节点立即退出仲裁,转为接收。因此,ID 数值越小,优先级越高。DroneCAN 中,节点 ID 越小,通常意味着该节点在总线上的优先级越高。

CAN 标准帧为 11 位 ID,扩展帧为 29 位 ID。DroneCAN 使用扩展帧,以容纳源节点 ID、目标节点 ID、消息类型等字段。

二、DroneCAN协议栈:从物理层到应用层

DroneCAN 协议栈可划分为四层:物理层、数据链路层、传输层和应用层。物理层即 CAN 收发器与双绞线;数据链路层负责位填充、CRC 校验、应答和仲裁;传输层负责拆包、重组、流控和确认;应用层定义具体设备类型、参数、命令和状态。

DroneCAN 的核心设计是“面向消息”而非“面向寄存器”。每个设备通过发布消息和订阅消息交换数据。例如,电调周期性发布 uavcan.equipment.esc.Status,飞控订阅后获得转速、电压、电流、温度;GPS 发布 uavcan.equipment.gnss.Fix,飞控订阅后获得经纬度、高度、卫星数。这种发布/订阅模型使设备之间解耦,便于扩展。

DroneCAN 协议栈分层与扩展帧报文结构 协议栈分层 应用层 设备类型 / 参数 / 命令 传输层 拆包 / 重组 / 流控 数据链路层 仲裁 / CRC / 应答 物理层 CAN_H / CAN_L / 120Ω DroneCAN 扩展帧字段 29 位标识符(ID) 优先级 | 消息类型 | 源节点ID | 目标节点ID 数据长度码 DLC 0~8 字节,经典 CAN 单帧上限 数据场 Data DroneCAN 消息负载,超过 8 字节需分包 CRC 与应答场 15 位 CRC 校验,接收节点拉低 ACK 位填充与错误帧 连续 5 位同值插入 1 位,错误时发送错误帧

三、报文格式:扩展帧与消息类型

DroneCAN 使用 CAN 扩展帧,29 位标识符被划分为多个字段。典型划分包括:消息优先级、消息类型 ID、源节点 ID、目标节点 ID(单播时)或广播标志。数据场最多 8 字节,若消息负载超过 8 字节,传输层会将其拆分为多个 CAN 帧,接收端按传输层协议重组。

DroneCAN 消息分为四类:

  • 广播消息:无目标节点,所有节点均可接收,如状态发布。
  • 单播消息:指定目标节点 ID,用于参数读写、命令下发。
  • 服务请求/响应:如 uavcan.protocol.param.GetSet,用于配置参数。
  • 动态节点 ID 分配消息:用于新节点入网时申请 ID。

下面是一个典型的 DroneCAN 参数读取请求示例,使用 uavcan.protocol.param.GetSet 服务:

# 请求读取参数 ESC_INDEX
uavcan.protocol.param.GetSet.Request:
  name: "esc_index"
  index: 0
  value: empty

# 响应返回参数值
uavcan.protocol.param.GetSet.Response:
  name: "esc_index"
  value:
    integer_value: 1
  default_value:
    integer_value: 0
  max_value:
    integer_value: 255
  min_value:
    integer_value: 0

四、节点ID分配与通信机制

每个 DroneCAN 节点必须拥有唯一节点 ID,范围通常为 1~127。节点 ID 分配有两种方式:静态分配和动态分配。静态分配由人工在参数中指定,适合设备数量固定、拓扑清晰的场景;动态分配由总线上的分配器节点统一管理,新节点上电后发送 uavcan.protocol.dynamic_node_id.Allocation 请求,分配器根据当前占用情况返回可用 ID。

通信机制上,DroneCAN 采用“发布/订阅 + 请求/响应”混合模型。发布者按固定频率广播消息,订阅者根据消息类型和源节点 ID 过滤接收。请求/响应用于参数配置、固件升级、节点状态查询等需要确认的场景。总线负载率是重要指标,建议控制在 50% 以下,否则高优先级消息可能被延迟。

项目 说明 典型值/建议
节点 ID 范围 DroneCAN 节点唯一标识 1~127,0 通常保留
终端电阻 总线两端各一个 120Ω,不可省略
波特率 CAN 总线速率 1 Mbps(无人机常用)
单帧数据长度 经典 CAN 数据场 最多 8 字节
总线负载率 通信占用比例 建议 < 50%
消息优先级 由 ID 数值决定 ID 越小优先级越高

五、案例与常见误区复盘

某四轴无人机使用 DroneCAN 电调与 GPS,上电后飞控只能识别部分电调。排查发现:总线末端只接了一个 120Ω 电阻,且电调节点 ID 存在重复。修正终端电阻并重新分配节点 ID 后,所有设备正常识别。这个案例说明,物理层和节点 ID 是 DroneCAN 稳定通信的两大基石。

常见误区:把 DroneCAN 当成普通串口,忽略终端电阻和节点 ID 唯一性;或者认为总线速率越高越好,实际上 1 Mbps 下总线长度和节点数量都受限,过长或节点过多会导致通信失败。

复盘要点:第一,上电前检查 CAN_H/CAN_L 是否接反、终端电阻是否为 120Ω;第二,使用 uavcan.protocol.NodeStatus 确认每个节点在线;第三,通过参数工具检查节点 ID 是否冲突;第四,观察总线负载率,避免高频消息挤占带宽。掌握这些基础,后续配置电调和 GPS 时就能快速定位问题,而不是盲目更换硬件。