写在前面
开这个专栏的目的主要是深感自己对飞控软件、算法的知识点过于杂乱,很久没有进行系统的总结了,因此决定写几篇文章记录一些飞控开发过程的知识点。主要是针对一些软件、算法部分进行讨论,如内容有错误,欢迎指出。
2019.03.02更新
距离专栏的第一篇文章已经快2年半了,最近在回看文章的时候,发现有些地方写得不尽如人意,或亦是之前的技术水平不足,导致对一些问题的理解不深刻。由此,萌生了将已有文章进行更新的想法,同时也不忘初衷,自己能同时回顾一些知识,毕竟年纪大,工作中不常使用便会遗忘。
1 飞控软件的基本模块
无人机能够飞行主要是依靠传感器系统获取位姿信息并反馈到微处理器进行控制系统的运算。所以飞控软件设计主要负责搭建合理软件流程,使各功能模块协调有效的工作。
一个飞控系统的基本工作主要有:
1、CPU接收遥控器的操作指令和传感器信号;
2、传感器的数据处理和数据融合算法运算,得到位置、姿态信息;
3、根据控制指令完成相应的控制器(姿态、位置)计算,得出控制量并输出到电机驱动;
2 软件设计方法的讨论
刚接触飞控的时候,实验室在设计之初,为了方便快捷,软件系统的编写采用前后台操作的方式。这个方式的应用程序是在放在mian主函数里面无限循环,调用相应的处理子函数。这称为后台程序。而前台程序指的就是中断程序处理异步触发事件的程序。故前台程序称为中断级程序,而后台程序称为任务级程序。因此有些固定周期执行的任务都要靠中断服务程序来完成,以保证时间的精确性。但是在中断处理程序中只标记事件的发生,不做任何处理,转而由后台系统调度处理,这是为了避免在中断程序执行时间过长影响后续和其他中断事件。
这种设计方法的优点:
1、实现简单,特别是对于笔者这样的编程渣,照着stm32的库函数写代码,也可简单实现;
2、类似单片机的编程,没有OS,因此对CPU的性能要求不算高,不太关注ROM/RAM;
3、如果设计得当,相较于带OS的飞控,系统运行更加稳定,听说很多工业级的飞控是不带OS的;
缺点:
由于是用在飞行控制系统中,对整个系统的实时性有着很高的要求,如果逻辑和时序出现偏差,将出现无法估计的严重后果。而在初始开发过程中,发现采用此前后台系统带来两大问题:
1、设计不当的话,比如某个周期的函数执行超时,后面所有的程序都会受到影响。如果飞控程序执行时间变得不够准确,不利于对飞行器的控制,严重时发生飞机失控的现象。
2、移植性和扩展性差,给整个程序后续改动和维护带来不便,由于各种任务都是相关的子函数,往往一个任务需要调用多个子函数。在程序改动或者维护的时候变得非常繁琐复杂。经常由于忽略某一细节而导致功能无法实现,最后导致程序的可读性降低,不利于他人做程序修改。
最近几年也接触了一些开源飞控,看了有关带OS的飞控设计。这种设计方法是在某一操作系统上进行二次开发,OS通过一个内核的调度来管理CPU,使得所有的模块也就是任务都能正常运行,达到相对意义的“并行”。同时采用基于优先级的可剥夺性调度算法来保证实时性。RTOS 将应用层软件分成多个任务,简化了应用软件的设计,同时使得飞行控制的实时性得到保证。
个人偏好,其实比较喜欢裸机的方案。飞控其实说到底不是一个软件功能特别复杂的产品&#