明天我们来学习一下关于开源飞控的目录结构与编译选项,先来瞧瞧整体目录结构,之后我们会针对主要的功能模块说一些说明(因为篇幅限制本节所列举的目录与文件都是源代码中一少部份linux 下载工具linux安全加固,实际上好多目录与文件夹都被省略了):
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编译选项编译然后生成的文件即运行在STM3232F系列的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:工具链linux编译cpp文件,其中储存了以不同编译选项编译源代码时所使用的编译工具,比如:交叉编译工具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文件,即通信合同内容。其定义事例:
uint64timestamp
int32lat
int32lon
float32vel_m_s
boolvel_ned_valid
uint8satellites_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构架支持多种运行平台,比如:运行在STM3232FF4系列上、运行在Arm系列上,运行在Posix标准构架上等等。在不同的运行平台上,编译源代码的内容与链接源代码均不尽相同,所以就须要在不同的编译选项下,编译不同的平台源代码,platforms中储存了不同平台下的源代码内容:
platforms/
├──nuttx
│├──cmake
│├──CMakeLists.txt
│├──Debug
│├──Images
│├──NuttX
│├──nuttx-configs
│└──src
└──posix
├──cmake
├──CMakeLists.txt
├──include
└──src
关于Nuttx平台和Posix平台主要内容涉及了操作系统的相关知识,这与我们学习开源飞控px4的设计与原理关系并不是特别的大,所以这儿只做简介,并不做太多的介绍linux编译cpp文件,有兴趣的读者可以依照自己的须要去学习。
六、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脚本,但并不完全相同,具体句型可以参见:
七、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等等。
上期预告:《uORB实现原理与使用方式》
《一天精通无人机:中级篇》主要内容为:基本动力原理、硬件组装、飞控程序下载、编译、校准、调参与试航。
《一天精通无人机:初级篇》主要内容为:开源飞控程序PX4构架、精典PID控制原理、路径规划、命令收发、与地面站通信合同。
《一天精通无人机:中级篇》主要内容为:动力学建模、半数学仿真、传感器数据融合、扩展卡尔曼混频、全手动飞行设计、环境感知与视觉建模。
文章评论