一天精通無人機第 17 講,中級篇系列:飛控整體架構
來自專欄編程外星人8 人贊了文章
歡迎關注公眾號:編程外星人
今天我們來學習飛控程序的整體架構,先來看看PX4的架構設計圖:
PX4的設計從大角度劃分為五個部分:
1、數據存儲(Storage)
2、外部通訊(External Connectivity)
3、驅動程序(Drivers)
4、飛行控制(Flight Control)
6、消息匯流排(Message Bus)
下面我們分別來對這六個部分來做一下介紹:
一、數據存儲(Storage)
數據存儲分為3個部分:
1、飛行任務存儲部分(dataman):dataman給上層應用提供了可以隨時存儲指定飛行任務的通用函數,上層應用可以通過調用dm_write和dm_read函數來讀寫飛行任務,通常用於讀寫飛行航跡點的坐標。保存的目標通常在sdcard中。
2、飛機參數存儲部分(param):飛控程序中定義了大量的飛行參數,例如,與串級PID控制參數就有二十多個,用於其它功能的參數還有很多,程序中提供了param_get和param_set函數可以將這些參數存放到flash和sdcard中。
3、飛行日誌存儲部分(logger):飛控程序中提供了兩種飛行日誌的記錄方式(二選一),早期的日誌記錄方式為sdlog2,可以將需要記錄的數據用字元方式存儲到sdcard中的csv格式文件中,飛行結束後可以通過其它的軟體程序來查看。近期的飛控程序推薦使用logger來記錄飛行日誌,它可以將飛控程序中的uORB記錄下來並保存(關於uORB我們會城後續章節中詳細講述)。
二、外部通訊(External Connectivity)
飛控程序的外部通訊採用的是Mavlink協議,Mavlink是無人機外部通訊的一個輕量級通訊協議。與外部通訊即是與計算機上的地面站程序來進行通訊。我們可以使用Mavlink官方提供的協議生成工具來定製我們自己需要的協議內容,並可以通過需要生成不同編程語言所使用的源文件,例如C/C++、Java、Python等。這樣的好處是同樣的一個通訊協議可以被飛控程序、PC計算機、手機APP程序和其它程序同時使用。這樣就有效的避免了不同運行平台上,不同類型程序運行的差異,而採用相同的協議通訊。
三、驅動程序(Drivers)
驅動程序是飛控程序中採集感測器數據的源頭,常用的感測器驅動程序有:
1、相機驅動:通常可以控制相機的拍照功能,並可以對其指定拍照參數,例如:光圈、快門、感光度、焦距、白平衡、曝光補償等等。這些控制功能主要取決於相機的功能。對於最初級拍照相機來說,飛控程序只需要對其發送「拍照」命令即可。
2、GPS驅動:全球定位系統(Global Positioning System)的驅動程序。在前面系列中我們已經講述過,在室外的自動飛行過程中無人機需要執行定點飛行模式,然而定點飛行模式的前提就是要有GPS數據對IMU的積分數據進行修正,所以GPS是自動飛行功能的基礎,它通常有ashtech、mtk和u-blox等。驅動程序中會根據當前插入的GPS協議進行自動切換並解析。
3、遙控器驅動:目前常見的遙控器通訊協議為SBUS和PPM,就實用性來說SBUS通訊協議可能更高一點,但其從電路上需要接入一個反向器(Pixhawk上已經加入了反向器),通常採用串口來傳輸SBUS協議,串口波特率100k,其支持16個遙控器通道,而每一個通道的數值採用11個bit位來表示即11*16=176位元組,基格式如下:
[startbyte][data1][data2]……[data22][flags][endbyte]
startbyte=0x0f
endbyte=0x00
4、雲台驅動:雲台通常安裝在多旋翼機架正下方,在雲台上掛載相機或其它設備。雲台通常有自己的軟體程序,可以很好的達到自平衡的狀態。也就是說,當飛機產生俯仰或滾轉角度時,雲台會自動修正其三軸(簡易雲台通常只有兩個轉動軸)舵機的角度從而自動恢復平衡。而飛控程序也可以通過向雲台發送相關指令控制其當前俯仰、滾轉、航向角度。
5、空速計、數傳、光流、距離感測器等:這些感測器驅動並不是在所有的飛機上都要使用,通常根據實際需要來使用其中的一個或幾個。空速計可以測量當前空氣流動速度;數傳支持無線傳輸設備的數據發送與接收;光流定位系統驅動可以檢測當前移動速度與位置;距離感測器可以檢測感測器前方物體與其之間的距離,例如:超聲波、雷達、雙目攝像頭、激光測距儀等等。
6、IMU感測器驅動:IMU感測器是飛控驅動程序中最重要的部分,其通過初始化、校準、讀取加速計、陀螺儀、磁羅盤這些感測器,為上層狀態融合和導航系統提供最基本的數據支撐。加速計是檢測飛機當前三軸的加速度,陀螺儀可以檢測飛機的旋轉角速度,而為了消除陀螺儀的航向積分誤差,需要使用磁羅盤對其做航向修正。IMU的數據採集的頻率通常都高於其它的驅動程序,通常是250Hz。
四、飛行控制(Flight Control)
1、感測器數據集成(Sensors Hub):sensors模塊收取了所有感測器的數據,包括加速計、陀螺儀、磁羅盤、空速計、高度計、電量計等等感測器的讀數,並對這些數據進行初步過濾與處理。之後將處理後的數據向ekf2模塊發送。
2、姿態位置估計(Position Attitude Estimator):ekf2中主要對感測器的數據進行融合,並採用卡爾曼濾波對其做進一步的處理,進而對飛機當前的姿態和位置做出估計。
3、狀態機(State Machine):commander處理飛機當前狀態(正常、異常)和用戶命令。在多種狀態下切換。例如:飛控鎖定/解鎖、飛機模式切換、安全保護啟動與關閉、啟動感測器或遙控器校準功能等等。
4、自動飛行(Autonomous Flight):navigator配合dataman中存儲的任務信息進行自動飛行功能,給定飛機當前的飛行目標點(將位置期望傳遞給位置控制模塊),並以指定高度和航向飛行,到達目標點執行特定任務(例如:拍照、鳴笛等),並繼續向下一點飛行。
5、位置控制(Position Controller):串級PID反饋控制,外環PID將當前期望位置輸出為期望速度,內環PID根據期望速度計算出期望姿態,輸出給姿態控制模塊。
6、姿態控制(Attitude Rate):串級PID反饋控制,外環PID將當前期望狀態輸出為期望角速度,內環PID根據期望角速度計算出期望控制量,輸出給控制輸出模塊。
7、控制輸出(Output Driver):得到姿態控制最終輸出的控制量,根據機型不同機型(四軸、六軸、八軸等)Mixer混控文件,輸出實際多路控制PWM信號,輸出到電調中,實現電機的控制。
六、消息匯流排(Message Bus)
飛控程序中內部消息傳遞採用的是非同步消息機制uORB。它的設計理念很有趣,它可以實現不同模塊中的數據快速通訊,並且以非同步通訊為基本原則,也就是說在通訊過程中發送者只負責發送數據,而並不關心數據由誰接收,也不關心接收者是否能將所有的數據都接收到;而對於接收者來說並不關心數據是由誰發送的,也不關心在接收過程中是否將所有數據都接收到。關於uORB的設計原理我們會在後續章節中仔細講述。這裡只做一個簡單的介紹,我們來舉一個簡單的例子說明一下uORB的設計原理:
有一個教室編號208,裡面的黑板上可以寫上一些文字內容,有一個同學名叫小強,他每隔1個小時就會來到208教室,先將黑板上原來的文字擦除,然後在黑板上寫下一段新文字,之後離開208教室。而另外有一個同學叫小朋,他每隔3個小時就會來到208教室,將黑板上的文字抄寫到自己的筆記本上,然後離開。
上面這個例子實際上就是uORB的實現原理:
發送者:小強每隔1小時發布一次數據orb_publish
接收者:小朋每隔3小時接收一次數據orb_copy
我們可以看到,小強每次發布數據之後就會離開208教室,至於有沒有人或是誰來讀取他留下的文字,小強自己並不關心,也不再乎自己發布的數據是否有人收到了。而對於小朋來說,他每隔3小時來讀取一次數據,至於這些數據是誰發布的他也不關心。他每隔3小時來讀黑板上的文字時,其實小朋已經在黑板上留言3次了,前兩次的文字已經被小強擦除了,小朋看到的永遠是小強留下最新的內容。
uORB在在數據發布與接收過程中並不保證發送者的所有數據都可以被接收者收到,而只保證接收者在想要接收時能收到最新的數據。而發送與接收的分離可以使飛程中各個模塊相互獨立,互不干擾。實際上一個uORB可以由多個發送者發布,也可以被多個接收者接收。
歡迎關注公眾號:編程外星人
推薦閱讀:
※首屆無人機應用技能大賽
※民用無人機市場未來發展與前景
※一天精通無人機第16講,初級篇完結篇:對初學者的建議
※買了無人機就要用起來 送你一套航拍入門技巧
※東莞市第一屆無人機應用技能展示發布會