1. 程式人生 > >Crazypony四軸飛行器代碼框架

Crazypony四軸飛行器代碼框架

epo 魯棒性 速度 條件 屬於 都是 歐拉角 主循環 www

軟件框架講解

作者:nieyong

飛控源代碼部分,都是屬於一磚一瓦敲出來的。沒有使用實時操作系統(RTOS),我們稱之為裸機代碼,托管在Github上,名字為crazepony-firmware-none,尾綴none表示未使用操作系統裸跑的意思。

那麽,現在就結合裸機代碼,來說說Crazepony的軟件框架。

本文檔以Crazepony 5.2版本為基礎。Crazepony 5.0版本及以前的代碼主要由馬駿(CamelGo)完成。貢獻者黃永祥在5.1版本中對飛控代碼進行了重構,將Crazepony的穩定性推向了一個新的高度。貢獻者Nieyong在5.2版本中對代碼進行了整理。

軟件流程圖

Crazepony軟件流程如下圖所示:

技術分享

Craepony主控使用的是STM32芯片,沒有上實時操作系統,依靠中斷嵌套來完成整體功能。程序核心就是通過定時器,在主循環中通過不斷查詢判斷各個條件,這樣就產生了幾個大小不一樣的時間段,我們根據需要就可以完成以多大的頻率掃描一次遙控器指令、多久更新一次傳感器數據、多久更新一次控制等等飛控需要實現的功能,盡可能的利用主控的資源。

初始化

進入主函數之後就是STM32處理器及各個部分的初始化。

技術分享

接下來就是進入主循環while(1)之中了,主循環也就是整個程序功能實現的關鍵,程序進入這裏面就循環在裏面運行了,當然中斷會打斷去運行中斷服務程序運行完之後再回到這裏運行。

主循環-100Hz循環

主循環體中首先有if(loop100HzCnt >= 10){}這個結構,其中loop100HzCnt這個變量是在TIM4中斷服務程序中累加的,1ms累加一次,也就是說定時每10ms就去完成一次其中的工作。

那麽100Hz需要做一次的工作是什麽呢?讀取mpu6050數據,氣壓計數據並進行整合。因為采用軟解姿態,讀取的數據為加速度計和陀螺儀的AD值,將數據進行標定、濾波、校正後通過四元素融合得到三軸歐拉角度。如下圖。

技術分享

加速度傳感器采集數據容易失真,造成姿態解算出來的歐拉角錯誤,只用角度單環情況下,使系統很難穩定運行,因此可以加入角速度作為內環,角速度由陀螺儀采集數據輸出,采集值一般不存在受外界影響情況,抗幹擾能力強,並且角速度變化靈敏,當受外界幹擾時回復迅速增強了系統的魯棒性。

Crazepony采用雙閉環PID控制,如下圖所示。

技術分享

角度作為外環,角速度作為內環,進行姿態雙環PID控制。角度環的輸出值作為角速度環的輸入建立自穩系統。

主循環-50Hz循環

if(loop50HzFlag){}進入50Hz(20ms執行一次)循環。loop50HzFlag標誌位是在TIM4中斷中每20ms置位一次的,這裏解析了收到的遙控器無線發送過來的指令,結合當前的姿態計算更新這些控數據給核心控制算法輸出控制飛控,我們就可以控制飛控前進後退,上升下降等等操作了。如下圖。

技術分享

主循環-10Hz循環

同樣的思路if(loop10HzFlag){}也就是以10Hz的頻率去執行下面功能。在這裏可以通過藍牙向我們的手機APP傳送一些飛控的姿態信息,然後查詢飛控的電量沒有足夠的話就讓飛控降落下來,查詢高度啊超出可控範圍也把飛控降下來,查詢是否和遙控器失聯啊,失聯就降下飛控等等安全飛行的控制。如下圖

技術分享

最後就是if(pcCmdFlag)這個了,這是一個與上位機調試有關的東西,主循環查詢這個標誌位,標誌位是由上位機發送過來的指令置位的,它主要是處理pc機發送過來的指令,PID參數讀取,修改等等。

Crazypony四軸飛行器代碼框架