┊文章閱讀:次
背景描述本文為Echo(鄒佳池)參與RT-Thread應(yīng)用作品征集賽作品原創(chuàng)。只要你采用RT-Thread操作系統(tǒng)設(shè)計開發(fā),不限硬件(每人可提交作品數(shù)不限)就有機會獲得2000元現(xiàn)金大獎哦!投稿:andychen@rt-thread.com
近年來無人機應(yīng)用市場日趨火熱,無人機開始被應(yīng)用在多個領(lǐng)域之中,比如航拍,植保,運輸,安防等。隨著應(yīng)用場景的增加,對于無人機的大腦一飛控,的性能和功能要求也變得越來越高。國內(nèi)具有一大批優(yōu)質(zhì)的無人機企業(yè),如DJI,零度,億航,極飛等??墒沁@些企業(yè)的飛控系統(tǒng)并不開源,而開源飛控市場卻基本被國外所壟斷,比如APM, PX4, Autoquad等,國內(nèi)目前還沒有一款開源飛控可以與之抗衡,在國際上也沒有令人熟知的“國產(chǎn)”開源飛控。
正是基于開發(fā)出一款世界知名的中國的開源飛控,我從2016年開始了StarryPilot這個項目。飛控的設(shè)計理念是一款輕量,功能強大的飛控,主要面向科研和無人機行業(yè)應(yīng)用,使得無人機開發(fā)技術(shù)更加普及,也更容易將無人機技術(shù)應(yīng)用到各個行業(yè)。
無人機整機
Pixhawk
室外定高飛行
Gazebo HITL(硬件在環(huán))仿真
Msh shell系統(tǒng)
開發(fā)環(huán)境
硬件采用國外開源的自駕儀Pixhawk(https://pixhawk.org/modules/pixhawk), 如下圖所示。Pixhawk也是目前世界上應(yīng)用最廣,支持的飛控系統(tǒng)最多的開源飛控硬件。
其主要性能參數(shù)如下:
整個系統(tǒng)除了Pixhawk之外,還有一些外接的電子設(shè)備,如無刷電機,GPS,電調(diào),數(shù)傳,RC接收機,Lidar-Lite激光雷達等。整體的系統(tǒng)框架圖如下圖所示:
軟件設(shè)計
軟件采用分層結(jié)構(gòu)設(shè)計,如下圖所示,從底層到上層分別是Driver層,RTOS(RTT + Fatfs),HAL硬件虛擬層,F(xiàn)ramework層和應(yīng)用層。
一、Driver層
Driver層實現(xiàn)了Pixhawk板載的所有硬件設(shè)備的驅(qū)動,如傳感器設(shè)備(陀螺儀,加速度計,磁力計,氣壓計等),總線設(shè)備(UART, I2C, SPI等),USB,電機驅(qū)動,SD卡驅(qū)動,GPS驅(qū)動,LED燈以及一些板載設(shè)備的驅(qū)動。各個驅(qū)動以Device的形式向RTT進行注冊,并且提供各自的init(), read(), write, ioctrl()函數(shù)供上層調(diào)用。這里僅以hmc5883磁力計的驅(qū)動舉例說明驅(qū)動程序的一般設(shè)計步驟。
- 設(shè)備初始化函數(shù)
如下為hmc5883的初始化函數(shù)。首先對設(shè)備的功能函數(shù)進行函數(shù)指針賦值,這里定義了init(), read()和ioctrl()三個函數(shù)。然后向RTT注冊名為hmc5883的驅(qū)動設(shè)備,上層可以通過查找設(shè)備名的方式來獲取該驅(qū)動設(shè)備。接下來就是給hmc5883設(shè)置對應(yīng)的總線設(shè)備。這里 hmc5883使用的是i2c通信,所以初始化中會為其查找對應(yīng)的i2c設(shè)備。
- init()函數(shù)
Init()函數(shù)主要做一些芯片的初始化的工作,包括寄存器配置等。
- read()函數(shù)
read()函數(shù)實現(xiàn)設(shè)備數(shù)據(jù)讀取的功能,如原始磁場數(shù)據(jù)和標(biāo)定后的磁場數(shù)據(jù)讀取。
- ioctrl()函數(shù)
Ioctrl()函數(shù)主要實現(xiàn)一些設(shè)備的配置功能,如設(shè)置測量磁場的范圍,采樣頻率等。
二、RTOS層
RTOS采用RT-Thread嵌入式操作系統(tǒng),它的功能強大,除了提供基本的線程調(diào)度,內(nèi)存管理,同步等基本功能外,還提供了如msh的shell系統(tǒng),device設(shè)備驅(qū)動系統(tǒng),使得系統(tǒng)的整體架構(gòu)更加清晰,功能也更加完善。
三、HAL層
HAL層主要是對底層驅(qū)動設(shè)備進行進一步封裝,將具體的設(shè)備抽象為一個類別的設(shè)備。以串口設(shè)備為例,不同的硬件平臺,串口的底層驅(qū)動會有差異,通過HAL層,將串口設(shè)備封裝為統(tǒng)一的接口,這樣當(dāng)系統(tǒng)移植到不同平臺的時候,上層代碼不需要做任何改變,而只需要將對應(yīng)底層驅(qū)動進行簡單替換就行。這將大大降低系統(tǒng)移植的復(fù)雜程度。
四、Framework層
Framework層實現(xiàn)了飛控設(shè)備的主要功能,如姿態(tài)估計,位置估計,控制器,通信,日志管理等等??梢哉f,這一層是整個系統(tǒng)的核心,大部分的功能模塊都在這一層來實現(xiàn)。
五、Application層
應(yīng)用層是將飛控的各個大的功能進行分割,變成一個個小的功能。每個功能在系統(tǒng)中為一個單獨的線程,每個線程負責(zé)執(zhí)行自己的任務(wù),并且跟其他線程通過IPC進行通信。Vehicle線程具有最高優(yōu)先級,執(zhí)行周期為1ms。其負責(zé)實現(xiàn)無人機飛行相關(guān)的所有功能,如狀態(tài)估計和電機的控制。
啟動流程
下面介紹一下系統(tǒng)的啟動流程. 啟動流程沿用RTT提供的原始結(jié)構(gòu)。首先在rtthread_startup()函數(shù)中進行RTOS的一些初始化,然后進入到rt_application_init()中。 在這個函數(shù)中會建立一個init的初始線程,在這個線程中,會對飛控各個模塊進行初始化的工作。在初始化完成之后,會根據(jù)Application層的定義,建立各個線程,并喚醒,最后將init線程自己給銷毀掉,避免不必要的內(nèi)存消耗。
演示視頻
控制算法和飛行效果測試( ADRC vs PID )
項目特色
軟件代碼:
https://github.com/JcZou/StarryPilot