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、不同操作系统上的节点能够“说同一种语言”。这正是传感器节点开发工程的基础:你写的不是“发一串字节”,而是“发布一个标准化的温度、姿态或电压对象”。

UAVCAN 的四个关键特征:
① 多主对等:任何节点都可主动发布,无中心轮询;
② 发布/订阅:按主题与数据类型解耦生产者和消费者;
③ 自描述:DSDL 定义数据结构,接口可版本化;
④ 实时可靠:CAN 优先级仲裁 + 传输层重传/超时机制。

二、传感器节点开发工程的学习目标

本课程不是单纯讲协议文档,而是围绕“把一颗传感器做成可上网的 UAVCAN 节点”这一工程目标展开。学完后,你应当能够独立完成以下任务:

  • 读懂 UAVCAN/Cyphal 的节点 ID、主题、端口 ID 与 DSDL 数据类型;
  • 在 STM32、GD32 或 Linux 平台上搭建 CAN/CAN FD 收发驱动;
  • 使用 libcanard、libuavcan 或 Cyphal 库实现发布/订阅与请求/响应;
  • 为温度、IMU、气压、电流等传感器定义 DSDL 并生成代码;
  • 用示波器、CAN 分析仪和 UAVCAN GUI 工具完成联调与排障;
  • 设计节点状态机、心跳、固件升级与参数配置流程。

这些目标对应一条清晰的“从协议到产品”的能力链:协议理解 → 硬件接口 → 驱动移植 → 数据建模 → 应用逻辑 → 测试验证 → 工程化交付。

三、整体知识框架与实战路线图

课程共 30 章,按“基础—驱动—协议—应用—工程”五段推进。下图给出整体知识框架与实战路线,帮助你在学习每一章时知道它位于整条链路的哪个位置。

UAVCAN 传感器节点开发工程 · 知识框架与实战路线 ① 协议基础 CAN / UAVCAN / DSDL ② 硬件与驱动 CAN 收发 / MCU 移植 ③ 协议栈实现 发布订阅 / 传输层 ④ 传感器应用 IMU / 温度 / 气压 ⑤ 工程化 测试 / 升级 / 交付 协议基础 CAN 帧与仲裁 UAVCAN 节点 ID DSDL 数据类型 端口与主题 硬件与驱动 CAN 收发器电路 终端电阻与布线 MCU CAN 外设 中断与环形缓冲 协议栈实现 libcanard 移植 发布/订阅 API 多帧传输与重组 时间同步 传感器应用 IMU 姿态发布 温度/气压采集 电流电压监控 节点状态机 工程化 总线负载评估 错误计数与恢复 固件升级 参数配置 实战路线图(30 章递进) 阶段一 认知 协议全景与工具链 阶段二 打通 CAN 收发与最小节点 阶段三 建模 DSDL 与发布订阅 阶段四 集成 多传感器节点联调 阶段五 产品化 测试、升级与交付 每章 = 一个可验证的小目标:能编译、能收发、能观测、能复现 最终交付:一个可被飞控/上位机识别并稳定上报数据的 UAVCAN 传感器节点

四、典型应用场景与最小系统

设想一个四旋翼平台:飞控通过 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 帧封装 → 总线仲裁 → 订阅端解析 → 应用使用。后续章节会逐段拆开,每一段都配可运行的代码与可观测的波形/日志。

五、常见误区与学习复盘

误区一:把 UAVCAN 当成“另一种串口协议”。它是有类型、有寻址、有传输层的网络协议,必须按节点和主题思维设计。
误区二:忽略终端电阻与共地。CAN 差分总线两端各 120 Ω,缺少终端会导致反射和随机错误帧。
误区三:先写应用再补协议。正确顺序是先跑通最小收发,再定义 DSDL,最后写业务逻辑。
误区四:不做总线负载评估。节点多、频率高时,CAN 负载超过 70% 会显著增加延迟与丢帧。

建议的学习方法是“每章一验证”:学完协议基础,用 CAN 分析仪抓一帧真实报文;学完驱动,让节点回环收发成功;学完 DSDL,用生成代码打印结构体;学完应用,让上位机看到曲线。只有把抽象协议落到可观测的信号与数据上,传感器节点开发工程才真正成立。

阶段核心问题关键产出验证方式
协议基础UAVCAN 如何寻址与传输节点 ID、主题、DSDL 概念图抓包识别帧类型
硬件与驱动MCU 如何收发 CAN 帧CAN 初始化与回环代码示波器看差分波形
协议栈实现如何发布/订阅标准对象libcanard 移植与 API 封装上位机收到主题数据
传感器应用如何把物理量变成 UAVCAN 消息IMU/温度/气压节点固件曲线稳定、时间戳正确
工程化如何保证可靠与可维护心跳、升级、参数、测试报告长时间跑机无丢帧

从这一章开始,你面对的不再是零散的寄存器与字节,而是一张有节点、有主题、有生命周期的实时网络。接下来的每一章,都会在这张网络上增加一个可运行、可验证的部件。