1. 课程导入
在无人机、机器人、eVTOL 与工业自动化系统中,传感器节点数量多、分布广、实时性要求高,传统 I²C、SPI、UART 点对点总线在布线、扩展性和抗干扰方面逐渐力不从心。UAVCAN(Uncomplicated Application-level Vehicular Network and Computing)正是为这类场景设计的轻量级车载网络协议:它运行在 CAN/CAN FD 物理层之上,用一套统一的节点寻址、数据类型和发布/订阅机制,把分散的传感器、执行器、飞控与计算单元组织成一张可自描述、可热插拔的实时网络。
一、UAVCAN 协议核心原理
UAVCAN 的本质是“面向对象的 CAN 网络”。它并不重新发明物理层,而是在 CAN 帧之上定义了三层关键抽象:节点 ID、数据类型与传输层。每个节点拥有 1~127 的唯一 ID,消息以“主题”形式广播,接收方按数据类型和主题订阅,无需点对点握手。传输层负责把大于 8 字节(CAN FD 下大于 64 字节)的数据拆分为多帧,并完成重组、超时与去重。
UAVCAN v1 进一步引入 Cyphal 规范,支持 CAN FD、以太网等多种底层,并采用固定端口 ID 与可扩展的 DSDL(Data Structure Description Language)描述数据结构。DSDL 文件在编译期生成各语言的序列化代码,使不同 MCU、不同操作系统上的节点能够“说同一种语言”。这正是传感器节点开发工程的基础:你写的不是“发一串字节”,而是“发布一个标准化的温度、姿态或电压对象”。
① 多主对等:任何节点都可主动发布,无中心轮询;
② 发布/订阅:按主题与数据类型解耦生产者和消费者;
③ 自描述:DSDL 定义数据结构,接口可版本化;
④ 实时可靠:CAN 优先级仲裁 + 传输层重传/超时机制。
二、传感器节点开发工程的学习目标
本课程不是单纯讲协议文档,而是围绕“把一颗传感器做成可上网的 UAVCAN 节点”这一工程目标展开。学完后,你应当能够独立完成以下任务:
- 读懂 UAVCAN/Cyphal 的节点 ID、主题、端口 ID 与 DSDL 数据类型;
- 在 STM32、GD32 或 Linux 平台上搭建 CAN/CAN FD 收发驱动;
- 使用 libcanard、libuavcan 或 Cyphal 库实现发布/订阅与请求/响应;
- 为温度、IMU、气压、电流等传感器定义 DSDL 并生成代码;
- 用示波器、CAN 分析仪和 UAVCAN GUI 工具完成联调与排障;
- 设计节点状态机、心跳、固件升级与参数配置流程。
这些目标对应一条清晰的“从协议到产品”的能力链:协议理解 → 硬件接口 → 驱动移植 → 数据建模 → 应用逻辑 → 测试验证 → 工程化交付。
三、整体知识框架与实战路线图
课程共 30 章,按“基础—驱动—协议—应用—工程”五段推进。下图给出整体知识框架与实战路线,帮助你在学习每一章时知道它位于整条链路的哪个位置。
四、典型应用场景与最小系统
设想一个四旋翼平台:飞控通过 CAN 总线连接一个“环境感知节点”,该节点挂载 SHT30 温湿度、BMP390 气压和 INA226 电流传感器。节点上电后先完成 CAN 控制器初始化,再以 1 Hz 发布 uavcan.si.sample.temperature 与 uavcan.si.sample.pressure,同时以 10 Hz 发布电压电流。飞控只需订阅对应主题,即可获得带时间戳的物理量,而无需关心节点内部是 I²C 还是 SPI。
# 典型 DSDL 片段(示意)
uavcan.si.sample.temperature.1.0:
timestamp: uavcan.time.SynchronizedTimestamp.1.0
kelvin: float32
# 节点发布伪代码
canard_broadcast(&temp_ts, &temp_payload);
canard_broadcast(&press_ts, &press_payload);
这个最小系统覆盖了本课程最核心的闭环:传感器采集 → DSDL 建模 → CAN 帧封装 → 总线仲裁 → 订阅端解析 → 应用使用。后续章节会逐段拆开,每一段都配可运行的代码与可观测的波形/日志。
五、常见误区与学习复盘
误区二:忽略终端电阻与共地。CAN 差分总线两端各 120 Ω,缺少终端会导致反射和随机错误帧。
误区三:先写应用再补协议。正确顺序是先跑通最小收发,再定义 DSDL,最后写业务逻辑。
误区四:不做总线负载评估。节点多、频率高时,CAN 负载超过 70% 会显著增加延迟与丢帧。
建议的学习方法是“每章一验证”:学完协议基础,用 CAN 分析仪抓一帧真实报文;学完驱动,让节点回环收发成功;学完 DSDL,用生成代码打印结构体;学完应用,让上位机看到曲线。只有把抽象协议落到可观测的信号与数据上,传感器节点开发工程才真正成立。
| 阶段 | 核心问题 | 关键产出 | 验证方式 |
|---|---|---|---|
| 协议基础 | UAVCAN 如何寻址与传输 | 节点 ID、主题、DSDL 概念图 | 抓包识别帧类型 |
| 硬件与驱动 | MCU 如何收发 CAN 帧 | CAN 初始化与回环代码 | 示波器看差分波形 |
| 协议栈实现 | 如何发布/订阅标准对象 | libcanard 移植与 API 封装 | 上位机收到主题数据 |
| 传感器应用 | 如何把物理量变成 UAVCAN 消息 | IMU/温度/气压节点固件 | 曲线稳定、时间戳正确 |
| 工程化 | 如何保证可靠与可维护 | 心跳、升级、参数、测试报告 | 长时间跑机无丢帧 |
从这一章开始,你面对的不再是零散的寄存器与字节,而是一张有节点、有主题、有生命周期的实时网络。接下来的每一章,都会在这张网络上增加一个可运行、可验证的部件。