​微信公众号
手机版
​​新浪微博
会员登录
关于我们  |   商务合作  |  友情链接   |  意见反馈  |  人才招聘
北京云翼同创科技有限公司 深圳高博特文化发展有限公司   版权所有,并保留所有权利 © 2018 京ICP备16044150号-1                       

跨界 · 融合 · 服务 · 创新



双击此处添加文字
科普园地
首页  > 新闻聚焦 > 科普园地  >  详情 
基于uC/OS-II操作系统的无人机飞控系统软件设计
来源:尖兵之翼 | 作者:史峰 何立明 马晓峰 史中正 | 发布时间: 2021-12-08 | 7077 次浏览 | 分享到:
针对以往飞控系统软件中代码多,可靠性、实时性差,不具通用性等缺点,采用uC/OS-II操作系统设计无人机飞控软件,利用......

基于uC/OS-II操作系统的无人机飞控系统软件设计

史峰,何立明,马晓峰,史中正

摘要:针对以往飞控系统软件中代码多,可靠性、实时性差,不具通用性等缺点,采用uC/OS-II操作系统设计无人机飞控软件,利用操作系统来进行软件中各任务的实时调度和通信。通过地面测试和空中试验表明:该软件系统具有可靠性高、实时性强等优点, 满足飞控系统软件设计要求。

关键词:飞控系统; uC/OS-II;优先级划分;调度与通信

0、引言 

无人机飞行控制系统是一个复杂的多任务系统, 要求不仅能够与地面控制站双向通信、采集传感器数据、进行飞控/导航计算、驱动执行机构等, 还要求可靠性高、实时性强。传统的飞控系统软件大多按预先设定的顺序循环执行, 具有代码多,可靠性、实时性差, 不具备通用性等缺点。

针对以上缺点,本文采用uC/OS-II操作系统开发无人机飞控软件, 将复杂的处理任务交给操作系统进行实时调度,满足无人机飞控系统实时、多任务的要求。

1、无人机飞控系统软件总体设计

飞控系统软件设计基本要求是:1)具有采集功能:能够采集传感器的值, 控制信号值和舵机当前状态值;2)具有姿态解算功能:解算出当前无人机的姿态值;3)具有控制率计算功能:根据不同任务解算不同控制信号, 实现无人机自主导航;4)具有串口通信功能:接收GPS信息, 通过SD卡存储信息, 与地面控制站进行信息交换;5)其他要求:具有遥控飞行、自动飞行2种飞行模式的切换功能, 具有系统自检和坠毁监控等功能。

整个系统的软件流程图如图1所示:

 

图1 飞控系统软件流程图

2、基于uC /OS-II操作系统的飞控软件设计 

2.1 uC/OS-II操作系统简介  uC/OS-II是目前世界上最小的操作系统内核软件,它由Labrosse JJ于1992年推出。具有内核小、实时性强、稳定性高、任务切换快、可移植性好等优点,现已被众多的研究者作为操作系统的样板移植到各种硬件平台上。

2.2 任务划分和优先级确定首先, 对飞控软件进行任务划分,将飞控系统软件进行分解,形成相对独立的程序模块或功能函数,并将它们设置为操作系统下的任务,同时确定每个任务的优先级。

根据飞控系统软件流程图, 将软件分为4个模块来设计,即系统初始化模块、主控模块、数据存储模块、通信模块,每个模块对应一个优先级不同的任务。其中, 主控模块又包括数据采集、控制运算、控制率输出3个子模块。(1)初始化模块的功能是开机自检;(2)主控模块:采集模块的功能是通过串口和A/D转换采集传感器和GPS的值和地面站传输的上行指令;运算模块的功能是进行姿态解算和控制率计算;输出模块的功能是把控制率输出到驱动舵机;(3)数据存储模块的功能是将采集和控制计算的数据存储到SD卡中;(4)数据通信模块的功能是将采集和控制计算的数据通过数据链传输到地面控制台。

根据系统的功能要求,将软件分成4个优先级不同的任务:第一个任务是初始化任务TaskIint( ) , 由初始化模块构成,该模块的主要功能是系统自检。这是整个程序中优先级最高的任务,优先级定义为1,系统一上电就执行这个任务;第二个任务是TaskWork( ),这个任务的优先级仅次于TaskIint( )任务,优先级定义为2,此任务由主控模块构成,是一个实时性较强的任务。这个任务是一个无限的循环, 执行周期为20ms;第三个任务是TaskDataMemory( ),由数据存储模块构成,这个任务是优先级较低的任务,优先级定义为3;第四个任务是TaskDataTransfer( ),由数据通信模块构成,是程序中优先级最低的任务,优先级定义为4。

2.3 任务的调度与通信任务建立完成后,要能够协调地工作、完成系统功能,需要对任务进行调度和通信。任务间的调度是指内核决定多任务中该轮到哪个任务的运行。uC/OS-II操作系统中的任务状态分为睡眠态任务、就绪态任务、等待状态任务、运行态任务和被中断的任务5个状态, uC/OS-II是基于优先级调度法的可剥夺型内核,即是指CPU总是让处于就绪态的、优先级最高的任务先运行。

任务间的通信是指任务间或中断服务与任务间的信息传递。任务间的通信方式有信号量管理、互斥型信号量管理、事件标志组管理、消息邮箱管理、消息队列管理和内存管理。本文采用消息邮箱管理,典型的消息信箱也称作交换消息,使用一个指针型变量, 通过内核服务,一个任务或一个中断服务子程序通过内核服务可以将一则消息放到邮箱里去。同样, 一个或多个任务通过内核服务, 可以接收这则消息。当任务接到消息之后, 状态变为就绪态任务,等到其优先级变为最高时执行该任务。

本系统中定义的4个任务的调度和通信是这样实现的:系统上电后执行的第一个任务TaskIint( ) ,所以,在初始化任务执行完成并返回正常的情况下,利用uC/OS-II的OSTaskDel( ) 函数将这个任务返回并处于休眠状态。此时,TaskWork( )成为优先级最高的任务,将会一直执行。由于程序运行本身并不占用太多时间,所以,使用OSTimeDly( )函数进行延时20ms,即任务TaskWork( ) 将自己挂起20ms,将CPU的控制权交给其他任务。任务TaskDataMemory( )的运行周期为120ms,即当任务TaskWork( )执行6次后,向任务TaskDataMemory( )发送一次消息, 消息中包含需要存储的数据,任务TaskDataMemory ( ) 接收到消息后,等到任务TaskWork( )将自己挂起时执行。任务TaskDataTransfer( )的运行周期为1s,当任务TaskWork( )执行50次后, 向任务TaskDataTransfer( )发送一次消息, 消息中包含需要向地面站发送的数据, 任务TaskDataMemory( ) 接收到消息后,等到任务TaskWork ( ) 将自己挂起时执行。因为任务TaskDataMemory ( ) 和TaskDataTransfer ( ) 运行时间很短,在TaskWork( ) 挂起20ms中执行完毕,不会出现运行过程中被高优先级任务抢夺CPU控制权的现象。主函数伪代码如下: