PX4 飞控源码系统框架介绍
一、build_px4fmu-v2_default
编译以后生成的文件:内部主要需要在意的就是topics_temporary_header(所有的任务是要的头文件,在创建任务和使用数据结构时可以从该处检索);topics_temporary_sources(系统中所有的任务函数)
二、Cmake
配置文件,主要使用 nuttx_px4fmu-v2_default.cmake。该处主要是关于系统使用的文
件的路径配置,在 PX4 系统所有的.CPP 和.C 文件都是通过在该处进行路径包含的。在需
要自己创建私有任务或者 sensor 驱动程序时需要添加到该处。
三、mavlink
主要负责和地面站QGC通信的协议部分,这部分可以直接调用。分为1.0版本和2.0版本,以后都更新到2.0版本了
四、msg
uORB manger 的缩写:msg。该部分主要是 PX4 系统的使用的所有的数据结构的集
合部分,各种任务和 sensor 驱动中需要获取的 sensor 数据都在此部分,还包含各种运行状
态的数据结构。其中需要注意的是该文件夹下的 Cmakelists.txt,该文档是整个 msg 部分的
配置部分,类似第二部分的 Cmake 中的配置文件一样,在开发者创建任务或者 sensor 驱
动程序时创建对应的数据结构(***.msg)以后,需要把开发者创建的***.msg 添加到
Cmakelists.txt 中,否则编译时识别不到开发者创建的数据结构。
在该部分创建好以后,直接编译可以自动生成相对应的 C/C++下的标准头文件,即在
第一部分所介绍的 topics_temporary_header,在 PX4 系统的任何一个地方引用所需要的数
据结构,都需要把这个头文件包含进去。
五、NuttX
PX4 所使用的操作系统,其类似 UCos,关于 OS 的基本概念以及够不部分不在详述。
六、ROMFS
ROM file_system 的简写,内部的 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 : 启 动 上 层 application , 如 attitude_estimate 、 attitude_control 、
position_estimate 和 position_control 等。如果在 src/modules 中创建私有的上层 application,
建议放在该部分启动。
七、src
7.1 drivers
pixhawk 硬件系统中使用的所有的 sensor 的驱动代码。也包含了 STM32 主控
MCU 的 io 输出控制(PX4IO)和 pwm 的驱动。
7.2 examples
PX4 系统给的一些简单的实例,为了便于开发者做二次开发调试测试使用。尤其是 px4_simple_app,内部涉及了如何通过 uORB 机制获取所需要的数据。
7.3 lib
标准库。
7.4 modules
内部就是上层的应用任务代码实现部分,包含姿态结算、姿态控制、配置结算、
位置控制、落地检测、sensor 初始化、系统配置、uORB、commander 等。其中
commander 内部是实现整个控制模式的代码,包含 pixhawk 灯显控制,飞行模式切
换,解锁上锁等等。
相关算法实现也都是在该部分,比如像验证和控制算法先关(自适应 PID)就可
以在 mc_att_control 中加入自己私有的算法做验证。
下面是关于 module 里面的 application 介绍。
7.4.1、attitude_estimator_ekf:使用 EKF 算是实现姿态结算。
7.4.2、attitude_estimator_q:使用 mahony 的互补滤波算法实现姿态结算。
7.4.3、commander:整个系统的过程实现,比如起飞前的各 sensor 的校准算法实现、
安全开关是否使能、飞行模式的切换、pixhawk 硬件上的显示灯的颜色定义等
等。
7.4.4、gpio_led:IO 控制 led 的驱动。
7.4.5、land_detector:飞行过程中使用 land 模式降落或者受到降落时的落地监测部
分,内部会监测 z 轴速度和加速度等,具体实现请详细阅读源代码。
7.4.6、local_position_estimator:常说的 LPE 算法实现位置结算,类似最简单的 KF,
一个预测,一个修正。
7.4.7、logger:关于 log 日志的读写函数。
7.4.8、mavlink:和地面站通信的通信协议,结合地面站 QGC 源代码配合修改,或者
仅仅调用 mavlink 内部的 API 接口,即可通过无线信号把所需要的数据显示在
地面站 QGC 上,此方法是一种实时监测“目标数据”的方法。
7.4.9、mc_att_control:姿态控制的算法实现,主要就是姿态的内外环 PID 控制,外
环角度控制、内环角速度控制。
7.4.10、 mc_pos_control:位置控制的算法实现,主要就是位置的内外环 PID 控制,外
环速度控制、内环加速度控制。
7.4.11、 sdlog2:SD 卡的 log 日志读写部分,在 SD 卡中看到的所有数据都是通过该部
分写进去的,平时做 log 日志分析也是查看的这个内部的数据,所以,假如想
监测某个“目标数据”,也可以由此处写到 SD 卡中然后在做相应的分析。
7.4.12、 sensors:关于各种 sensors 的相关函数。
7.4.13、 systemlib:系统所需要的参数列表。
7.4.14、 uORB:IPC 通信机制。首先就是需要了解如何使用它进行进程间通信,了解
整个系统中的数据流流向。
八、Makefile:
最终的编译命令等,通过 shellscript 写的,可以自行对其修改成自己需要的。
九、
如下介绍对应于上面的红色标识
1、编译以后生成的固件,烧录进飞控即可。内部会有一些需要用到的头文件和.cp文件p。
2、mavlink协议部分,负责地面站通信的库文件都在此。
3、msg是负责进程间通信的消息集合,在自己创建私有任务时需要再次文件内部添加需要的数据结构。
4、Nutt是飞控所用的OS,这个不做系统移植不需要深入研究。我们所做的都是OS之上的。
5、ROMFS内部是启动文件,配置需要启动哪些任务与启动顺序,还有一些就是关于系统默认的一些配置。具体配置哪些需要阅读启动脚本了解。
6、SRC内部就是所有的sensor驱动和各种任务,比如姿态解算和姿态控制、位置解算和位置控制等等。
7、makefile内部是常用的命令行指令集合。
下面主要介绍一下SRC文件夹里面的东西
1、drivers:所使用到的所有的sensor驱动程序都在此处。(如果添加sensor,注意该处)
2、顾名思义,实现代码,创建私有任务时可以参考。
3、Lib库,很多矩阵运算相关的数学库。
4、重点,飞行模式,姿态解算,姿态控制,位置结算,位置控制,落地检测等任务都在该modules里面。(飞控相关算法都在该处)
下面介绍重点modules
1、姿态解算的代码实现部分
2、落地检测的代码实现部分
3、姿态控制的代码实现部分
4、位置控制的代码实现部分
5、位置解算的代码实现部分
6、各种sensors的初始化部分
7、uORB:进程间通信所用