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的分享

<think>嗯,用户现在问的是关于这个命令的意思:`pip3 install --user -U future lxml pymavlink pyserial MAVProxy pexpect geocoder empy==3.3.4 ptyprocess dronecan flake8 junitparser pygame intelhex`。我需要先分解这个命令的各个部分,然后逐个解释它们的作用。 首先,用户之前的问题是关于pip版本的问题,现在转向具体安装命令,可能是在进行某个项目的环境配置,比如无人机开发或者自动化测试相关的,因为里面有些包像pymavlink、MAVProxy、dronecan这些是无人机通信相关的。用户可能是在搭建开发环境,遇到了需要安装特定版本的包的情况,比如empy指定了3.3.4版本,这可能是因为兼容性问题。 接下来,我需要解析命令的结构。`pip3 install`是安装Python包的命令,`--user`表示安装到用户目录,避免系统级安装的权限问题,这在之前的对话中已经讨论过系统级和用户级安装的区别,用户可能已经升级了pip到用户目录,所以这里使用`--user`是合理的。`-U`是`--upgrade`的缩写,代表升级已安装的包到最新版本,除非指定了特定版本,比如empy==3.3.4。 然后逐个分析每个包的作用:future可能是用于Python 2/3兼容的,lxml处理XML和HTML,pymavlink和MAVProxy用于MAVLink协议的无人机通信,pyserial串口通信,pexpect和ptyprocess用于自动化交互脚本,geocoder处理地理编码,empy是一个模板引擎,指定版本可能是因为项目依赖旧版,dronecan可能与CAN总线通信有关,flake8代码检查,junitparser解析JUnit报告,pygame游戏开发库,intelhex处理Intel HEX文件。这些包组合在一起,用户可能在开发无人机相关的软件,涉及通信、数据处理、自动化测试等。 用户可能的需求是了解这个命令的作用,或者遇到了安装问题,比如某个包安装失败,尤其是empy的指定版本可能有兼容性问题,或者权限问题,因为使用了`--user`。另外,用户可能对为什么需要这些包以及它们的作用不清楚,需要解释每个包的功能,帮助他理解整个项目依赖的结构。 另外,结合用户之前的问题,系统级的pip比较旧,现在使用用户级的pip安装,可能需要确认环境变量是否设置正确,确保安装路径在用户目录下。此外,用户可能之后会用到虚拟环境,比如venv,来隔离项目依赖,避免版本冲突,特别是当不同项目需要不同版本的包时。 需要提醒用户注意版本冲突,尤其是empy指定了3.3.4版本,可能与其他包的依赖有冲突。另外,安装过程中可能会遇到编译依赖的问题,比如lxml需要系统安装libxml2和libxslt的开发库,特别是在Linux环境下。还有,某些包可能需要C扩展,用户如果没有安装相应的编译工具可能会出错,需要指导他们安装必要的系统包。 最后,总结这个命令的作用,按类别分组解释包的功能,帮助用户理解整体用途,并给出安装建议,比如检查依赖、使用虚拟环境、处理常见错误等。</think>以下是对命令 `pip3 install --user -U future lxml pymavlink pyserial MAVProxy pexpect geocoder empy==3.3.4 ptyprocess dronecan flake8 junitparser pygame intelhex` 的逐层解析: --- ### **命令结构分解** | 部分 | 说明 | |------------------|----------------------------------------------------------------------| | **`pip3 install`** | 使用 Python 3 的包管理器安装第三方库。 | | **`--user`** | 将包安装到当前用户的本地目录(如 `~/.local/lib/`),**避免系统级污染**。 | | **`-U`** | `--upgrade` 的缩写,强制升级已安装的包到最新版本。 | | **`包列表`** | 指定要安装的 Python 包(部分含版本约束)。 | --- ### **包功能分类说明** #### 1. **无人机开发与通信** | 包名 | 用途 | |--------------------|----------------------------------------------------------------------| | `pymavlink` | MAVLink 协议的 Python 实现,用于无人机与地面站通信。 | | `MAVProxy` | 基于命令行的无人机地面站软件,支持 MAVLink 协议。 | | `dronecan` | DroneCAN 总线协议的 Python 工具,用于无人机分布式通信。 | #### 2. **硬件交互与协议** | 包名 | 用途 | |--------------------|----------------------------------------------------------------------| | `pyserial` | 串口通信库,用于与 Arduino、传感器等设备交互。 | | `intelhex` | 读写 Intel HEX 格式文件,常用于嵌入式固件开发。 | #### 3. **代码质量与测试** | 包名 | 用途 | |--------------------|----------------------------------------------------------------------| | `flake8` | 代码静态检查工具,集成 PyFlakes、pep8 等,用于检查代码规范。 | | `junitparser` | 解析 JUnit 格式的测试报告,常用于持续集成(CI/CD)。 | #### 4. **工具与依赖** | 包名 | 用途 | |--------------------|----------------------------------------------------------------------| | `lxml` | 高性能 XML/HTML 解析库,依赖 C 扩展(需系统安装 `libxml2` 和 `libxslt`)。 | | `empy==3.3.4` | 模板引擎,**强制指定版本 3.3.4**(可能因兼容性要求)。 | | `future` | 帮助 Python 2/3 代码兼容的工具库。 | | `pexpect` | 控制交互式命令行程序的自动化工具(如 SSH 登录)。 | | `ptyprocess` | 启动伪终端(PTY)的子进程,通常与 `pexpect` 配合使用。 | #### 5. **其他功能** | 包名 | 用途 | |--------------------|----------------------------------------------------------------------| | `geocoder` | 地理编码工具,支持 Google、OpenStreetMap 等平台的地理位置查询。 | | `pygame` | 游戏开发库,也可用于图形化界面或传感器数据可视化。 | --- ### **注意事项** 1. **依赖冲突** - `empy==3.3.4` 强制锁定旧版本,可能与其他库的依赖不兼容。若安装失败,需检查依赖树。 - 若需升级其他包但保留 `empy` 版本,可单独操作: ```bash pip3 install --user -U future lxml pymavlink ...(省略其他包) pip3 install --user empy==3.3.4 # 单独安装指定版本 ``` 2. **系统级依赖** - `lxml` 需要系统安装开发库(Linux 示例): ```bash sudo apt-get install libxml2-dev libxslt-dev ``` 3. **虚拟环境推荐** 建议使用虚拟环境隔离项目依赖(避免全局污染): ```bash python3 -m venv my_project_env # 创建虚拟环境 source my_project_env/bin/activate # 激活环境 pip install -U future lxml ...(省略其他包) # 在虚拟环境中安装 ``` --- ### **典型应用场景** - **无人机开发**:结合 `pymavlink` 和 `MAVProxy` 实现无人机通信与控制。 - **嵌入式开发**:通过 `pyserial` 和 `intelhex` 与硬件设备交互并处理固件文件。 - **自动化测试**:使用 `pexpect` 和 `junitparser` 编写测试脚本并生成报告。 如有安装失败或兼容性问题,可提供具体错误信息进一步分析!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值