1.UAVCAN基本概念
1.1框架
- 理念
UAVCAN设计理念是为泛载具、机器类应用提供基础的,非领域限定的一种通信机制,并为该类应用中大量使用的设备定义了通用协议。UAVCAN不涉及到具体设备的应用。UAVCAN设计为低状态机架构,增强可靠性。
- 通信机制
广播消息:节点以一个端口ID,发布信息;也可以订阅任一端口对应的信息;
服务消息:节点可以向另一个节点发送请求消息,类似于CS架构;
注:每个接入设备为一个节点(node),消息及协议以端口(port)区分。广播消息端口(message--使用subject identifier)和服务消息端口(service--使用service identifier),统称为端口(port identifier)。
- 节点
单个设备可以占用并实现单个或多个节点。
- DSDL语言(本文不涉及定制协议,未深入研究)
DSDL语言是一个类C语言的语义解释器,用于将这种类C语言的描述,使用python工具生成协议。UAVCAN由此定义协议,包括广播消息和服务消息。DSDL中可使用文件路径类似命名完成像C中include的操作,进而引用其它文件中定义的类型(不一定是这个目的,猜测),并由此完成类型定义与协议描述文件拆分(不一定是这个目的,猜测)。即DSDL所有协议均为静态生成。
协议文件名中显示定义了协议的端口和版本:
- 协议端口定义
V1.0协议端口,分另为标准端口(UAVCAN定义),注册端口(各领域自定义,UAVCAN/SIG审核),开放端口。
V0协议端口
1.2底层传输协议
底层传输协议V0(旧版本协议,当前设备here3和CUAV的GPS使用)
仅描述使用CAN使用发送通道的情况,不描述使用UDP、serial等。
支持CAN2.0,使用扩展帧,最大包负载长度8字节。
支持CAN FD,使用扩展帧,最大包负载长度64字节。(未尝试)
- 帧头占用扩展帧,定义如下:
Priority优先级:0为最高优先级,31最低,与CAN基础协议定义一致
Message type ID消息ID:即协议中的消息ID,查阅协议具体定义。
Service type ID服务ID:即协议中服务ID,查阅协议具体定义。
Node ID节点ID:设备节点号,0为保留ID,代表未知节点或所有节点。该节点ID在自动分配ID的过程中,未分配成功时为0。
Discriminator区分码:在ID自动分配的过程中,未完成分配前,所有未分配的节点ID为0,即会产生ID重复冲突。为避免这种情况,每个设备在未被分配时,会随机生成一个区分码,并广播自己的12位设备唯一码的前6位,请求分配员给自己分配ID,分配成功后,一般不再发送匿名广播消息(anonymous message frame)。
- 帧尾
单帧数据量太小,为适应多帧发送,便于拼接,在帧尾增加拆分信息。
发送单帧时,起始与结束标志均为1,翻转标志为0。
发送多帧时,第一帧数据中前两个字节为CRC,起始标志为1,结束标志为0,翻转标志为0。