跨界 · 融合 · 服務 · 創(chuàng)新
基于uC/OS-II操作系統(tǒng)的無人機飛控系統(tǒng)軟件設計
史峰,何立明,馬曉峰,史中正
摘要:針對以往飛控系統(tǒng)軟件中代碼多,可靠性、實時性差,不具通用性等缺點,采用uC/OS-II操作系統(tǒng)設計無人機飛控軟件,利用操作系統(tǒng)來進行軟件中各任務的實時調度和通信。通過地面測試和空中試驗表明:該軟件系統(tǒng)具有可靠性高、實時性強等優(yōu)點, 滿足飛控系統(tǒng)軟件設計要求。
關鍵詞:飛控系統(tǒng); uC/OS-II;優(yōu)先級劃分;調度與通信
0、引言
無人機飛行控制系統(tǒng)是一個復雜的多任務系統(tǒng), 要求不僅能夠與地面控制站雙向通信、采集傳感器數(shù)據(jù)、進行飛控/導航計算、驅動執(zhí)行機構等, 還要求可靠性高、實時性強。傳統(tǒng)的飛控系統(tǒng)軟件大多按預先設定的順序循環(huán)執(zhí)行, 具有代碼多,可靠性、實時性差, 不具備通用性等缺點。
針對以上缺點,本文采用uC/OS-II操作系統(tǒng)開發(fā)無人機飛控軟件, 將復雜的處理任務交給操作系統(tǒng)進行實時調度,滿足無人機飛控系統(tǒng)實時、多任務的要求。
1、無人機飛控系統(tǒng)軟件總體設計
飛控系統(tǒng)軟件設計基本要求是:1)具有采集功能:能夠采集傳感器的值, 控制信號值和舵機當前狀態(tài)值;2)具有姿態(tài)解算功能:解算出當前無人機的姿態(tài)值;3)具有控制率計算功能:根據(jù)不同任務解算不同控制信號, 實現(xiàn)無人機自主導航;4)具有串口通信功能:接收GPS信息, 通過SD卡存儲信息, 與地面控制站進行信息交換;5)其他要求:具有遙控飛行、自動飛行2種飛行模式的切換功能, 具有系統(tǒng)自檢和墜毀監(jiān)控等功能。
整個系統(tǒng)的軟件流程圖如圖1所示:
圖1 飛控系統(tǒng)軟件流程圖
2、基于uC /OS-II操作系統(tǒng)的飛控軟件設計
2.1 uC/OS-II操作系統(tǒng)簡介 uC/OS-II是目前世界上最小的操作系統(tǒng)內核軟件,它由Labrosse JJ于1992年推出。具有內核小、實時性強、穩(wěn)定性高、任務切換快、可移植性好等優(yōu)點,現(xiàn)已被眾多的研究者作為操作系統(tǒng)的樣板移植到各種硬件平臺上。
2.2 任務劃分和優(yōu)先級確定首先, 對飛控軟件進行任務劃分,將飛控系統(tǒng)軟件進行分解,形成相對獨立的程序模塊或功能函數(shù),并將它們設置為操作系統(tǒng)下的任務,同時確定每個任務的優(yōu)先級。
根據(jù)飛控系統(tǒng)軟件流程圖, 將軟件分為4個模塊來設計,即系統(tǒng)初始化模塊、主控模塊、數(shù)據(jù)存儲模塊、通信模塊,每個模塊對應一個優(yōu)先級不同的任務。其中, 主控模塊又包括數(shù)據(jù)采集、控制運算、控制率輸出3個子模塊。(1)初始化模塊的功能是開機自檢;(2)主控模塊:采集模塊的功能是通過串口和A/D轉換采集傳感器和GPS的值和地面站傳輸?shù)纳闲兄噶睿贿\算模塊的功能是進行姿態(tài)解算和控制率計算;輸出模塊的功能是把控制率輸出到驅動舵機;(3)數(shù)據(jù)存儲模塊的功能是將采集和控制計算的數(shù)據(jù)存儲到SD卡中;(4)數(shù)據(jù)通信模塊的功能是將采集和控制計算的數(shù)據(jù)通過數(shù)據(jù)鏈傳輸?shù)降孛婵刂婆_。
根據(jù)系統(tǒng)的功能要求,將軟件分成4個優(yōu)先級不同的任務:第一個任務是初始化任務TaskIint( ) , 由初始化模塊構成,該模塊的主要功能是系統(tǒng)自檢。這是整個程序中優(yōu)先級最高的任務,優(yōu)先級定義為1,系統(tǒng)一上電就執(zhí)行這個任務;第二個任務是TaskWork( ),這個任務的優(yōu)先級僅次于TaskIint( )任務,優(yōu)先級定義為2,此任務由主控模塊構成,是一個實時性較強的任務。這個任務是一個無限的循環(huán), 執(zhí)行周期為20ms;第三個任務是TaskDataMemory( ),由數(shù)據(jù)存儲模塊構成,這個任務是優(yōu)先級較低的任務,優(yōu)先級定義為3;第四個任務是TaskDataTransfer( ),由數(shù)據(jù)通信模塊構成,是程序中優(yōu)先級最低的任務,優(yōu)先級定義為4。
2.3 任務的調度與通信任務建立完成后,要能夠協(xié)調地工作、完成系統(tǒng)功能,需要對任務進行調度和通信。任務間的調度是指內核決定多任務中該輪到哪個任務的運行。uC/OS-II操作系統(tǒng)中的任務狀態(tài)分為睡眠態(tài)任務、就緒態(tài)任務、等待狀態(tài)任務、運行態(tài)任務和被中斷的任務5個狀態(tài), uC/OS-II是基于優(yōu)先級調度法的可剝奪型內核,即是指CPU總是讓處于就緒態(tài)的、優(yōu)先級最高的任務先運行。
任務間的通信是指任務間或中斷服務與任務間的信息傳遞。任務間的通信方式有信號量管理、互斥型信號量管理、事件標志組管理、消息郵箱管理、消息隊列管理和內存管理。本文采用消息郵箱管理,典型的消息信箱也稱作交換消息,使用一個指針型變量, 通過內核服務,一個任務或一個中斷服務子程序通過內核服務可以將一則消息放到郵箱里去。同樣, 一個或多個任務通過內核服務, 可以接收這則消息。當任務接到消息之后, 狀態(tài)變?yōu)榫途w態(tài)任務,等到其優(yōu)先級變?yōu)樽罡邥r執(zhí)行該任務。
本系統(tǒng)中定義的4個任務的調度和通信是這樣實現(xiàn)的:系統(tǒng)上電后執(zhí)行的第一個任務TaskIint( ) ,所以,在初始化任務執(zhí)行完成并返回正常的情況下,利用uC/OS-II的OSTaskDel( ) 函數(shù)將這個任務返回并處于休眠狀態(tài)。此時,TaskWork( )成為優(yōu)先級最高的任務,將會一直執(zhí)行。由于程序運行本身并不占用太多時間,所以,使用OSTimeDly( )函數(shù)進行延時20ms,即任務TaskWork( ) 將自己掛起20ms,將CPU的控制權交給其他任務。任務TaskDataMemory( )的運行周期為120ms,即當任務TaskWork( )執(zhí)行6次后,向任務TaskDataMemory( )發(fā)送一次消息, 消息中包含需要存儲的數(shù)據(jù),任務TaskDataMemory ( ) 接收到消息后,等到任務TaskWork( )將自己掛起時執(zhí)行。任務TaskDataTransfer( )的運行周期為1s,當任務TaskWork( )執(zhí)行50次后, 向任務TaskDataTransfer( )發(fā)送一次消息, 消息中包含需要向地面站發(fā)送的數(shù)據(jù), 任務TaskDataMemory( ) 接收到消息后,等到任務TaskWork ( ) 將自己掛起時執(zhí)行。因為任務TaskDataMemory ( ) 和TaskDataTransfer ( ) 運行時間很短,在TaskWork( ) 掛起20ms中執(zhí)行完畢,不會出現(xiàn)運行過程中被高優(yōu)先級任務搶奪CPU控制權的現(xiàn)象。主函數(shù)偽代碼如下: