飞控软件架构
笔者非科班出身,从事无人机飞控设计四余年,主要参与飞控系统总体设计,仿真试验及外场试飞,对飞行控制与管理系统方面,限于没有做全面系统性梳理总结,知识属于囫囵又杂散的状态。前段时间组织做过一个界面程序,意图完成总结性工作,目前尚在完善过程中。笔者一直认为飞控系统软件和控制律(算法)是想成为飞控系统设计大神,手里应该掌握的镰刀和榔头!本文为笔者学习飞控软件架构后整理的学习笔记,如有内容错误,欢迎指正。文中对引用他人内容会明确说明,如有疏漏未标明,欢迎指出,笔者将积极回应。一、飞控系统组成模块 早期无人机没有软件架构,是通过无线电(RC)控制技术发展起来的,笔者在大学本科上的第一门课叫“自动化导论”,记忆深刻,上课开始教授就给出一张图,一个典型的闭环控制系统(包含控制目标,控制器,反馈信息,执行机构),这个也很准备地概括出了早期无人机飞控系统。得益于卫星能力的增强和计算机处理能力、算法发展、实时系统应用、机电飞控系统、导航系统方面的技术进步,目前的飞控系统随着软件架构变化而发展。但无人机飞控系统的基本功能是不变的:主要依靠传感器系统获取位姿信息,反馈到微处理器进行控制系统的运算,输出控制指令给相关子系统(伺服作动/机电系统)。所以飞控软件设计主要负责搭建合理软件流程,使各功能模块协调有效的工作。
当然,设计一个现代无人机飞控系统软件时,就不仅仅是让飞机飞起来那么简单了,也就是说软件模块除了基本要素外,还需有其他扩展功能,一个完整的飞控软件组成模块包括:
1、传感器模块(包括预处理/校准模块)
2、通信模块
3、控制输入模块(来自地面或自动控制模块)
4、导航/制导模块
5、飞行模式管理模块
6、参数管理模块(控制可调参数、性能查值等)
7、飞行控制模块
8、起飞/着陆检测模块
9、应急处置/健康管理模块
10、数据记录模块
11、固件升级模块
…
飞控软件组成模块
二、软件设计方法 笔者在大学期间参加大学生创新大赛时,当时团队三人查资料合计后做的是一款球形机器人(最终结果它只是完成了直线运动,未能实现设计之初设想的万向运动,定点止停),同实验室有同学就做的是涵道无人机,那个时候也就初步接触了一点飞控知识。
跟我们的机器人软件一样,为了方便快捷,软件系统的编写采用前后台操作的方式。前台应用程序是放在mian主函数里面无限循环,调用相应的处理子函数;后台中断程序处理异步触发事件。为保证时间的精确性,有些固定周期执行的任务都要靠中断服务程序来完成,但是在中断处理程序中只标记事件的发生,不做任何处理,转而由后台系统调度处理,这是为了避免在中断程序执行时间过长影响后续和其他中断事件。
目前,很多开源飞控是带OS(片上系统)的飞控设计。across在一篇总结文章中这样描述:这种设计方法是在某一操作系统上进行二次开发,OS通过一个内核的调度来管理CPU,使得所有的模块也就是任务都能正常运行,达到相对意义的“并行”。同时采用基于优先级的可剥夺性调度算法来保证实时性。RTOS 将应用层软件分成多个任务,简化了应用软件的设计,同时使得飞行控制的实时性得到保证。
直观地说,带OS的飞控,其固件同时附带了一系列工具集、系统驱动/模块与外围软件接口层,所有这些软件(包括用户自定义的飞控软件)随OS内核一起,统一编译为固件形式,然后上传到飞控板中,从而实现对飞控板的软件配置。
带OS的飞控系统软件架构中,最有意思的一点在于整个架构的抽象性(多态性),即:为了最大限度保障飞控算法代码的重用性,其将飞控逻辑与具体的底层控制器指令实现进行了解耦合。
博主NeoRAGEx2002在他的一篇博文中对上述两种设计方法有一段总结,我比较认同,摘录如下:有很多搞自动化出身、没太多软件经验的朋友倾向于直接使用底层控制协议来控制飞控板,但实际上PX4架构(笔者注:带OS的飞控设计实例)已经在更高的抽象层面上提供了更好的选择,无论是代码维护成本、开发效率、硬件兼容性都能显著高于前者。很多支持前者方式的开发者的理由主要在于高层封装机制效率较低,而飞控板性能不够,容易给飞控板造成较大的处理负载,但实际从个人感觉上来看,遵循PX4的软件架构模式反倒更容易实现较高处理性能,不容易产生控制拥塞,提升无人机侧系统的并发处理效率。
PX4/Pixhawk飞控软件架构
三、架构进化 Wyle Aerospace Group的Fred Briggs发表过一篇论文《UAV Software Architecture》(无人机软件架构)对相关软件架构进化过程做了综述性梳理,笔者对这部分内容进行简化后分享如下:
[*]A. 开放控制平台
开放控制平台(Open Control Platform,OCP)是一种面向对象的软件基础构件,“提供一条将控制设计快速转换为桌面或嵌入式目标代码的路径,它使得控制设计师可以专注于控制设计而非集成、通信、发布、移植、执行、调度、系统配置和资源管理等软件设计问题。”
[*]B. WITAS分布式UAV架构
此分布式架构使用COBRA作为基础构建用于即插即用的软硬件环境,并且基于一种以反应为中心(reactive concentric)的软件控制方法。最大的设计挑战是控制系统有多个控制模式,可由架构激活以动态调用。此设计的软件架构包括一个慎思、反应和控制部分,因此不再是一个分层递阶 结构而是一个“以反应为中心”的架构。此反应中心的架构是一个高度分布、松散耦合、并发的架构,具有很多反应控制和并发运行的服务进程。
分布式UAV WITAS架构的软件组件(2004)
[*]C. ARL/PSU智能控制器
此IC(智能)架构是一种基于行为(相对于基于模型)的架构,设计采用层级控制,由于从下至上的模式增加了功能复杂性。它经过改进,以满足协作能力的要求。图4所示IC架构包含感知和响应模块。感知模块通过接收传感器的输入数据建立一个外部真实世界的表示。响应模块使用感知模块建立的真实世界的认知生成一个规划,来执行特定任务。
ARL/PSU 智能控制器高层架构(2008)
[*]D. SheLion UAV系统
Cai, G、Chen, B.和Lee, T.在《无人旋翼系统》介绍了一种行为式的架构,他们指出此架构可以普遍应用到无人机,包括机载软件系统和地面控制站的软件系统。飞行控制模块使用多线程框架,用于操作导航传感器和伺服作动器、日志记录飞行数据、与地面站通信以及实施自动控制算法。自动控制采用基于行为的体系结构。SheLion飞行控制系统的框架如图所示。
SheLion飞行控制软件系统框架(2011)
四、示例分析 下面简单介绍一款开源的飞控代码,都是网上找的代码,主要看下软件架构。 基于MDK的开发环境,使用C语言,基于STM32的官方库。
代码结构:
[*]STARTUPCODE:stm32的启动文件;
[*]StdPeriph_Driver:基于3.5版本的库函数的驱动文件;
[*]USB-FS-Device_Driver:USB设备驱动文件;
[*]usb_virture_com:USB的板级支持驱动;
[*]Driver:板级驱动层,包含一些总线和外设的驱动程序;
[*]Modules:传感器模块的驱动程序;
[*]Algorithm:算法程序,包含滤波、数学库等;
[*]Function:飞行应用层,关键模块,比如姿态估计、姿态控制等;
[*]User:主程序和中断应用程序;
[*]ANO_DT:支持匿名地面站协议;
[*]Heigh:高度控制程序;
整个代码的模块化非常细致,比较清晰。 代码设计就是前面所讲的裸机代码的一般实现方法。
先看main文件:
非常简单,上电进行各种初始化,然后大循环,循环执行任务调度。
下面看下loop的函数内容:
将整个飞控代码分成了几个周期分别为5ms,10ms,25ms、50ms和100ms的任务。而每个任务的时间标志flag是由一个时间片函数进行管理的。设了一个tick节拍,2.5ms一次,所以比如计数达到2次,则5ms的定时任务即可执行。
而这个时间片函数是一个定时中断,每隔2.5ms执行一次。
这种程序设计方法如下图所示。定时中断的影响只在任务调度模块里起作用,依次让不同的任务按不同的周期进行执行。要注意的是所设计的每个任务运行时间不能超过设定的周期。
素材部分来自网络:across的《飞控软件设计系统性总结》、Fred Briggs的论文《UAV Software Architecture》、博主NeoRAGEx2002的《PX4/Pixhawk飞控软件结构简介》
源自:知飞之家
页:
[1]