1. 程式人生 > 其它 >PX4飛控原始碼系統框架介紹

PX4飛控原始碼系統框架介紹

文章來源:PX4 飛控原始碼系統框架介紹 - 徐景祥 - 部落格園 (cnblogs.com)

一、build_px4fmu-v2_default

  編譯以後生成的檔案:內部主要需要在意的就是topics_temporary_header(所有的任務是要的標頭檔案,在建立任務和使用資料結構時可以從該處檢索);topics_temporary_sources(系統中所有的任務函式)

二、Cmake

  配置檔案,主要使用 nuttx_px4fmu-v2_default.cmake。該處主要是關於系統使用的檔案的路徑配置,在 PX4 系統所有的.CPP 和.C 檔案都是通過在該處進行路徑包含的。 在需要自己建立私有任務或者 sensor 驅動程式時需要新增到該處。

三、mavlink

  主要負責和地面站QGC通訊的協議部分,這部分可以直接呼叫。分為1.0版本和2.0版本,以後都更新到2.0版本了

四、msg

  uORB manger 的縮寫:msg。該部分主要是 PX4 系統的使用的所有的資料結構的集合部分,各種任務和 sensor 驅動中需要獲取的 sensor 資料都在此部分,還包含各種 執行狀態的資料結構。其中需要注意的是該資料夾下的 Cmakelists.txt,該文件是整個 msg 部分的配置部分,類似第二部分的 Cmake 中的配置檔案一樣,在開發者建立任務或 者 sensor 驅動程式時建立對應的資料結構(***.msg)以後,需要把開發者建立的***.msg 新增到Cmakelists.txt 中,否則編譯時識別不到開發者建立的資料結構。在該部分建立 好以後,直接編譯可以自動生成相對應的 C/C++下的標準標頭檔案,即在第一部分所介紹的 topics_temporary_header,在 PX4 系統的任何一個地方引用所需要的資料結構,都需 要把這個標頭檔案包含進去。

五、NuttX

  PX4 所使用的作業系統,其類似 UCos,關於 OS 的基本概念以及夠不部分不在詳述。

六、ROMFS

  ROM file_system 的簡寫,內部的 px4fmu_common 資料夾中的 init.d 是關於 px4 系統初始上電啟動的啟動指令碼,即一系列的啟動過程和系統配置。其中主要的幾個部分就 是 rcS、rc.sensors、rc.mc_default、rc.mc_apps 等。rcS:最先啟動的指令碼,負責掛載 SD、啟動 uORB、配置系統引數等。rc.sensors:啟動 sensors 驅動程式碼。如果在 src/drivers 中建立私有的 sensor 驅動,建議放在該部分啟動。rc.mc_default:配置和 PWM***相關的系統引數,內部含有怠速的配置。rc.mc_apps : 啟 動 上 層 application , 如 attitude_estimate 、 attitude_control 、position_estimate 和 position_control 等。如果在 src/modules 中建立私有的上層 application,建議放在該部分啟動。

七、src

  7.1drivers   pixhawk 硬體系統中使用的所有的 sensor 的驅動程式碼。也包含了 STM32 主控MCU 的 io 輸出控制(PX4IO)和 pwm 的驅動。   7.2 examples   PX4 系統給的一些簡單的例項,為了便於開發者做二次開發除錯測試使用。尤其是 px4_simple_app,內部涉及瞭如何通過 uORB 機制獲取所需要的資料。   7.3lib   標準庫。   7.4 modules   內部就是上層的應用任務程式碼實現部分,包含姿態結算、姿態控制、配置結算、位置控制、落地檢測、sensor 初始化、系統配置、uORB、commander 等。其中commander 內部是實現整個控制模式的程式碼,包含 pixhawk 燈顯控制,飛航模式切換,解鎖上鎖等等。相關演算法實現也都是在該部分,比如像驗證和控制演算法先關(自適應 PID)就可以在 mc_att_control 中加入自己私有的演算法做驗證。下面是關於 module 裡面的 application 介紹。   7.4.1、attitude_estimator_ekf:使用 EKF 算是實現姿態結算。   7.4.2、attitude_estimator_q:使用 mahony 的互補濾波演算法實現姿態結算。   7.4.3、commander:整個系統的過程實現,比如起飛前的各 sensor 的校準演算法實現、安全開關是否使能、飛航模式的切換、pixhawk 硬體上的顯示燈的顏色定義等等。   7.4.4、gpio_led:IO 控制 led 的驅動。   7.4.5、land_detector:飛行過程中使用 land 模式降落或者受到降落時的落地監測部分,內部會監測 z 軸速度和加速度等,具體實現請詳細閱讀原始碼。   7.4.6、local_position_estimator:常說的 LPE 演算法實現位置結算,類似最簡單的 KF,一個預測,一個修正。   7.4.7、logger:關於 log 日誌的讀寫函式。   7.4.8、mavlink:和地面站通訊的通訊協議,結合地面站 QGC 原始碼配合修改,或者僅僅呼叫 mavlink 內部的 API 介面,即可通過無線訊號把所需要的資料顯示在地面站 QGC 上, 此方法是一種實時監測“目標資料”的方法。   7.4.9、mc_att_control:姿態控制的演算法實現,主要就是姿態的內外環 PID 控制,外環角度控制、內環角速度控制。   7.4.10、 mc_pos_control:位置控制的演算法實現,主要就是位置的內外環 PID 控制,外環速度控制、內環加速度控制。   7.4.11、 sdlog2:SD 卡的 log 日誌讀寫部分,在 SD 卡中看到的所有資料都是通過該部分寫進去的,平時做 log 日誌分析也是檢視的這個內部的資料,所以,假如想監測某個“目標資料”, 也可以由此處寫到 SD 卡中然後在做相應的分析。   7.4.12、 sensors:關於各種 sensors 的相關函式。   7.4.13、 systemlib:系統所需要的引數列表。   7.4.14、 uORB:IPC 通訊機制。首先就是需要了解如何使用它進行程序間通訊,瞭解 整個系統中的資料流流向。

八、Makefile:

最終的編譯命令等,通過 shellscript 寫的,可以自行對其修改成自己需要的。

九、

如下介紹對應於上面的紅色標識

1、編譯以後生成的韌體,燒錄進飛控即可。內部會有一些需要用到的標頭檔案和.cp檔案p。

2、mavlink協議部分,負責地面站通訊的庫檔案都在此。

3、msg是負責程序間通訊的訊息集合,在自己建立私有任務時需要再次檔案內部新增需要的資料結構。

4、Nutt是飛控所用的OS,這個不做系統移植不需要深入研究。我們所做的都是OS之上的。

5、ROMFS內部是啟動檔案,配置需要啟動哪些任務與啟動順序,還有一些就是關於系統預設的一些配置。具體配置哪些需要閱讀啟動指令碼瞭解。

6、SRC內部就是所有的sensor驅動和各種任務,比如姿態解算和姿態控制、位置解算和位置控制等等。

7、makefile內部是常用的命令列指令集合。

下面主要介紹一下SRC資料夾裡面的東西

1、drivers:所使用到的所有的sensor驅動程式都在此處。(如果新增sensor,注意該處)

2、顧名思義,實現程式碼,建立私有任務時可以參考。

3、Lib庫,很多矩陣運算相關的數學庫。

4、重點,飛航模式,姿態解算,姿態控制,位置結算,位置控制,落地檢測等任務都在該modules裡面。(飛控相關演算法都在該處)下面介紹重點modules

1、姿態解算的程式碼實現部分

2、落地檢測的程式碼實現部分

3、姿態控制的程式碼實現部分

4、位置控制的程式碼實現部分

5、位置解算的程式碼實現部分

6、各種sensors的初始化部分

7、uORB:程序間通訊所用