Pixhawk飞控源码目录结构及编译流程分析
http://blog.csdn.net/xlb7679/article/details/51658956
(PS:這是第一次寫博客,以前也有記錄一些經驗總結心得什么的,不過都是手寫筆記或者記在word上,csdn看了好久,總覺的只索取不付出心里有些過意不去,以后盡量都寫到這吧,也會搬一些以前記在word里的東西過來,大家不要嫌棄就好……)
源碼目錄結構(獲取源碼的方法這里就不多說了,官網或者百度都找得到,用git工具 或者直接上github 下載都可以,推薦還是通過git工具去載, 畢竟在調用make編譯之前其實還會通過git去載一些缺少模塊,我的是vmware下的Ubuntu的環境。這博客在win下寫吧,貼代碼好像不是很方便,ubuntu下吧截圖工具沒有又qq截圖來得好用,感覺博客寫起來有點蛋疼,不知道你們都是咋寫的……然后我關注的也是Copter部分,別的就沒有深入了解也就不多說……)
?
一、Vehicle?directory:ArduCopter(多旋翼)、ArduPlane(固定翼)、APMrover2(巡邏車)、AntennaTracker(天線追蹤站臺?)
二、AP_HAL:硬件抽象層
三、Libraries:庫文件
四、Tools?directory:?Tools/scripts/install-prereqs-ubuntu.sh//運行這個shell腳本會自動安裝ubuntu環境下編譯固件所需要工具,下面看下該文件的內容
???? 5?? ?BASE_PKGS="gawk make git arduino-core curl"
???? 6?? ?PYTHON_PKGS="pymavlink MAVProxy droneapi catkin_pkg"
???? 7?? ?PX4_PKGS="python-serial python-argparse openocd flex bison libncurses5-dev \
???? 8?? ?????????? autoconf texinfo build-essential libftdi-dev libtool zlib1g-dev \
???? 9?? ?????????? zip genromfs python-empy"
??? 10?? ?BEBOP_PKGS="g++-arm-linux-gnueabihf"
??? 11?? ?SITL_PKGS="g++ python-pip python-setuptools python-matplotlib python-serial python-scipy python-opencv python-numpy python-pyparsing ccache realpath"
?? 。//這里列出了需要的一些外部庫文件,
?? 。?
??? 66?? $APT_GET install $BASE_PKGS $SITL_PKGS $PX4_PKGS $BEBOP_PKGS
??? 67?? ?sudo pip2 -q install $PYTHON_PKGS
?? 。//這里將對上面列出的需要的庫進行安裝,當然如果已經裝了,會自動跳過,這就是apt-get智能的一面
?? 101?? ?apt-cache search arm-none-eabi
?? 102?? ?
?? 103?? ?(
?? 104?? ? cd $ARDUPILOT_ROOT???
?? 105?? ? git submodule init
?? 106?? ? git submodule update
?? 107?? ?)//自動下載或者更新飛控點某些模塊
五、External?support?code:PX4Nuttx(板載實時系統)、PX4Firmware(px4固件源碼目錄)、mavlink(飛控與地面站通信協議)、uavcan(飛行器can總線通信協議)
編譯流程:
??? 了解了大致的目錄結構,我們來看看Arduopter主目錄下的Makefile(Makefile 見過很多了,簡單的、復雜點都看過,最復雜的應該莫過于內核Makefile了吧,這里的Makefile也算比較復雜了)
linux@ubuntu:~/src/ardupilot/ArduCopter$ cat Makefile -n
???? 1?? ?include ../mk/apm.mk
???? 2?? ?
? 好了,就一行……來看看apm.mk是什么名堂,(有點長,我們直接看關鍵部分)
linux@ubuntu:~/src/ardupilot/ArduCopter$ cat -n? ../mk/apm.mk
。。。
??? 22?? ?# common makefile components
??? 23?? ?include $(MK_DIR)/targets.mk
??? 24?? ?include $(MK_DIR)/sketch_sources.mk
。。。
??? 36?? ?
??? 37?? ?ifeq ($(HAL_BOARD),HAL_BOARD_PX4)
??? 38?? ?include $(MK_DIR)/board_px4.mk
??? 39?? ?endif
??? 40????
。。。target.mk描述了所有平臺下的編譯目標,我們用不著,這里我們先看看具有針對性px4平臺的board_px4.mk文件
linux@ubuntu:~/src/ardupilot/mk$ cat -n board_px4.mk
???? 1?? ?TOOLCHAIN = NATIVE
???? 2?? ?include $(MK_DIR)/find_tools.mk
???? 3?? ?include $(MK_DIR)/px4_targets.mk
find_tools.mk從名字就可以知道他干的啥了,而這里的px4_targets.mk中描述的就是px4-v1、px4-v2....等等編譯目標,內容比較多,我就不全貼了,反正到這里就明白了,
px4_targets.mk(注意px4_targets.mk? != target.mk)中聲明的就是我們的編譯目標,及燒寫的命令(ardupilot官網編譯教程中的,編譯px4的時候make px4-v1,編譯pixhawk的時候make px4-v2,燒寫時make? xxx-upload)
。。。
??? 48?? ?# we have different config files for V1 and V2
??? 49?? ?PX4_V1_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v1_APM.mk
??? 50?? ?PX4_V2_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v2_APM.mk??//這文件包含了編譯目標的依賴,也就是具體編譯的那些模塊哪些驅動
??? 51?? ?PX4_V4_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v4_APM.mk
。。。
??? 98?? ?px4-v2: $(BUILDROOT)/make.flags CHECK_MODULES $(MAVLINK_HEADERS) $(PX4_ROOT)/Archives/px4fmu-v2.export $(SKETCHCPP) module_mk px4-io-v2
??? 99?? ??? ?$(RULEHDR)
?? 100?? ??? ?$(v) cp $(PX4_V2_CONFIG_FILE) $(PX4_ROOT)/makefiles/nuttx/
?? 101?? ??? ?$(PX4_MAKE) px4fmu-v2_APM
?? 102?? ??? ?$(v) arm-none-eabi-size $(PX4_ROOT)/Build/px4fmu-v2_APM.build/firmware.elf
?? 103?? ??? ?$(v) cp $(PX4_ROOT)/Images/px4fmu-v2_APM.px4 $(SKETCH)-v2.px4
?? 104?? ??? ?$(v) $(SKETCHBOOK)/Tools/scripts/add_git_hashes.py $(HASHADDER_FLAGS) "$(SKETCH)-v2.px4" "$(SKETCH)-v2.px4"
?? 105?? ??? ?$(v) echo "PX4 $(SKETCH) Firmware is in $(SKETCH)-v2.px4"
。。
?? 139?? ?px4-v2-upload: px4-v2????? //燒寫命令
?? 140?? ??? ?$(RULEHDR)
?? 141?? ??? ?$(v) $(PX4_MAKE) px4fmu-v2_APM upload
?? 142???
。。
?163?? ?px4-io-v2: $(PX4_ROOT)/Archives/px4io-v2.export
?? 164?? ??? ?$(v)+ $(MAKE) -C $(PX4_ROOT) -f $(PX4_ROOT)/Makefile.make px4io-v2_default EXTRADEFINES="-DARDUPILOT_BUILD"
?? 165?? ??? ?$(v) cp $(PX4_ROOT)/Images/px4io-v2_default.bin px4io-v2.bin
?? 166?? ??? ?$(v) cp $(PX4_ROOT)/Build/px4io-v2_default.build/firmware.elf px4io-v2.elf
?? 167?? ??? ?$(v) mkdir -p $(MK_DIR)/PX4/ROMFS/px4io/
?? 168?? ??? ?$(v) cp px4io-v2.bin $(MK_DIR)/PX4/ROMFS/px4io/px4io.bin
?? 169?? ??? ?$(v) mkdir -p $(MK_DIR)/PX4/ROMFS/bootloader/
?? 170?? ??? ?$(v) cp $(SKETCHBOOK)/mk/PX4/bootloader/px4fmuv2_bl.bin $(MK_DIR)/PX4/ROMFS/bootloader/fmu_bl.bin
?? 171?? ??? ?$(v) echo "PX4IOv2 Firmware is in px4io-v2.bin"
?? 172?? ?
?在第 50? 行, ? PX4_V2_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v2_APM.mk??//這文件包含了編譯目標的依賴,也就是具體編譯的那些模塊哪些驅動
???? 1?? ?#
???? 2?? ?# Makefile for the px4fmu-v2_APM configuration
???? 3?? ?#
???? 4?? ?include $(SKETCHBOOK)/mk/PX4/px4_common.mk
???? 5?? ?
???? 6?? ?MODULES?? ??? ?+= drivers/lsm303d
???? 7?? ?MODULES?? ??? ?+= drivers/l3gd20
???? 8?? ?MODULES?? ??? ?+= drivers/mpu9250
???? 9?? ?MODULES?? ??? ?+= drivers/boards/px4fmu-v2
??? 10?? ?MODULES?? ??? ?+= drivers/pwm_input
??? 11?? ?MODULES???????? += modules/uavcan
??? 12?? ?MODULES???????? += lib/mathlib
??? 13?? ?MODULES?? ??? ?+= drivers/px4io
??? 14?? ?MODULES?? ??? ?+= drivers/px4flow
??? 15?? ?MODULES?? ??? ?+= drivers/oreoled
在看px4_common.mk文件,略多,就不全貼了,
??? 1?? ?#
???? 2?? ?# common makefile elements for all PX4 boards
???? 3?? ?#
???? 4?? ?
???? 5?? ?#
???? 6?? ?# Use the configuration's ROMFS.
???? 7?? ?#
???? 8?? ?ROMFS_ROOT?? ? = $(SKETCHBOOK)/mk/PX4/ROMFS
???? 9?? ?MODULES?? ??? ?+= $(APM_MODULE_DIR)
??? 10?? ?
??? 11?? ?#
??? 12?? ?# Board support modules
??? 13?? ?#
??? 14?? ?MODULES?? ??? ?+= drivers/device
??? 15?? ?MODULES?? ??? ?+= drivers/stm32
??? 16?? ?MODULES?? ??? ?+= drivers/stm32/adc
??? 17?? ?MODULES?? ??? ?+= drivers/stm32/tone_alarm
??? 18?? ?MODULES?? ??? ?+= drivers/led
??? 19?? ?MODULES?? ??? ?+= drivers/px4fmu
??? 20?? ?MODULES?? ??? ?+= drivers/rgbled
??? 21?? ?MODULES?? ??? ?+= drivers/mpu6000
??? 22?? ?MODULES?? ??? ?+= drivers/hmc5883
??? 23?? ?MODULES?? ??? ?+= drivers/ms5611
??? 24?? ?MODULES?? ??? ?+= drivers/mb12xx
??? 25?? ?MODULES?? ??? ?+= drivers/ll40ls
??? 26?? ?MODULES?? ??? ?+= drivers/trone
??? 27?? ?#MODULES?? ?+= drivers/gps
??? 28?? ?#MODULES?? ?+= drivers/hil
??? 29?? ?#MODULES?? ?+= drivers/hott_telemetry
??? 30?? ?#MODULES?? ?+= drivers/blinkm
??? 31?? ?#MODULES?? ?+= modules/sensors
??? 32?? ?MODULES?? ??? ?+= drivers/airspeed
??? 33?? ?MODULES?? ??? ?+= drivers/ets_airspeed
??? 34?? ?MODULES?? ??? ?+= drivers/meas_airspeed
??? 35?? ?MODULES?? ??? ?+= drivers/mkblctrl
??? 36?? ?MODULES?? ??? ?+= drivers/batt_smbus
??? 37?? ?MODULES?? ??? ?+= drivers/irlock
??? 38??? 。。。。
這些就給出了編譯的各個模塊!!
好了,先寫到這吧……
總結
以上是生活随笔為你收集整理的Pixhawk飞控源码目录结构及编译流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卡尔曼滤波器学习笔记(二)
- 下一篇: 域操作符