目录
1. 首先,关于dronecan基本概念和资料可以看这两个链接。
2. 其次,dronecan在pix4,ardupilot这些开源程序中是存在的
本身来讲,Dronecan是个很简单的东西,类似marvlink,使用起来也是类似的。但是我的感觉是dronecan相对marvlink开发,人为的加大了难度,到底是哪些人加大了这个难度呢,我也不知道,就是感觉有人在刻意垄断这个技术,各种语焉不详。为了一个很简单的东西,我搞了三四天,最后莫名其妙解决了,所以记录一下。
事情的起因是我买了一个dronecan接口的gps,这玩意儿是无人机上用的,标准接口,即插即用,问题就来了,我不是用的通用飞控板+标准飞控软件,而是自己搞的控制板。所以,当我向卖方要通信协议的时候,对方直接就是,标准dronecan协议,等于没说。
既然买来了就弄弄吧,我自信自己啥东西都搞过,还搞不定一个开源的接口协议么,但是事实上在python生成c文件的事情上浪费了大量时间,在这过程中差点买过一个500多块钱的视频教程,总之搞得很崩溃。
1. 首先,关于dronecan基本概念和资料可以看这两个链接。
4.1 CAN bus transport layer - DroneCAN
7. List of standard data types - DroneCAN
2. 其次,dronecan在pix4,ardupilot这些开源程序中是存在的
但是,很坑的是,这些程序里并不包含c文件,甚至不包括配置文件(.uavcan),而是在编译过程中,它会用根据工程配置文件自动去生成这些东西。所以曾经我一度想配置pix4/ardupilot的编译环境。
3.很坑的是,dronecan的开源代码有两套
第一套是
https://github.com/OpenCyphal/libcanard
网上文章大部分都是使用这一套,包括ardupilot,pix4,应该都是使用的这一套。但是我使用过程当中,会卡在_canard_cavl.h相关的程序里,大概就是内存动态分配那一块,看的也很崩溃,因为没有人说这个,好像大家都不会出问题,用那个接口函数就能处理完数据,但是我程序里就卡住了,内存处理出问题,得不到要的结果,在没有什么说明文档的情况下,搞清楚它的机理然后找到错误的地方,比自己写程序来实现还困难,另外我有个疑问,crc验证怎么弄的。
第二套是
https://github.com/DroneCAN/libcanard
这一套数据处理过程思路很清晰,也是我最开始就用的一套。这一套网上只有偶尔一两篇文章提及。但是我卡在了crc校验需要signature这个东西上面。程序里有说明:Signature for any data type can be obtained in many ways; for example, using the generated code generated using dronecan_dsdlc (see the repository).
这个signature在多帧数据时会作为crc处理的一部分,参考1.
所以接下来就是,怎么去得到这个signature。
4.怎么去generate code
它是用一个python程序,根据配置文件(.uavcan),生成.c,.h文件。
配置文件下载地址也是到这里面找,叫DSDL:http://github.com/DroneCAN/
总之下载下来就是类似这种东西
配置文件类似于marvlink里面的表格描述文件,但是这个需要python去编译,编译需要用到libuavcan,有不少文章都有提到,他们似乎很轻松。
https://www.cnblogs.com/liushuhe1990/articles/10322938.html
这个过程充满了坑。
首先就是网络连接不畅,github, git colone都很烦。
然后python编译各种问题,这个靠百度大都能解决,往往是缺模块,pip install一下就好了
还有个经常报的错误是文件目录找不到,我对找不到的目录建了目录,后来发现是多此一举。
到最后报的错误是namespace这样的错误,打开1063.Fix2.uavcan这个文件,然后你会看到开头一个uavcan.Timestamp timestamp,这里引用了一个变量类型uavcan.Timestamp,它是在外面的Timestamp.uavcan文件里定义的。然后就懵圈了,因为不知道怎么用python去处理这个事情。
5.莫名其妙的解决了
在https://www.cnblogs.com/liushuhe1990/articles/10322938.html这篇文章里,给出了和其他文章都不一样的语句。对比下,Libcanard_dsdlc描述文件里是这样写的:
python3 libcanard_dsdlc --outdir <outdir> <dsdl-definition-uavcan-folder>
而绝大多数文章里都是这样弄的,但是我就会出namespace的问题。而这篇文章里这句话是这样写的:
python3 ./libcanard_dsdlc ./pyuavcan/uavcan/dsdl_files/uavcan
然后我试了下,居然就行了,而且那些新建目录啥的也不用了,它自动建立了一个dsdlc_generated目录,所有生成的文件都在里面。看来自己对python还需要有更多理解和学习。
6. dronecan的实现
剩下编程问题就很简单了,简单说一下流程:
(1)在你的程序初始化部分,调用canard的canardInit函数初始化实例,里面要用到两个自定义函数的指针。
SelfDef_onRecept函数自己定义,用于处理接收数据。
SelfDef_shouldAccept函数也是自己定义的,canard函数中,用它来判断要不要处理这一帧数据,同时把signature值填充下。
(2)这两个自定义函数如下:
其中,UAVCAN_EQUIPMENT_GNSS_FIX2_ID,UAVCAN_EQUIPMENT_GNSS_FIX2_SIGNATURE这些都是在5步骤中生成的.h文件中定义的。
uavcan_equipment_gnss_Fix2_decode也是在5步骤中生成的.c文件中定义的,使用起来和marvlink的感觉是一样的。
(3)最后,CAN口收到数据后,调用canard中的处理函数canardHandleRxFrame
这个函数大家可以读一读,结合1的dronecan资料,很容易懂。
所以,实现dronecan,其实就这么点代码。
7. 相关文件
通过网盘分享的文件:dronecan
链接: https://pan.baidu.com/s/1JoVJOpnLUelsC0ojgSGXNQ?pwd=f6af 提取码: f6af
--来自百度网盘超级会员v3的分享