PX4-8-UAVCAN与开源飞控
这一篇我们来聊一下PX4和APM使用的CAN通信协议框架 UAVCAN。为什么聊这个话题呢?最近PX4固件做了一个关于UAVCAN的更新,调整了src/drivers/uavcan/libuavcan子模块的仓库,并且启用了新的名称为dronecan和新的主页 http://dronecan.org。
commit id:c73a1b4c:update UAVCAN-v0 dsdl to DroneCAN借着这个更改我们来聊一下UAVCAN的一些事情。
关注PX4项目进展的同学可能会发现,从v1.12版本开始,在src/drivers目录下多了一个模块,名为uavcan_v1,而这个模块并没有几个board配置中使用了它,即使是最新的master分支也没有在的default配置中使用。
关注uavcan的官方网站,得知uavcan正在进行重大的更改,协议由v0.9升级到v1版本,src/drivers/uavcan/libuavcan目录下为当前使用的v0.9版本,而新增加的uavcan_v1为新的v1版本
v0.9与v1版本的区别
那么这两个版本有什么区别呢?这里我们不做特别深入的讨论,仅从can拓展帧id的定义上对比,
从https://legacy.uavcan.org/Specification/4._CAN_bus_transport_layer/可以获取v0.9版本的id定义
由https://uavcan.org/specification/UAVCAN_Specification_v1.0-beta.pdf文档中可以找到v1.0版本的id结构
可以发现这两个版本的协议在Priority、Message type ID、Service not message、Source node ID等字段的定义上有很大的不同,并不兼容。
DroneCAN:UAVCAN v0.9版本的继承者
UAVCAN在https://legacy.uavcan.org/主页中也强调v0.9版本不再维护且不推荐在新的设计使用。
This website is dedicated to the experimental version of the protocol, otherwise known as UAVCAN v0. This version is now obsolete and should not be used in new designs. Existing deployments will benefit from our commitment to provide long-term support and maintenance of UAVCAN v0-based systems.很早就看到这个网站的消息,以为PX4和APM的can框架即将发生较大的更改,虽然不是很理解这个更改有什么明显的优化和改进。
直到最近关注到文章开头提到的libuavcan仓库路径的变化,在新的dronecan主页https://dronecan.github.io/中提到了这个变化的原因:
DroneCAN is the primary CAN protocol used by the ArduPilot and PX4projects for communication with CAN peripherals. It is an open protocolwith open communication, specification and multiple openimplementations.
DroneCAN was created to continue the development of the widely used UAVCAN v0 protocol. This protocol hasproven itself as robust and feature rich and has been widely deployed in the commercial drone industry and enjoys broad support among industry partners. The proposed introduction of the UAVCAN v1 protocol involved changes to UAVCAN that increased complexity and did not offer a smoothmigration path for existing deployments. After extended discussionswithin the UAVCAN consortium it was decided that the best solution wasto continue development of UAVCAN v0 under the name DroneCAN.PX4和APM开源飞控项目认为v0.9版本是健壮的、功能丰富的,已在商用无人机行业中广泛部署,并在行业合作伙伴中得到广泛支持,因此决定继续维护这个版本的协议,重新命名为DroneCAN v1。
总结
这次UAVCAN v1与DroneCAN v1(UAVCAN v0.9)的分离对于未来开源飞控与UAVCAN有何影响我们持续关注。这种重大的协议更改对于整个开源飞控产业链而言影响是巨大的,会使本就分散的UAV各个组件之间的兼通性问题更加凸显。基于这样的原因开源飞控社区没有作出这样的更改。
对于飞控的学习爱好者,UAVCAN也是一个非常不错的学习项目,其两个主要的库libcanard(c语言实现)、libuavcan(C++实现),我们在后续的分享中探讨它们的代码框架。
往期分享:
AcmeROS-1-系统架构
PX4-7-飞控参数
AcmeGCS-9-目标框选跟踪
AcmeIot-2-基于PX4硬件的Nuttx开发环境
这里会不定期更新一些我整理的无人机相关知识,欢迎关注。
在公众号的主页菜单中有所有分享的分类整理。 请问PX4框架中如果不用UAVCAN,而是用普通的CAN协议可以吗? 自己写一个can驱动就可以呀 UAV CAN可以和普通的CAN设备通信吗? 可以啊,如果是单帧数据比较简单,直接获取帧ID解析对应数据就可以,多帧消息的话麻烦一些,需要自己写组包和解包方法。 如果是非整形数据,比如int6 int14,float16,这样的类型,组包和解包会比较难受 每次接收一个单帧不可以吗,然后重复执行获取单帧?[捂脸]
另外,我的设备是标准CAN协议,可不可以通过UAVCAN直接读取呢,我看UAVCAN的介绍好像也跟CANBUS有互通机制,但是不知道可以可以直接读…… 你还是没有理解uavcan是啥,它是基于标准can硬件层的上层协议,只是定义了帧id的划分规范和数据格氏规范。你用uavcan肯定能读取到其它can消息,不过过不了uavcan的消息解析和校验,应用层解析不了而已。 你要用uavcan解析你设备发送的消息,对于单帧消息很简单,只要发送符合uancan规范的帧id就可以,多帧数据就涉及上面说组包问题,不然uavcan没法解析 是不是可以这么理解:我把标准和CAN设备和uavCAN设备接到一起,实际是可以收到数据的,但是无法按照标准CAN帧进行解析(因为uavcan把报头和内容等数据格式修改了),所以即使收到了数据也无法应用。
如果要用的话,就必须要让对方的设备发送uavcan规范的消息,而不能是常规的标准CAN帧
不知道理解是否正确? 大致正确吧,不过你说的标准can指的是什么呢,一般而言指的是can的硬件层协议,由can单片机can收发器支持,对于uancan也是一样的,每个can设备定义自己的应用层协议,uavcan也就是其中一种而已。要跟uavcan通信肯定要符合uancan的应用层协议,就这么简单,你可以看看uancan的协议文档,照着文档定义canid和组包数据就可以 嗯我说的标准CAN就是车上用的CAN协议,因为在车辆上用的CAN都是同一个协议,,哪几位是ID,哪几位是数据,哪几位是校验。用的时候只需要按照dbc进行解析得到数据即可。
您的意思应该是车上用的CAN和uavCAN应该是对这些位的规定不一样,没法解析。
我在想中间是不是可以加个转换模块,把车用的CAN帧按照uavCAN的协议转发一下,然后那边uavCAN直接用 接转换模块肯定是可以的 嗯,只不过没有已有模块,需要自己做一个~~
非常感谢大佬的解答,不知道大佬有无博客或者交流群?多向您学习 交流群倒没有,有个人网站 zenglong.xyz和微信公众号AcmeUavs,内容跟知乎差不多吧
页:
[1]