Crazypony四轴飞行器代码框架

软件框架讲解

作者:nieyong

飞控源代码部分,都是属于一砖一瓦敲出来的。没有使用实时操作系统(RTOS),我们称之为裸机代码,托管在Github上,名字为crazepony-firmware-none,尾缀none表示未使用操作系统裸跑的意思。

那么,现在就结合裸机代码,来说说Crazepony的软件框架。

本文档以Crazepony 5.2版本为基础。Crazepony 5.0版本及以前的代码主要由马骏(CamelGo)完成。贡献者黄永祥在5.1版本中对飞控代码进行了重构,将Crazepony的稳定性推向了一个新的高度。贡献者Nieyong在5.2版本中对代码进行了整理。

软件流程图

Crazepony软件流程如下图所示:

Craepony主控使用的是STM32芯片,没有上实时操作系统,依靠中断嵌套来完成整体功能。程序核心就是通过定时器,在主循环中通过不断查询判断各个条件,这样就产生了几个大小不一样的时间段,我们根据需要就可以完成以多大的频率扫描一次遥控器指令、多久更新一次传感器数据、多久更新一次控制等等飞控需要实现的功能,尽可能的利用主控的资源。

初始化

进入主函数之后就是STM32处理器及各个部分的初始化。

接下来就是进入主循环while(1)之中了,主循环也就是整个程序功能实现的关键,程序进入这里面就循环在里面运行了,当然中断会打断去运行中断服务程序运行完之后再回到这里运行。

主循环-100Hz循环

主循环体中首先有if(loop100HzCnt >= 10){}这个结构,其中loop100HzCnt这个变量是在TIM4中断服务程序中累加的,1ms累加一次,也就是说定时每10ms就去完成一次其中的工作。

那么100Hz需要做一次的工作是什么呢?读取mpu6050数据,气压计数据并进行整合。因为采用软解姿态,读取的数据为加速度计和陀螺仪的AD值,将数据进行标定、滤波、校正后通过四元素融合得到三轴欧拉角度。如下图。

加速度传感器采集数据容易失真,造成姿态解算出来的欧拉角错误,只用角度单环情况下,使系统很难稳定运行,因此可以加入角速度作为内环,角速度由陀螺仪采集数据输出,采集值一般不存在受外界影响情况,抗干扰能力强,并且角速度变化灵敏,当受外界干扰时回复迅速增强了系统的鲁棒性。

Crazepony采用双闭环PID控制,如下图所示。

角度作为外环,角速度作为内环,进行姿态双环PID控制。角度环的输出值作为角速度环的输入建立自稳系统。

主循环-50Hz循环

if(loop50HzFlag){}进入50Hz(20ms执行一次)循环。loop50HzFlag标志位是在TIM4中断中每20ms置位一次的,这里解析了收到的遥控器无线发送过来的指令,结合当前的姿态计算更新这些控数据给核心控制算法输出控制飞控,我们就可以控制飞控前进后退,上升下降等等操作了。如下图。

主循环-10Hz循环

同样的思路if(loop10HzFlag){}也就是以10Hz的频率去执行下面功能。在这里可以通过蓝牙向我们的手机APP传送一些飞控的姿态信息,然后查询飞控的电量没有足够的话就让飞控降落下来,查询高度啊超出可控范围也把飞控降下来,查询是否和遥控器失联啊,失联就降下飞控等等安全飞行的控制。如下图

最后就是if(pcCmdFlag)这个了,这是一个与上位机调试有关的东西,主循环查询这个标志位,标志位是由上位机发送过来的指令置位的,它主要是处理pc机发送过来的指令,PID参数读取,修改等等。

时间: 2024-10-13 07:46:03

Crazypony四轴飞行器代码框架的相关文章

MWC四轴飞行器代码解读

MWC v2.2 代码解读annexCode() 红色是一些暂时没去顾及的部分,与我现在关心的地方并无太大关系. 函数对rcDate进行处理(去除死区,根据油门曲线,roll/pitch曲线,油门值,动态PID调整参数,在无头模式对于rcdata进行优化),生成rccommand值用于姿态控制.记录最大循环时间,最小循环时间,解锁时间,最大气压值.用LED表示一些传感器运行的状态.若定义了低压报警则进行电压测量. rccommand[油门]在0-1000之间  rccommand[roll/pi

四轴飞行器1.2.2 RT-Thread 串口

本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了.下面我们说说具体怎么使用的.      首先在rt_hw_board_init()函数里面有个rt_hw_usart_init(),这个就是串口初始化的函数了,而且RTT已经写好了三个串口的初始化,只需要修改下宏定义就可以使用,RTT实在用心良苦啊,这都帮我们写好了.      个人的一点看法,可能不是很全面,能力有限.其实我对函数rt_hw_usart_init()的

四轴飞行器1.4 姿态解算和Matlab实时姿态显示

原创文章,欢迎转载,转载请注明出处 MPU6050数据读取出来后,经过一个星期的努力,姿态解算和在matlab上的实时显示姿态终于完成了. 1:完成matlab的串口,并且实时通过波形显示数据 2:添加RTT查看CPU使用率的扩展功能,MPU6050读取数据的优化 3:四元素表示的坐标变化,四元素与欧拉角的关系和Madgwick的IMUupdate算法 4:飞控数据采集线程和数据处理线程的安排,类似于生产者与消费者的关系. 先放个效果视频... 如果看不了视频,请打开视屏网址:http://v.

四轴飞行器1.2.3 STM32F407时钟配置和升级标准库文件

原创文章,欢迎转载,转载请注明出处 这个星期进度比较慢哈,只有周末和晚上下班回来才能做,事件不连续,琐碎的事情又比较多,挺烦的,有多琐碎呢?           1.本人有点小强迫症哈,虽然RTT将文件夹已经分类的很好了,但是在一个项目跟目录下这样放着看起来还是很不舒服的哈,于是强迫症范了,要整理下它.按照以前做项目的习惯,将程序分为四个层次,硬件层,驱动层,系统层和应用层,我们就整理下,对三个文件夹,其中硬件层和驱动层放在BSP文件夹里面,BSP文件里面再分硬件和驱动的文件夹,同时添加一个库文

四轴飞行器1.1 Matlab 姿态显示

四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的完成它...关于matlab上位机,首先做个姿态显示,然后等板子来了,把板子底层程序写好后,加上matlab的串口接收部分,基本的环境就算搭建好了.... 这个代码写了一天,写到最后出现戏剧性的一幕,实在是太恶心了哈..开始自己的想法就是通过输入pitch roll yaw三个欧拉角,然后在空间中现

四轴飞行器1.2.1 RT-Thread 环境搭建

买的飞控板到了,开始写下位机的程序了,本来打算用UCOS的,因为以前用过,比较熟悉,可以很快上手,不过板子的卖家推荐了RT-Thread,以前虽然有接触过,但是没用过,于是去官网看了下,感觉还不错.其一这是咱们国人写的,其二USOS有的基本任务调度功能它都有了,其三它的GUI貌似原生支持中文(不确定),其四他有很多的附加组件,虽然这些组建大部分在以前做项目的时候都自己完成过,并且我并不怎么喜欢集成度太高的RTOS,但是这次可以尝试看看.还有它有些好的环形buffer,可以用来做串口的缓冲,哈,这

四轴飞行器飞行原理与双闭环PID控制

四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的运用前景. 四轴飞行器关键技术在于控制策略.由于智能控制算法在运行复杂的浮点型运算以及矩阵运算时,微处理器计算能力受限,难以达到飞行控制实时性的要求:而PID控制简单,易于实现,且技术成熟,因此目前主流的控制策略主要是围绕传统的PID控制展开. 1 四轴飞行器的结构与基本飞行原理 四轴飞行器结构主要

超酷MWC四轴飞行器DIY全套教程

本帖最后由 hitor 于 2013-8-17 22:06 编辑一.自己玩四轴的经历介绍.      各位模友大家好,我是哈工大航院的一名学生.我接触四轴的时间较早,由于我室友大二做科创就是做四轴的,那时候我们俩一人负责一个项目,他做四轴我做电动独轮车,我不太喜欢我的项目,烧了好多钱,最后也只能草草了事.我对四轴倒是很感兴趣,所以他一焊电路.写程序或是调试PID参数,我都像跟班似的死死的盯着他做的东西,有不懂的就向他请教,时间长了我也掌握了四轴的一些基本知识.几个月前我突发了做四轴的想法,但我不

四轴飞行器Bootloader和固件的更新

在四轴飞行器中,为了方便用户后期对飞行器进行固件升级,一般都采用了Bootloader技术.所谓Bootloader就是指单片机启动后首先运行的一段代码,它的最主要功能就是用于检查用户是否要更新飞控固件.如果是,则进入飞控固件更新进程,如果否,则直接运行当前的飞控固件.此外,有的Bootloader里面也包含进了一些基本的硬件检测功能,如果硬件检测失败,就不进入飞控功能.通常,Bootloader都要配合飞行器的上位机软件来使用. 下面以圆点博士小四轴飞行器为例进一步对Bootloader进行说