PX4原始碼學習(一):結構概述
最近在做PX4韌體的移植開發工作,由於之前沒有這方面開發經驗,加之PX4原始碼又比較龐雜,所以想要通過一點一點的學習梳理和實踐,使這部分工作能夠儘快開展起來。部落格中如有錯誤,懇請大家指正,同時歡迎小夥伴們一起交流學習。
另:這篇部落格很多內容借鑑了其他大神的部落格,根據自己的理解做了部分修改,關於原創還是轉載的問題我有些疑問,如有不妥,敬請告知。
PX4飛控原始碼系統框架介紹:
注:本篇內容中所編譯的PX4 韌體版本為v1.11,以 px4_fmu-v2_default 為例。
一、boards
各種不同的飛控板硬體配置檔案。
二、px4_fmu-v2_default
編譯後生成的檔案,其路徑為:Firmware/ bulid / px4_fmu-v2_default
三、Cmake
配置檔案,其路徑為 Firmware / boards / px4 / fmu-v2 / default.cmake。該檔案主要是關於系統使用的檔案的路徑配置。PX4系統中所有的.cpp和.c檔案都要在該處進行路徑包含。自定義的任務或sensor驅動程式也需要新增到該處。
四、mavlink
是飛控和地面站QGC的通訊協議部分,可直接呼叫,現已更新為2.0版本。路徑為:Firmware / mavlink
五、msg
是uORB Messaging的縮寫。路徑為:Firmware / msg
該部分主要是PX4系統使用的所有資料的集合,各種任務和sensor驅動中需要獲取的sensor資料都在此部分,還包括各種執行狀態的資料。注意該資料夾下的CMakeLists.txt,該文件是整個msg部分的配置檔案,類似於二中Cmake中的配置檔案,在開發者建立任務或者sensor驅動時建立對應的資料(xxx.msg檔案)以後,需要將其新增到CMakeLists.txt中,否則編譯時識別不到開發者建立的資料。
六、Nuttx
PX4所使用的作業系統,路徑為 Firmware / platforms / nuttx,關於os的基本概念暫不在此詳述。
七、ROMFS
ROM file_system的簡寫,路徑為 Firmware / ROMFS,內部的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:啟動上層應用,如attitude_estimate、attitude_control、position_estimate和position_control等。如在src / modules 中自定義app,則應放在在該部分啟動。
八、src
8.1 drivers
該資料夾內包含了飛控硬體系統中使用的所有sensor的驅動程式碼。也包含了STM32主控MCU的io輸出控制(PX4IO)和pwm的驅動。
8.2 examples
PX4系統給的一些簡單的例項,為了便於開發者做二次開發除錯測試使用。尤其是px4_simple_app,內部涉及瞭如何通過uORB獲取需要的資料。
8.3 lib
標準庫。
8.4 modules
上層任務程式碼的實現部分,包括姿態解算、姿態控制、配置解算、位置控制、落地檢測、sensor初始化、系統配置、uORB、commander等。其中commander是實現整個控制模式的程式碼,包括pixhawk燈顯控制、飛航模式切換、上鎖解鎖等。
相關演算法實現也在該部分,下面是module裡的app介紹:
attitude_estimator_ekf:
attitude_estimator_q: 使用mahony的互補濾波演算法實現姿態解算。
commander: 整個系統的過程實現,如起飛前各sensor的校準演算法實現、安全開關是否使能、飛航模式切換、pixhawk硬體上燈的控制等。
gpio_led:
land_detector: 飛行過程中使用land模式降落或者落地時的落地監測部分,內部會監測Z軸速度和加速度等。
local_position_estimator: 常說的LPE演算法實現位置解算。
logger: 關於log日誌的讀寫函式。
mavlink: 和地面站通訊的通訊協議,結合地面站QGC原始碼配合修改,或者僅僅呼叫mavlink內部的API介面,即可通過無線訊號將所需的資料顯示在地面站QGC上,此方法是一種實時監測目標資料的方法。
mc_att_control: 姿態控制的實現演算法,主要就是姿態的內外環PID控制,外環角度控制,內環角速度控制。
mc_pos_control: 位置控制的演算法實現,主要是位置的內外環PID控制,外環速度控制,內環加速度控制。
sdlog2:
sensors: 關於各種sensor的相關函式。
systemlib:
uORB: IPC通訊機制。首先需要了解如何使用它進行程序間通訊,瞭解整個系統中的資料流流向。
九、Makefile
最終的編譯命令,用shellscript編寫,可根據需要修改。