基于STM32F4的四軸航拍飛行器
1.引言
四軸飛行器是一種利用四個旋翼作為飛行引擎來進(jìn)行空中飛行的飛行器。進(jìn)入20世紀(jì)以來,電子技術(shù)飛速發(fā)展四軸飛行器開始走向小型化,并融入了人工智能,使其發(fā)展趨于無人機,智能機器人。
本文引用地址:http://m.butianyuan.cn/article/201611/316121.htm四軸飛行器不但實現(xiàn)了直升機的垂直升降的飛行性能,同時也在一定程度上降低了飛行器機械結(jié)構(gòu)的設(shè)計難度。四軸飛行器的平衡控制系統(tǒng)由各類慣性傳感器組成。在制作過程中,對整體機身的中心、對稱性以及電機性能要求較低,這也正是制作四軸飛行器的優(yōu)勢所在,而且相較于固定翼飛機,四軸也有著可垂直起降,機動性好,易維護等優(yōu)點。
在實際應(yīng)用方面,四軸飛行器可以在復(fù)雜、危險的環(huán)境下可以完成特定的飛行任務(wù),也可以用于監(jiān)控交通,環(huán)境等。比如,在四軸飛行器上安裝甲烷等有害氣體的檢測裝置,則可以在高空定點地檢測有害氣體;進(jìn)入輻射區(qū)檢查核設(shè)施;做軍事偵察;甚至搬運材料,搭建房屋等等。本設(shè)計利用四軸搭載云臺實現(xiàn)航拍任務(wù),當(dāng)然經(jīng)過改裝也可以執(zhí)行其他任務(wù)。
本設(shè)計主要研究了四軸飛行器的姿態(tài)結(jié)算和飛行控制,并設(shè)計制作了一架四軸飛行器,對關(guān)鍵傳感器做了標(biāo)定,并利用用matlab分析數(shù)據(jù),設(shè)計算法,還進(jìn)行了單通道平衡試驗調(diào)試,進(jìn)行試飛實驗取得了一定的效果。
2.系統(tǒng)方案
本設(shè)計采用STM32F4作為核心處理器,該處理器內(nèi)核架構(gòu) ARM Cortex-M4,具有高性能、低成本、低功耗等特點。
主控板包括傳感器MPU6050電路模塊、無線藍(lán)牙模塊、電機啟動模塊,電源管理模塊等;遙控使用商品遙控及接收機??刂菩酒东@接收機的PPM命令信號,傳感器與控制芯片之間采用IIC總線連接,MCU與電調(diào)之間用PWM傳遞控制信號。
軟件算法才用基于四元數(shù)的互補濾波解算姿態(tài)叫,控制算法才用經(jīng)典PID控制器控制云臺舵機和四軸電機。如圖2-1為本設(shè)計總體框圖。
3.系統(tǒng)硬件設(shè)計
針對前面提出的整體設(shè)計方案,本設(shè)計采取模塊化策略,將各個功能部分開來設(shè)計,最后組合起來。
3.1 電源管理模塊
四軸飛行器要求整體設(shè)計質(zhì)量較輕,體積較小,因此在電池的選取方面,采用體積小、質(zhì)量輕、容量大的鋰電池供電最合適。系統(tǒng)的核心芯片為STM32F103,常用工作電壓為3.3V,同時慣性測量傳感器,藍(lán)牙通信模塊的常規(guī)供電電壓也為3.3V,鋰電池的電壓為11.4V,要使系統(tǒng)正常工作,需要將11.4V的鋰電池電壓穩(wěn)壓到3.3V。常用的78系列穩(wěn)壓芯片已不再適用,必須選擇性能更好的穩(wěn)壓芯片。
經(jīng)綜合考慮,本電路采用LM1117-3.3和LM2940-5電源部分的核心芯片。電池電源經(jīng)過LM2940-5降到5V后在輸入LM1117-3.3穩(wěn)壓為3.3V。由于電機部分電流較大,故在飛控電路部分加入了過流保護,使用500mA的保險絲。電路圖如下。
表3-1 四軸飛行器硬件清單
4.系統(tǒng)軟件設(shè)計
軟件設(shè)計上由控制核心STM32F4讀取傳感器信息,解算姿態(tài)角,以姿態(tài)角為被控制量融合遙控信息后,輸出到四個電機及兩個舵機以完成四軸飛行控制和云臺的穩(wěn)定補償。下圖是軟件流程:
4.1.四元素計算姿態(tài)角的實現(xiàn)
根據(jù)前面給出的姿態(tài)解算方程與四元數(shù),即可得到姿態(tài)計算系統(tǒng)的計算原理如下圖(4-1)
本設(shè)計基于互補濾波的思想上完成的四元素算法,其核心思路為利用加速度測得的重力向量與估計姿態(tài)得到重力向量的誤差來矯正陀螺儀積分誤差,然后利用矯正后的陀螺儀積分得到姿態(tài)角。
首先不妨設(shè)處理后的加速度數(shù)據(jù)為:ax,ay,az,單位m/s^2。加速度計的向量為 (ax,ay,az)陀螺儀數(shù)據(jù)為:gx,gy,gz,單位rad/s。陀螺儀向量 (gx,gy,gz),由式(4-5)可得由載體到導(dǎo)航坐標(biāo)系的四元數(shù)形式轉(zhuǎn)換矩陣為:
根據(jù)余弦矩陣和歐拉角的定義,地理坐標(biāo)系的重力向量,轉(zhuǎn)到機體坐標(biāo)系,是 中的第三列的三個元素,即。所以加速的向量與估計重力向量叉積:
然后利用向量的叉積, 可視為誤差向量,這個叉積向量仍舊是位于機體坐標(biāo)系上的,而陀螺積分誤差也是在機體坐標(biāo)系,而且叉積的大小與陀螺積分誤差成正比,正好拿來糾正陀螺。由于陀螺是對機體直接積分,所以對陀螺的糾正量會直接體現(xiàn)在對機體坐標(biāo)系的糾正。用上面得到的結(jié)果校正陀螺儀:
此處k為一個常量系數(shù)。
再利用二階畢卡法解四元數(shù)微分方程(4-6),更新四元數(shù)為下一次計算做準(zhǔn)備。畢卡二階算法為:
最后將四元數(shù)轉(zhuǎn)變?yōu)闅W拉角:
數(shù)據(jù)流程圖如下:
通過以上算法我成功得出了飛行器的姿態(tài)角,在開啟電機的情況下,角度誤差在+/-2°以內(nèi),滿足了控制要求。姿態(tài)計算效果如下圖所示,其中紅色和藍(lán)色是直接由加速度計算出的俯仰角和橫滾角,青色和黃色為姿態(tài)結(jié)算后的俯仰角和橫滾角。由圖中數(shù)據(jù)可看出,解算的姿態(tài)角不僅能即時的反應(yīng)角度變化切曲線平滑,說明姿態(tài)解算算法有效。
4.2.控制設(shè)計
由于四軸飛行器獨特的機械結(jié)構(gòu),即結(jié)構(gòu)上的對稱設(shè)計,使得四軸在俯仰角的控制欲橫滾角的控制上有這近乎相同的控制特性,且兩者相對獨立。四軸飛行器的俯仰,橫滾,偏航,升降可以通過四個輸入量來控制。通過設(shè)定一個期望角度,調(diào)整電機轉(zhuǎn)速,使得測得的姿態(tài)角穩(wěn)定在期望角。控制律的設(shè)計主要采用是閉環(huán)控制。以姿態(tài)角做為被控制量,采用經(jīng)典的PID控制算法。
四軸飛行器系統(tǒng)是一個時變且非線性的系統(tǒng),采用傳統(tǒng)PID算法的單一的反饋控制會使系統(tǒng)存在不同程度的超調(diào)和振蕩現(xiàn)象,無法得到理想的控制效果。本文將前饋控制引入到了四軸飛行器系統(tǒng)的控制中,有效地改善了系統(tǒng)的實時性,提高了系統(tǒng)的反應(yīng)速度;并且根據(jù)四軸飛行器系統(tǒng)的特點,對數(shù)字PID算法進(jìn)行了改進(jìn),引入了微分先行環(huán)節(jié),改善了系統(tǒng)的動態(tài)特性;使得控制器能夠更好地適應(yīng)四軸飛行器系統(tǒng)的實際情況。
在姿態(tài)角的控制中,本設(shè)計將控制器捕獲到的遙控器信號轉(zhuǎn)換為一個角度,作為期望角,與解算出來的測量角作差,得到偏差error。將error乘以一個比例系數(shù)kp。在只有kp作用下,系統(tǒng)會有靜差所以考慮利用積分ki控制消除穩(wěn)態(tài)誤差。但積分控制會降低系統(tǒng)的動態(tài)性能,甚至造成閉環(huán)系統(tǒng)不穩(wěn)定,因此要對積分進(jìn)行限幅,防止積分過大。
對于微分,如果采用傳統(tǒng)的D方法,在人為操縱四軸時會產(chǎn)生輸入的設(shè)定值變化頻繁且幅度較大,從而造成系統(tǒng)的振蕩。對人為控制十分不利,為了解決設(shè)定值的頻繁變化給系統(tǒng)帶來的不良影響,本文在姿態(tài)角控制上引入了微分先行PID算法,其特點是只對輸出量進(jìn)行微分,即只對陀螺儀角速度測量值進(jìn)行微分,而不對姿態(tài)角的設(shè)定值進(jìn)行微分。這樣,在設(shè)定值發(fā)生變化時,輸出量并不會改變,而被控量的變化相對是比較緩和的,這就很好地避免了設(shè)定值的頻繁變化給系統(tǒng)造成的振蕩,明顯地改善了系統(tǒng)的動態(tài)性能。控制周期定為4ms,姿態(tài)控制系統(tǒng)示意圖如下:
圖5-1姿態(tài)控制系統(tǒng)示意圖
通過前面一章的介紹我們已經(jīng)的達(dá)到了俯仰,橫滾,航向三個控制量,然后將它們分別輸入三個獨立的如上圖所示的PID控制器,我們可以得到三個PID輸出:pid_roll,pid_pitch,pid_yaw將這三個輸出量做簡單的線性運算輸出給電機。部分代碼如下:
#define PIDMIX(X,Y,Z) Motor_Thr + pid_pitch* Y+ pid_roll*X + pid_yaw*Z
MOTOR1=MOTORLimit(PIDMIX(+1,+1,-1)); //REAR_R 后右電機
MOTOR2=MOTORLimit(PIDMIX(-1,-1,-1)); //FRONT_R 前右電機
MOTOR3=MOTORLimit(PIDMIX(-1,+1,+1)); //REAR_L 后左電機
MOTOR4=MOTORLimit(PIDMIX(+1,-1,+1)); //FRONT_L 前左電機
4.3. PID參數(shù)調(diào)節(jié)
PID參數(shù)的整定是PID控制的關(guān)鍵環(huán)節(jié),直接影響到控制的效果。故一個PID設(shè)計的好不好往往要看其參數(shù)能否調(diào)節(jié)好,本設(shè)計的PID參數(shù)調(diào)節(jié)采用湊試法。湊試法是通過實際的閉環(huán)系統(tǒng),通過觀察系統(tǒng)的響應(yīng)曲線,在本設(shè)計中通過觀察被調(diào)量,PID輸出,設(shè)定值三條曲線,判斷出kp,ki,kd對系統(tǒng)響應(yīng)的影響,反復(fù)嘗試,最終達(dá)到滿意響應(yīng),從而達(dá)到確定控制參數(shù)的kp,ki,kd的目的。在參數(shù)調(diào)節(jié)過程總遵循以下原則[17]:
(1)在輸出不振蕩時,增大比例增益P。
(2)在輸出不振蕩時,減小積分時間常數(shù)Ti。
(3)在輸出不振蕩時,增大微分時間常數(shù)Td。
(4)一般步驟:
a.確定比例增益P
確定比例增益P時,首先去掉PID的積分項和微分項,一般是令Ti=0、Td=0(具體見PID的參數(shù)設(shè)定說明),使PID為純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許的最大值的60%~70%,由0逐漸加大比例增益P,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時的比例增益P逐漸減小,直至系統(tǒng)振蕩消失,記錄此時的比例增益P,設(shè)定PID的比例增益P為當(dāng)前值的60%~70%。比例增益P調(diào)試完成。
b.確定積分時間常數(shù)Ti
比例增益P確定后,設(shè)定一個較大的積分時間常數(shù)Ti的初值,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,之后在反過來,逐漸加大Ti,直至系統(tǒng)振蕩消失。記錄此時的 Ti,設(shè)定PID的積分時間常數(shù)Ti為當(dāng)前值的150%~180%。積分時間常數(shù)Ti調(diào)試完成。
c.確定積分時間常數(shù)Td
積分時間常數(shù)Td一般不用設(shè)定,為0即可。若要設(shè)定,與確定 P和Ti的方法相同,取不振蕩時的30%。
d.系統(tǒng)空載、帶載聯(lián)調(diào),再對PID參數(shù)進(jìn)行微調(diào),直至滿足要求。
(5)最終調(diào)試好的標(biāo)準(zhǔn)應(yīng)該是,PID輸出曲線在有一個階躍響應(yīng)來是,響應(yīng)一大一小兩個波,小波是大波的四分之一。
四軸飛行器的PID整定,我們首先四軸固定在單軸平衡平臺上,讓飛行器完成單軸平衡,主要觀察姿態(tài)角的(1)穩(wěn)定性,能否平衡在期望角度;(2)響應(yīng)性,當(dāng)操縱命令改變時,四軸能否即時的響應(yīng)期望的變化;(3)操縱性,由操縱員感受四軸的姿態(tài)是否已與操縱,會不會產(chǎn)生響應(yīng)過沖。
在參數(shù)調(diào)整時,先調(diào)P,將I,D給0,先給一個小值P1,如果飛行器不能穩(wěn)定在一個角度,則P1給小了,下一次給一個較大值P2,如果飛行器產(chǎn)生震蕩則證明P2給大了,那么合適的P在P1-P2之間,反復(fù)試驗幾次可找到P震蕩的臨界點P0,然后保持P0不變按照調(diào)P的方法來調(diào)D,D是用來消除誤差的,當(dāng)抖動差不多被消除時,此時我們有較合適的P0,D0,在這兩個值附近再試幾組參數(shù),觀察效果得到最優(yōu)參數(shù)。調(diào)好P,D后此時四軸的穩(wěn)定狀態(tài)與期望狀態(tài)間也學(xué)會有靜差,接下來加入I,參數(shù)有小到大,當(dāng)靜差差不多被消除時,我們再對P,I,D三組參數(shù)在小范圍內(nèi)聯(lián)調(diào)。最后確定恰當(dāng)?shù)姆e分限幅值,完成整個PID參數(shù)的整定。
5.系統(tǒng)創(chuàng)新
- 采用STM32F407這樣一款高性能芯片作為控制核心,計算快速,擴展空間大。
- 云臺飛控一體化設(shè)計,既能完成飛行任務(wù)也能實現(xiàn)云臺穩(wěn)定。
- 姿態(tài)算法采用基于四元數(shù)的互補濾波,姿態(tài)角無奇點,比起卡爾曼李春波等高端算法有著計算量小的特點且能投入使用,大大節(jié)約了cpu計算時間,也降低了對cpu的性能要求。
- 利用四軸作為云臺載體有著靈活機動,可讓攝像頭獲得比較好的視野,且云臺能消除四軸機體抖動。
- 方便改裝用于執(zhí)行其他任務(wù)。
6.評測與結(jié)論
6.1.四軸飛行器的調(diào)試
6.1.1電源調(diào)試
將電路板焊接完成后,為電路板供電,用萬用表測得個供電芯片電壓如下
表6-1各電源芯片電壓值
元件名 | 輸入電壓(V) | 輸出電壓(V) |
LM2940 | 12.4 | 5.01 |
LM1117 | 5.01 | 3.42 |
由表中數(shù)據(jù)可知電源管理部分可滿足系統(tǒng)供電要求。
6.1.2 姿態(tài)角調(diào)試
在完成控制器底層的硬件驅(qū)動后,開始姿態(tài)角算法的調(diào)試。利用藍(lán)牙模塊將解算出的姿態(tài)角數(shù)據(jù)發(fā)回上位機,搖動四軸機體,觀察上位機數(shù)據(jù)曲線與姿態(tài)演示立方塊。
圖6-1 姿態(tài)角數(shù)據(jù)對比曲線
圖6-1中黃色和藍(lán)色為直接由加速度計算出的俯仰與橫滾角,紅色和青色為姿態(tài)解算后的姿態(tài)角,可明顯看出直接由加速度計算出的姿態(tài)角噪聲大,不平滑,不能真實反映姿態(tài)角的變化。而由四元數(shù)算法解算后的姿態(tài)角反應(yīng)快,噪聲小,足以滿足控制要求。光觀察曲線并不直觀,還可以觀察上位機中的立方塊,當(dāng)小立方塊的姿態(tài)與四軸機體能夠保持一致變化時說明姿態(tài)解算良好。通過以上手段可知姿態(tài)角解算滿足需求。
6.1.3 控制電機調(diào)試
在第五章,已經(jīng)針對四軸飛行器進(jìn)行了PID的控制設(shè)計,但為了得到實際使用的PID控制參數(shù)我們還需要通過反復(fù)試驗來整定出最優(yōu)參數(shù)。為了方便參數(shù)的調(diào)試,在本設(shè)計過程中才用了先調(diào)平衡一個方向,再調(diào)另一個方向,最后聯(lián)達(dá)到平衡的效果。為此設(shè)計了如下圖所示試試驗平臺:
圖6-3 四軸單軸平衡試驗
在調(diào)試過程中,為了避免頻繁的下載程序帶來的不變,采用串口藍(lán)牙發(fā)送參數(shù)的做法,大大提高了調(diào)試效率。當(dāng)俯仰與橫滾兩個軸都能夠獨立的平衡時,可以脫離單軸平臺開始在空中進(jìn)行航向角的穩(wěn)定性調(diào)試。
6.2.四軸飛行器的試飛
當(dāng)前面的各項調(diào)試都完成了之后,就準(zhǔn)備要進(jìn)行試飛實驗。飛行試驗是對控制系統(tǒng)的功能和技術(shù)指標(biāo)進(jìn)行驗證的最終手段,也是衡量四軸設(shè)計是否成功的重要標(biāo)志。
試飛前要確保系統(tǒng)各部分工作正常,穩(wěn)定。檢查各個接口連接是否正確,各部件安裝是否牢固,電池電量是否充足。打開電源前檢查遙控器油門是否在最低位置,起飛前先輕推油門確保電機工作正常。一切準(zhǔn)備就緒,即可進(jìn)行試飛。將四種飛行器放在水平地面上,開始啟動姿態(tài)初始化程序,聽到電調(diào)提示音后,緩慢增加油門,螺旋槳轉(zhuǎn)速上升,將飛機拉離地面。由實際情況可看出當(dāng)姿態(tài)發(fā)生傾斜時,姿態(tài)解算及PID控制能夠及時調(diào)整電機轉(zhuǎn)速,穩(wěn)定飛行姿態(tài)。飛行器還能根據(jù)遙控指令的變化完成相應(yīng)的動作。本此設(shè)計的四軸飛行器可實現(xiàn)垂直升降的要求,能保持姿態(tài)的穩(wěn)定,機體晃動小,在微風(fēng)的干擾下能夠自動調(diào)整姿態(tài),確保平穩(wěn)飛行,且系統(tǒng)響應(yīng)快,續(xù)航時間大概在8分鐘。因此本次的設(shè)計是有效的。
附錄
部分代碼
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
static float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f;
float delta_2=0;
const static float FACTOR = 0.002;
float norm=0.0f;
float vx, vy, vz;
float ex, ey, ez;
float q0q0 = q0*q0;
float q0q1 = q0*q1;
float q0q2 = q0*q2;
float q1q1 = q1*q1;
float q1q3 = q1*q3;
float q2q2 = q2*q2;
float q2q3 = q2*q3;
float q3q3 = q3*q3;
norm = sqrt(ax*ax + ay*ay +az*az); // 測量正?;?把加速度計的三維向量轉(zhuǎn)成單位向量。
ax = ax /norm;
ay = ay / norm;
az = az / norm;
vx = 2*(q1q3 - q0q2); // 估計方向的重力
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3;
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
halfT=0.002;
gx = gx + ex*FACTOR/halfT; //校正陀螺儀測量值 用叉積誤差來做PI修正陀螺零偏
gy = gy + ey*FACTOR/halfT;
gz = gz + ez*FACTOR/halfT;
delta_2=(2*halfT*gx)*(2*halfT*gx)+(2*halfT*gy)*(2*halfT*gy)+(2*halfT*gz)*(2*halfT*gz);
q0 = (1-delta_2/8)*q0 + (-q1*gx - q2*gy - q3*gz)*halfT; // 整合四元數(shù)率 四元數(shù)微分方程 四元數(shù)更新算法,二階畢卡法
q1 = (1-delta_2/8)*q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = (1-delta_2/8)*q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = (1-delta_2/8)*q3 + (q0*gz + q1*gy - q2*gx)*halfT;
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); // 正?;脑?/p>
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;
//轉(zhuǎn)換為歐拉角
Q_ANGLE.Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
Q_ANGLE.Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
Q_ANGLE.Yaw = -atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3 * q3 + 1)* 57.3; // yaw
}
評論