无人机学习笔记1:基于Crazyfile源码

来源:互联网 发布:物联网数据卡 编辑:程序博客网 时间:2024/05/17 08:18

Crazyfile固件源码结构

最近在学习Crazyfile,学习中不断获取了新的知识,不敢独享,希望在分享中提升自己同时帮助其它想学习飞控程序的人。

1、Crazyflie 2.0 系统结构

Crazyflie 2.0是架构在两个微控制器之上的包括一个主控芯片stm32f405以及一个射频及电源管理芯片NRF51:

1、NRF51采用Cortex-M0处理无线电通信和电源管理,其功能包括:
- 1、开/关逻辑
- 2、控制电力系统的其余部分(STM32、传感器和扩展板)
- 3、电池充电管理和电压测量
- 4、管理广播bootloader
- 5、广播和BLE沟通
- 6、检测和检查安装扩展板

2、STM32F405 Cortex-M4@160MHz,处理飞行控制和其他所有的繁重的工作:
- 1、传感器的读取和运动控制
- 2、飞行控制
- 3、遥测(包括电池电压)
- 4、额外的用户开发

下图旨在解释它们之间如何一起工作。
这里写图片描述

nRF51822

nRF51两个主要的任务是处理无线电通信和电源管理。它作为一个无线电桥(原始数据包STM)通信。

Crazyflie 2.0使用通信方式包括CRTP和BLE,但硬件还支持其他协议如ANT。CRTP模式兼容Crazyradio USB集线器,它提供了一个与低延迟数据链路2兆比特/秒。试验表明,延迟之间的无线电连接是360和1.26毫秒,在2 mbps没有重试和分别为1和32个字节的数据包大小。最低可实现的延迟与蓝牙7.5毫秒,但当前实现20毫秒左右。与Crazyradio CRTP链接的主要好处是它容易实现在任何支持USB主机的系统,使其成为Crazyflie开发和实验的首选。BLE是主要的实现从一个移动设备控制Crazyflie 2.0。

nRF51芯片的另一个特性是,它旨在从纽扣电池运行,这意味着它非常适合低能量的操作。所以NRF51还负责电源管理。它处理开关逻辑这意味着NRF51总上电状态,不同的操作可能按开/关按钮时(按一个长时间。这是用于启动引导程序)。也可以由外部源唤醒。

STM32F405

STM32运行主要的固件尽管它是被NRF51唤醒。它实现了飞行控制,所有通信算法。扩展板口主要是连接到STM32的,所以一些扩展板的驱动都是在STM32里面的

STM32F405有196 kb的RAM,应该足以满足任何人的需求。它允许更多的计算量算法,例如融合传感器和GPS数据。

单片机内部通讯

两个cpu之间的交往是由syslink处理协议。它是一个简单的基于分组协议我们做了一个可扩展的通信方案。
Syslink提供消息携带所需的所有cpu之间的通信。STM32作为主机NRF51作为从机。我们试图尽可能保持NRF51简单并且将复杂算法运行在STM32内。

2、Crazyflie 2.0 固件分析

首先从github上下载固件,因为只是为了分析代码所以可以选择直接clone的方式下载,下载后打开固件文件夹,然后打开“src”目录,这里存放了Crazyfile的源码,然后对源码的各个文件夹的内容进行分析如下:

文件夹 内容 init 包括main函数,我们也是从这里开始分析 config 配置文件 drivers 硬件驱动层 hal 硬件抽象层 modules 固件具体实现函数和头文件 utils 扩展工具相关如控制台工具 deck crazyfile的一些扩展板载模块 platform 平台相关文件 lib 包含源码引用的库函数如freertos操作系统库、CMSIS库、STM32标准外设库等

总体来看Crazyfile的文件结构很是清晰明了,泾渭分明,典型的嵌入式软件设计流程。我们不妨从底层分析到最上层。

最底层的代码应该就是硬件驱动层,这部分代码保存在“src/drivers”目录下,打开该目录可以看到两个文件夹“src”和“interface”文件夹,分别保存了驱动的c文件和h头文件,打开src文件夹便可以看到所有的驱动文件,当然这些都是c文件,在“interface”文件夹下存放的都是头文件,文件名一一对应,这些驱动文件大都是和最底层的硬件打交道,当然这些驱动大都是基于ST标准外设库,就像我们平时裸机开发stm32里调用库函数实现逻辑控制的方式,这些驱动的文件名对应相应的硬件外设,如diskio.c对应diskio驱动,“MPU6050.c”对应mpu6050驱动。
当硬件驱动写好之后需要抽象一个硬件层供上层应用调用以保证我们的上层应用在硬件变动后依然能够运行,这里有些面向对象的思路。而这些硬件抽象层保存在“src/hal”文件夹下,从标题上看这些硬件抽象层又进一步对底层驱动做了归类,如我们的传感器被抽象成 sensors_bosch.c,可以看到 sensors_bosch.c里重新定义了读取传感器数据的新函数,又创建了传感器相关系统任务,系统任务直接调用新定义的函数,这样当底层驱动有变动时系统任务依然能够运行,我们只需要把底层驱动的接口与硬件抽象层对号入座即可。

看完硬件抽象层就该是上层应用了,其实我们调用的硬件抽象层都是为了上层应用所服务的,如我们通过硬件抽象层读取传感器数据来进行数据融合姿态结算、读取遥控器数据来判断用户输入的指令。对于Crazyfile,其上层一些应用存储在src/modules”目录下,这里包含了所有无人机上层的算法,也是以后要学的核心内容。

第一篇博客主要对工程的各个文件夹有所了解,这样对学习源码有很大的帮助,至少知道代码应该在哪找,其中某个文件夹存放的函数有个大致了解。以后大致的学习方向是先分析Crazyfile的底层驱动及硬件抽象层。学习人家对代码结构的组织,反思自己在组织一个代码时的陋习。从而整体提升自己对工程的组织能力。然后再学习那些烧脑的算法。最后做出一套属于自己的无人机系统。

1 0