一天精通无人机 第 18 讲 中级篇系列:编译选项与模块功能说明

file

今天我们来学习一下关于开源飞控的目录结构与编译选项,先来看看整体目录结构,然后我们会针对主要的功能模块说一些说明(由于篇幅限制本节所列出的目录与文件都是源代码中一少部分,实际上很多目录与文件夹都被省略了):

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=gnu11)和警告与错误选项( -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
  1. 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等等。

下期预告:《uORB实现原理与使用方法》

file