dronecan在嵌入式系统中的实现

部署运行你感兴趣的模型镜像

目录

1. 首先,关于dronecan基本概念和资料可以看这两个链接。

2. 其次,dronecan在pix4,ardupilot这些开源程序中是存在的

3.很坑的是,dronecan的开源代码有两套

4.怎么去generate code

5.莫名其妙的解决了

6. dronecan的实现

7. 相关文件

本身来讲,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的分享

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值