启航篇——四旋翼飞行器之入坑两年心路历程和毕设总结

    笔者今年大四毕业,由于之前参加比赛及准备考研,没有时间总结这两年来做四旋翼飞行器的心得体会。现在借毕业设计这个契机,想把这件事做了,算是两年的收尾工作,也是个新的开始。

    先从介绍这两年的经历开始吧。开始正式入坑四旋翼是在2017年参加全国电子设计大赛,笔者当时是大二。选择的题目是四旋翼。还记得当时是要完成一键起飞,四旋翼追踪小车,一键下落等功能。想想那个时候选择这个题目也是大胆,学校在这方面没有一点基础,纯粹是我们学生自己兴趣和老师想要开辟新的方向而已。可想而知,最后,我们当然是凉了。不过,借这个机会,也终于算是入了门。虽然在这之前,也玩过PIXHAWK这些国外商品级飞控,不过那纯粹是玩飞行,并没有接触源代码,也不知道开源飞控这个概念。

 

    这个阶段姑且称它为入门阶段吧,在这个时候最感谢的应该就是梁工了,在做第一代飞控的时候帮助我们很多,是将我们带进四旋翼这个新领域的领路人。在他的帮助下,我们知道怎么自己组一台四旋翼,从自己做机架开始,自己画板、自己焊板、自己调试、自己编程、自己手飞测试,在他的帮助下我们真的少走了很多弯路。在这个过程中,我们学会了工程化的代码是怎么写的,知道了怎么用定时器时分复用,四旋翼飞行器代码整个框架是怎么做的,PID参数调试大概要怎么调,如何用示波器和串口调试。在调试中也遇到很多问题,也解决了很多问题。虽然,对于四旋翼核心的算法部分我们还是半知半解,但是在这个比赛中,我们收获很多,结果不重要,过程才是最重要的。

 

    一代飞控用的是STC8增强型51内核单片机,实现的功能是DIY遥控器姿态飞行,外加气压定高不成熟版(单极PID),还有实现上位机调参功能。一代做了大四轴和小四轴,小四轴硬件出了问题,LDO处理得不好,飞行不稳定。附下当时做的作品。

 

                               

 

 

 

 

     

接下来是大三至今,称它为入坑阶段吧。经历了电赛的蹂躏,我们明白完全靠自己用性能不强大的STC8单片机做出功能强大的飞控是不可行的。所以,我们瞄准了国内的几个开源飞控,主要就是无名和匿名。这两个飞控的硬件和软件对我们的二代飞控设计帮助很大。为了完成之前国赛未实现的功能,我们开始了二代飞控的制作。

 

      二代飞控用的是STM32F4芯片,在姿态自稳的基础下,实现室内定点定高,用的是匿名的光流模块,同时也实现了室外定高定点,用的是乐迪的M8NGPS。在此基础下,飞行器通过OPENMV3摄像头识别AprilTag标签,得到标签的ID号和相应X Y Z轴的位置。其效果为:通过遥控器一键启动,飞行器可自动飞行到手机APP指定的标签位置并完成相应动作。在这个阶段主要是对四旋翼的制作理解上了一个台阶,开始制作性能比较好的飞控,硬件也比较完善了,代码框架也在形成。附下当时做的作品。

 

   

 

 

      好了,废话不讲太多,下面才是正题,借毕业设计这个项目说下我对四旋翼的理解。毕业设计是在之前做的硬件平台下总结了四旋翼的原理,主要做的是研究工作。

     首先先介绍系统原理。系统原理分为运动原理,简单来说就是怎么才能够飞起来。在这里我就不对系统进行建模分析了,在论文上有简单分析了下,但最终还是当四旋翼为一个刚体。在这里介绍一个网站,北航里面做四旋翼的科研小组做的一个网站,https://www.flyeval.com/,在这个网站可以估计自己四旋翼的性能,也有性能估计和系统建模算法的介绍。

     回到正题,开始讲运动原理。在我这个设计里,单片机定时器外设输出PWM信号给电调,电调控制电机旋转产生升力,其实这样就可以飞起来了。假设电机和机架是完全对称且没有任何误差,就是一个线性系统,那么从下面这个图可以看到,对角线上的电机旋转方向相同,主副对角线都会产生彼此方向相反的扭力,前面假设了四旋翼是线性系统,那么电调输出的电压相同,扭力就会正好相互抵消,这样就不会自转,使电压增大而使升力增大那么就飞起来了。理论上,只有一对对角线的电机也是可以飞起来的。但是,飞行器会往一个方向旋转。原理很简单。好了,解释完这个那么四旋翼的运动就很简单了,增加12电机的转速,就产生俯仰运动,向前俯仰,增加14电机的转速,就产生横滚运动,向右横滚,增加13电机的转速,是产生偏航运动,顺时针偏航。但是,我们知道四旋翼飞行器不可能是个线性系统,一定会产生偏差,所以我们需要用传感器测得偏差,作为系统的观测量,然后通过飞控代码的控制算法来实现控制。举个简单的例子,就是飞行器往左偏了一点,我就要让算法让飞行器往右偏一点。这个算法的过程其实是贯彻整个控制的,不单是姿态的控制,还有高度和水平位置的控制。在讲解如何实现控制之前,先来介绍偏差也就是观测量是怎么得到的?为什么我们要融合传感器的数据?

 

      在介绍如何得到融合后的观测量之前,先介绍下一些知识。首先,我这个系统是个组合导航系统,是INSGPS两个导航系统的组合。所谓INS,就是惯性导航系统,就是用加速度计、陀螺仪和磁力计这些惯性器件测得一个惯性数据来进行导航,它的优点是不需要从外部获得信号,实时得到姿态信息,但是缺点是由于有积分这些运算会积累误差,导航会随时延而不精准。而GPS我们都很熟悉,GPS导航就是用GPS收到的经纬度信息处理后进行导航,其优点是长时间提供导航信息。组合导航就是把这两个导航系统结合,可以长时间提供高精度的导航数据。

      要实现姿态飞行和定高定点,难点其实就在于这两个系统的组合,即怎么样把XYZ轴上这几个传感器的偏移数据拟合在一起。这里插一个小知识,机体坐标系就是机体上测得的坐标,而导航坐标系是在地球磁场下的坐标,是旋转到了相应方向下的。加速度计得到的三轴数据其实是机体坐标系下的三轴数据,需要在陀螺仪的帮助下,经过方向余弦矩阵旋转到导航坐标系,经磁力计将机头摆正,保证飞控知道机头朝向哪。具体如何实现,我这边没有贴出公式,代码中其实是用四元数的方法来实现,因为这样计算比起计算三角函数来的要快。具体如何实现在秦永元那本惯性导航的书里有详细的推导,在代码中,姿态解算可以用梯度下降加二阶毕卡解微分方程的方式来求解,这里就不过多叙述了,具体也可看书。

 

     简单来说,飞行器要实现姿态飞行,那么就要姿态解算,实现了姿态飞行且飞稳以后,才开始实现定高定点。定高定点对应的是导航坐标系上的三个轴,XY轴上数据有加速度计、磁力计、陀螺仪和GPS,加速度计和陀螺仪的数据怎么映射到导航坐标系这个在惯性导航那本书也有,GPS的数据可以把经纬度信息通过球面投影的方法投影到大地,经过磁力计旋转,跟加速度计数据进行拟合就可以得到XY轴上的融合过后的数据。同样,Z轴上,气压计可以通过压差法很简单的得到高度信息,跟加速度计Z轴数据拟合后,就得到融合后的Z轴数据。

                         

                       这些图是惯性器件,陀螺仪、加速度计、气压计,还有GPS

 

      融合使用的是三阶互补滤波的方法。如下图1,以加速度计Z轴为例,假如我们没有用互补滤波的方法,系统就是一个开环的系统,Z轴的加速度计两次积分后得到位置信息。我们知道,纯积分环节下的极点是0,这样的系统是发散的,不可能稳定。那么我们看下面的三阶互补滤波的系统方框图,所谓三阶,就是这里引入了三路的回路反馈,分别是位置、速度和加速度,取适当的三个值,我们可以调到一个稳定的状态。而这里分别是三个三阶互补的系统,分别是XYZ轴。(补:调的最佳参数可以近似看成在卡尔曼滤波器融合方法中求得的最优解)

 

 

     介绍完了数据融合,如何利用融合的数据进行控制,这个就是控制原理了。本设计用的控制器是串级PID控制器,假设已经实现了姿态飞行,现在调试定高功能,在这个单极PID的系统方框图,输入量是我们想要的高度,输出PWM,驱动电机,由于四旋翼不是线性系统,那么飞行器肯定会有偏差,当前高度减去期望高度就是偏差,偏差反馈回去跟输入一起映射到PWM输出,就形成一个闭环系统,调好这三个参数,可以达到稳定的状态。我们可以通过MATLAB仿真调试,其实就是求使这个系统传递函数稳定的最优解。单极系统我们理解了,那么串级系统也是很简单的,就是将一个PID控制器的输出作为另外一个PID控制器的输入,最终输出控制量到被控对象,在里面的PID控制器属于内环,外面的控制器属于外环,也就是外环的输出作为内环的输入,最终内环输出到被控对象。在串级系统中,内环的参数比外环要重要,调好内环参数,外环参数相对比较容易解决。

     以上就是系统的原理,下面是系统的软件框图,我采用的是定时器时分复用的方法,根据不同外设、不同算法、不同传感器需要的更新时间,将其在不同时间线程中调用。这种方法在工业控制中是常规方法,没有跑操作系统,这种方式能最大限度利用MCU的性能。

最后附下:硬件框图

 

 

     最后是项目的总结。主要是项目之后该如何完善,在算法层面是,一个是滤波器,由于加速度计主要是高频噪声信号,所以要设计一个低通数字滤波器,我这个设计用的是二阶巴特沃茨滤波器,在之后可以考虑用性能更好的滤波器,比如FIR滤波器。数据融合的方式可以采用卡尔曼滤波器融合,它的作用就是求得最优解,等效于前面三阶互补滤波器自己设的最优参数。控制算法可以采用自适应控制ADRC,复杂的控制系统不可能用一套PID就解决所有问题,需要分段处理,自适应控制的算法就是用来解决这个问题的。

     前面所讲都是简单的原理,没有细究,要是细化,几天几夜也讲不完,里面知识很多,我只能想到哪讲到哪,自己水平也有限,毕竟不是控制专业,不过考研考的就是控制,希望在这方面能有所进步。

 

    学习四旋翼,首先得有电子基础,简单的焊接、测试要懂,动手能力要强,不要怕麻烦,做事情要严谨,不然很容易出事情的。有了基础后,可以在别人的源码上改框架,调参,加自己想要的功能,四旋翼的硬件其实很简单,假如不考虑驱动部分的话,驱动部分用电调,自己画PCB做飞控是很简单的事

 

    多说几句,入门四旋翼的话是个坑,肯定得花钱。不过可以自己用铝管做机架,买二手电机,这样会省钱很多。多逛贴吧,多看论坛大神的帖子,祝各位早日做出属于自己的灰机。

最后,这里预告下之后会做的一些事,也会分享到这个博客上来。

1.单片机的学习之STM32 和TI,会有一些在学习和工作中的分享。这里有之前的一篇博客,类似这种https://blog.csdn.net/weixin_36773706/article/details/86934108

2.EmWIN的学习,之前移植了ST7789驱动的LCD,之后想做无人机数传调试系统,GUI想用Emwin做,有空会推出开发流程。

3.RT-Thread的学习,大一做了一个物联网的系统,比较LOW,之前了解了RT-Thread的系统,正好同学有潘多拉的板子,想要测试做几个项目,可能开板。到时有空也会有开发流程。之前的项目博客:https://blog.csdn.net/weixin_36773706/article/details/78911023

4.VL53l1x TOF 模块的开发,这个芯片有自带的API函数,比旧版本芯片功能要强大,有想要做定高模块的想法。

5. NORDIC 52832的开发工作最近有做,也有可能会推。

6.四旋翼一些融合方法的实现,比如卡尔曼,还有数据滤波的处理、ADRC的实现、观测数据时延问题的解决,这些都是比较浅显的了解,希望能够深入学习之后分享心得。

其实还有一些想法,比如可能明年会自己。一套飞控系统,在CSDN平台的技术分享就当前期的锻炼和准备咯。

祝各位飞控爱好者学习顺利!

                                                 by --- 一个快毕业的菜鸟嵌入式工程师小丘

 

 

 

你可能感兴趣的:(电子设计大赛)