無人機中級篇:第二講:編譯選項與模塊功能說明
今天我們來學習一下關於開源飛控的目錄結構與編譯選項,先來看看整體目錄結構,然後我們會針對主要的功能模塊說一些說明(由於篇幅限制本節所列出的目錄與文件都是源代碼中一少部分,實際上很多目錄與文件夾都被省略了):
PX4
├── build
│ ├── nuttx_px4fmu-v3_default
│ ├── nuttx_px4io-v2_default
│ ├── posix_sitl_default
├── cmake
│ ├── cmake_hexagon
│ ├── common
│ ├── configs
│ ├── cygwin_cygpath.cmake
│ └── toolchains
├── mavlink
│ └── include
├── msg
│ ├── templates
│ └── tools
├── platforms
│ ├── nuttx
│ ├── posix
│ └── qurt
├── ROMFS
│ ├── CMakeLists.txt
│ ├── px4fmu_common
│ ├── px4fmu_test
│ └── tap_common
├── src
│ ├── drivers
│ ├── examples
│ ├── include
│ ├── lib
│ ├── modules
│ ├── platforms
│ ├── systemcmds
│ └── templates
└── Tools
一、build
build是編譯目標目錄,其中包括了程序源代碼編譯之後所生成的編譯選項、中間文件、目標文件等,通常也是按不同的編譯選項分為多個不同的目錄,例如當我們執行不同的編譯選項時,就會出現多個編譯目標目錄:
build/
├── nuttx_px4fmu-v2_default
├── nuttx_px4fmu-v3_default
├── posix_sitl_default
└── posix_sitl_test
在編譯結束之後,最終生成的目標文件格式與目標平台有關,例如:使用nuttx_px4fmu-v2_default和nuttx_px4fmu-v3_default編譯選項編譯之後生成的文件即運行在STM32F系列的FMU中,並採用Nuttx操作系統運行整個飛控程序;而使用posix_sitl_default和posix_sitl_test即運行在支持Posix標準的平台上,如運行Linux內核的Arm平台,或PC機。
二、cmake
cmake目錄中存放了整個飛控程序的所有編譯選項,其內容大致如下:
cmake
├── common
│ ├── px4_base.cmake
├── configs
│ ├── nuttx_px4fmu-v2_default.cmake
│ ├── nuttx_px4fmu-v3_default.cmake
│ ├── nuttx_px4fmu-v4_default.cmake
│ ├── nuttx_px4fmu-v5_default.cmake
│ ├── posix_sitl_default.cmake
│ ├── posix_sitl_test.cmake
└── toolchains
├── Toolchain-arm-linux-gnueabihf.cmake
├── Toolchain-arm-none-eabi.cmake
├── Toolchain-arm-xilinx-linux-gnueabi.cmake
├── Toolchain-gcc-arm-linux-gnueabihf.cmake
└── Toolchain-native.cmake
1. common:全局公共編譯配置項,px4_base.cmake中存放整個px4程序中的全局配置選項和功能函數。例如:編譯源代碼所使用的C和C++的編譯標準(-std=gnu99和-std=gnu++11)和警告與錯誤選項( -Warray-bounds -Wdisabled-optimization -Wdouble-promotion)等。
2. config:獨立編譯配置項,允許用戶可以根據自己的需要編譯成不同的目標文件。例如:nuttx_px4mfu……系列表示編譯成以Nuttx操作系統為運行平台的FMU飛控程序,而nuttx_px4io……系列表示編譯成以Nuttx操作系統為運行平台的IO程序(主要負責sbus輸入與pwm輸出),posix_sitl……系列表示編譯成以支持Posix標準的運行平台飛控程序。
3. toolchains:工具鏈,其中存放了以不同編譯選項編譯源代碼時所使用的編譯工具,例如:交叉編譯工具arm-linux-gnueabihf、arm-none-eabi、gcc-arm-linux-gnueabihf和gcc。
三、mavlink
mavlink是無人機中使用的一種輕量級外部通訊協議,與外部通訊即是與計算機上的地面站程序來進行通訊。我們可以使用Mavlink官方提供的協議生成工具來定製我們自己需要的協議內容,並可以通過需要生成不同編程語言所使用的源文件,例如C/C++、Java、Python等。這樣的好處是同樣的一個通訊協議可以被飛控程序、PC計算機、手機APP程序和其它程序同時使用。這樣就有效的避免了不同運行平台上,不同類型程序運行的差異,而採用相同的協議通訊。這也是上一節中我們講述的內容。目前的mavlink版本為2.0,使用時只需要包含其頭文件即可,其目錄為:
mavlink/include/mavlink/v2.0/common
在後續內容中我們會系統的學習關於mavlink協議的原理與使用方法。
四、msg
在上一節中我們已經簡單的介紹了關於uORB的原理與運行方式,msg文件夾中存放的就是uORB所需要的所有Message,其實也就是uORB在通訊時需要定義的數據格式,以.msg結尾,其內容為特定的uORB數據類型(有點像C/C++,但不完全相同):
msg/
├── templates
│ ├── px4
│ ├── uorb
├── tools
│ ├── gencpp
│ ├── generate_microRTPS_bridge.py
│ ├── genmsg
│ ├── px_generate_uorb_topic_files.py
│ ├── px_generate_uorb_topic_helper.py
│ ├── px_generate_uorb_topic_helper.pyc
│ └── uorb_rtps_message_ids.py
├── actuator_armed.msg
├── actuator_controls.msg
├── actuator_direct.msg
├── safety.msg
├── satellite_info.msg
├── sensor_accel.msg
├── sensor_baro.msg
├── test_motor.msg
├── timesync_status.msg
├── trajectory_waypoint.msg
├── transponder_report.msg
├── tune_control.msg
└── vehicle_gps_position.msg
1. message:在msg目錄直屬的.msg文件,都是uORB的message文件,即通訊協議內容。其定義例子:
uint64 timestamp
int32 lat
int32 lon
float32 vel_m_s
bool vel_ned_valid
uint8 satellites_used
2. templates:中存放的是msg.cpp.template、msg.h.template、uORBTopics.cpp.template這三個文件,用於將.msg文件編譯成.h頭文件和.cpp源文件。
3.tools:中存放的是將.msg生成.h和.cpp源代碼的工具文件,大多是採用Python編寫的(px_generate_uorb_topic_files.py)。
五、platforms
platforms即為運行平台,px4架構支持多種運行平台,例如:運行在STM32F4系列上、運行在Arm系列上,運行在Posix標準架構上等等。在不同的運行平台上,編譯源代碼的內容與鏈接源代碼均不盡相同,所以就需要在不同的編譯選項下,編譯不同的平台源代碼,platforms中存放了不同平台下的源代碼內容:
platforms/
├── nuttx
│ ├── cmake
│ ├── CMakeLists.txt
│ ├── Debug
│ ├── Images
│ ├── NuttX
│ ├── nuttx-configs
│ └── src
└── posix
├── cmake
├── CMakeLists.txt
├── include
└── src
關於Nuttx平台和Posix平台主要內容涉及了操作系統的相關知識,這與我們學習開源飛控px4的設計與原理關係並不是非常的大,所以這裡只做簡介,並不做太多的介紹,有興趣的讀者可以根據自己的需要去學習。
六、ROMFS
ROMFS/
├── CMakeLists.txt
├── px4fmu_common
│ ├── CMakeLists.txt
│ ├── init.d
│ ├── init.d-posix
│ ├── mixers
│ └── mixers-sitl
├── px4fmu_test
│ ├── CMakeLists.txt
│ ├── init.d
│ ├── mixers
│ └── unit_test_data
└── tap_common
├── CMakeLists.txt
├── init.d
└── mixers
ROMFS中存放了不同編譯選項中的ROM文件系統,用簡單的語言來說就是存放了飛控程序啟動之後首先載入的運行腳本rcS(在Nuttx配置文件defconfig中配置)和混控文件mixer。其中rcS運行腳本語法格式類Unix的Shell腳本,但並不完全相同,具體語法可以參見:
http://nuttx.org/Documentation/NuttShell.html
七、src
src可以說是飛控中最重要的一個目錄了,其中內容如下:
src
├── drivers
│ ├── aerofc_adc
│ ├── barometer
│ ├── spektrum_rc
│ ├── stm32
│ └── vmount
├── include
│ ├── containers
│ ├── px4.h
│ ├── unit_test.h
│ └── visibility.h
├── lib
│ ├── airspeed
│ ├── battery
│ ├── bezier
│ ├── circuit_breaker
│ ├── CMakeLists.txt
│ └── controllib
stimation
│ ├── tunes
│ └── version
├── modules
│ ├── attitude_estimator_q
│ ├── commander
│ ├── dataman
│ ├── ekf2
│ ├── events
│ ├── mc_att_control
│ ├── mc_pos_control
│ ├── logger
│ └── mavlink
└── systemcmds
├── param
├── perf
├── pwm
├── usb_connected
└── ver
1. drivers:驅動目錄,其中存放所有的驅動模塊,包括了GPS、MPU6000、HM5883等等。
2. include:包含頭文件目錄。
3. lib:常用的庫函數,例如全局坐標與本地坐標的轉換函數等等。
4. modules:系統主要模塊commander、mc_pos_control、mc_att_control等等。
5. systemcmds:系統命令param、pwm、reboot等。
八、Tools
此目錄為px4編譯與燒寫固件的工具包,其中有很多採用Python編寫的工具類或是使用shell腳本編譯的工具程序。例如:固件燒寫工具px_uploader.py;飛控參數生成工具srcparser.py;半物理模擬工具jmavsim等等。
推薦閱讀: