2. UAVCAN协议基础
UAVCAN 是面向无人机与嵌入式实时网络的高层协议,它并非替代 CAN 总线,而是构建在 CAN 物理层与数据链路层之上的应用层协议。理解 UAVCAN 传感器节点开发,必须从 CAN 总线的差分信号、仲裁机制开始,再逐层向上理解 UAVCAN 的协议栈、帧格式以及节点 ID 的分配逻辑。本节将围绕这四个核心知识点展开,帮助你在后续编写节点固件时,清楚每一帧数据从传感器到总线、再从总线到飞控的完整路径。
一、CAN总线原理:差分信号与优先级仲裁
CAN 总线采用差分信号传输,CAN_H 与 CAN_L 两根线之间的电压差决定总线电平。显性电平(逻辑 0)通常对应约 2V 压差,隐性电平(逻辑 1)对应接近 0V 压差。这种差分结构使 CAN 在电机、电调等强干扰环境中仍能稳定通信。CAN 总线两端必须各接一个 120Ω 终端电阻,用于吸收信号反射,否则长线通信时波形会出现振铃,导致位错误。
CAN 最具特色的机制是“非破坏性逐位仲裁”。当多个节点同时发送时,节点在发送每一位的同时回读总线电平。若某节点发送隐性位(1)却读回显性位(0),说明有更高优先级节点正在发送,该节点立即退出仲裁,转为接收状态,且不会破坏已获胜节点的报文。这意味着 CAN 的优先级由报文 ID 决定:ID 数值越小,优先级越高。对于 UAVCAN 传感器节点,这意味着传感器数据帧的 ID 分配会直接影响实时性。
二、UAVCAN协议栈分层
UAVCAN 协议栈可划分为四层:物理层、传输层、应用层和节点管理层。物理层即 CAN 总线收发器与差分信号;传输层负责帧的拆分、重组、传输类型(单帧、首帧、连续帧、尾帧)以及 CRC 校验;应用层定义数据类型、服务、消息编码规则;节点管理层负责节点 ID 分配、节点状态监控与固件更新。
在传感器节点开发中,你主要与传输层和应用层打交道。传输层决定了大于 8 字节的数据如何分帧,应用层决定了你的温度、气压、IMU 数据以什么数据结构发布。UAVCAN 使用 DS-015 等标准定义常见传感器消息,也允许厂商自定义数据类型。理解分层的好处是:当通信失败时,你可以快速定位是物理层接线问题、传输层分帧问题,还是应用层数据类型不匹配。
三、帧格式:从 CAN 帧到 UAVCAN 传输帧
CAN 扩展帧由 SOF、11 位基本 ID、SRR、IDE、18 位扩展 ID、RTR、r1、r0、DLC、数据场和 CRC 等字段组成。UAVCAN 对 29 位扩展 ID 进行了语义划分:高 5 位为优先级,中间 16 位为数据类型 ID,低 8 位为源节点 ID。这种划分使得接收节点无需解析数据场,仅凭 ID 就能判断消息类型、来源和紧急程度。
当应用层数据超过 8 字节时,UAVCAN 传输层使用多帧传输:首帧携带总长度和 CRC,连续帧携带后续数据,尾帧结束传输。接收方按序重组并校验 CRC。对于传感器节点,温度、电压等小数据通常单帧完成;IMU 的加速度、角速度、姿态四元数可能超过 8 字节,需要多帧传输。开发时要特别注意传输层的超时与重传策略,避免总线负载过高。
UAVCAN 扩展 ID 位域示例(29 位):
[28:24] 优先级 Priority 5 bit
[23:8] 数据类型 ID 16 bit
[7:0] 源节点 ID 8 bit
示例:优先级 16,数据类型 1050,源节点 42
二进制:10000 0000010000011010 00101010
四、节点 ID 与动态分配机制
UAVCAN 网络中每个节点必须拥有唯一节点 ID,范围 0~127。其中 0 为匿名节点 ID,用于尚未分配 ID 的节点发送动态分配请求;1~125 为可分配节点 ID;126 保留给固件更新;127 为广播地址。节点 ID 冲突会导致总线通信异常,因此动态分配机制是 UAVCAN 网络自组织的关键。
动态分配流程如下:节点上电后,若未配置静态 ID,则以匿名 ID 发送“动态节点 ID 分配请求”,请求中携带自身唯一 ID(如 MCU 唯一序列号)。网络中负责分配的节点(通常是飞控或分配器)收到请求后,从可用池中选择一个未占用 ID,通过“动态节点 ID 分配响应”返回。节点收到响应后保存 ID,并开始以该 ID 发送心跳和传感器数据。若节点已有静态 ID,则直接跳过分配流程。
| 节点 ID 范围 | 用途 | 说明 |
|---|---|---|
| 0 | 匿名节点 | 用于动态分配请求,不可用于正常通信 |
| 1~125 | 可分配节点 | 动态分配或静态配置,传感器节点常用范围 |
| 126 | 固件更新 | 保留给 Bootloader 与固件升级服务 |
| 127 | 广播 | 用于广播消息,所有节点均可接收 |
五、案例与常见误区
假设你开发一个温度传感器节点,使用 STM32 的 CAN 外设,节点上电后发送动态分配请求,飞控分配 ID 为 42。随后节点以优先级 16、数据类型 1050、源节点 42 周期发送温度值。若发现飞控收不到数据,排查顺序应为:物理层终端电阻是否 120Ω、CAN_H/CAN_L 是否接反、传输层分帧是否正确、数据类型 ID 是否与飞控订阅一致、节点 ID 是否冲突。
常见误区包括:一是忽略终端电阻,导致短距离调试正常但长线通信失败;二是动态分配时未读取 MCU 唯一 ID,多个节点使用相同请求 ID,造成分配冲突;三是将节点 ID 0 用于正常通信,导致匿名帧被网络丢弃;四是多帧传输时未处理超时,总线负载升高后数据重组失败。复盘时建议用 CAN 分析仪抓取原始帧,逐字段核对优先级、数据类型 ID 和源节点 ID,再对照 UAVCAN 协议栈分层定位问题。
掌握 CAN 总线仲裁、UAVCAN 分层、扩展帧位域和节点 ID 分配机制后,你就具备了开发 UAVCAN 传感器节点的协议基础。后续在编写发布订阅逻辑、配置传输层参数和处理节点状态时,这些底层知识将直接决定通信的稳定性与实时性。