PX4源码学习(一):结构概述

最近在做PX4固件的移植开发工作,由于之前没有这方面开发经验,加之PX4源码又比较庞杂,所以想要通过一点一点的学习梳理和实践,使这部分工作能够尽快开展起来。博客中如有错误,恳请大家指正,同时欢迎小伙伴们一起交流学习。

另:这篇博客很多内容借鉴了其他大神的博客,根据自己的理解做了部分修改,关于原创还是转载的问题我有些疑问,如有不妥,敬请告知。

PX4飞控源码系统框架介绍:

注:本篇内容中所编译的PX4 固件版本为v1.11,以 px4_fmu-v2_default 为例。

PX4源码学习(一):结构概述

一、boards

各种不同的飞控板硬件配置文件。

二、px4_fmu-v2_default

编译后生成的文件,其路径为:Firmware/ bulid / px4_fmu-v2_default

三、Cmake

配置文件,其路径为 Firmware / boards / px4 / fmu-v2 / default.cmake。该文件主要是关于系统使用的文件的路径配置。PX4系统中所有的.cpp和.c文件都要在该处进行路径包含。自定义的任务或sensor驱动程序也需要添加到该处。

四、mavlink

是飞控和地面站QGC的通信协议部分,可直接调用,现已更新为2.0版本。路径为:Firmware / mavlink

五、msg

是uORB Messaging的缩写。路径为:Firmware / msg

该部分主要是PX4系统使用的所有数据的集合,各种任务和sensor驱动中需要获取的sensor数据都在此部分,还包括各种运行状态的数据。注意该文件夹下的CMakeLists.txt,该文档是整个msg部分的配置文件,类似于二中Cmake中的配置文件,在开发者创建任务或者sensor驱动时创建对应的数据(xxx.msg文件)以后,需要将其添加到CMakeLists.txt中,否则编译时识别不到开发者创建的数据。

六、Nuttx

PX4所使用的操作系统,路径为 Firmware / platforms / nuttx,关于os的基本概念暂不在此详述。

七、ROMFS

ROM file_system的简写,路径为 Firmware / ROMFS,内部的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:启动上层应用,如attitude_estimate、attitude_control、position_estimate和position_control等。如在src / modules 中自定义app,则应放在在该部分启动。

八、src

8.1 drivers

该文件夹内包含了飞控硬件系统中使用的所有sensor的驱动代码。也包含了STM32主控MCU的io输出控制(PX4IO)和pwm的驱动。

8.2 examples

PX4系统给的一些简单的实例,为了便于开发者做二次开发调试测试使用。尤其是px4_simple_app,内部涉及了如何通过uORB获取需要的数据。

8.3 lib

标准库。

8.4 modules

上层任务代码的实现部分,包括姿态解算、姿态控制、配置解算、位置控制、落地检测、sensor初始化、系统配置、uORB、commander等。其中commander是实现整个控制模式的代码,包括pixhawk灯显控制、飞行模式切换、上锁解锁等。

相关算法实现也在该部分,下面是module里的app介绍:

attitude_estimator_ekf:

attitude_estimator_q: 使用mahony的互补滤波算法实现姿态解算。

commander: 整个系统的过程实现,如起飞前各sensor的校准算法实现、安全开关是否使能、飞行模式切换、pixhawk硬件上灯的控制等。

gpio_led:

land_detector: 飞行过程中使用land模式降落或者落地时的落地监测部分,内部会监测Z轴速度和加速度等。

local_position_estimator: 常说的LPE算法实现位置解算。

logger: 关于log日志的读写函数。

mavlink: 和地面站通信的通信协议,结合地面站QGC源码配合修改,或者仅仅调用mavlink内部的API接口,即可通过无线信号将所需的数据显示在地面站QGC上,此方法是一种实时监测目标数据的方法。

mc_att_control: 姿态控制的实现算法,主要就是姿态的内外环PID控制,外环角度控制,内环角速度控制。

mc_pos_control: 位置控制的算法实现,主要是位置的内外环PID控制,外环速度控制,内环加速度控制。

sdlog2: 

sensors: 关于各种sensor的相关函数。

systemlib: 

uORB: IPC通信机制。首先需要了解如何使用它进行进程间通信,了解整个系统中的数据流流向。

九、Makefile

最终的编译命令,用shellscript编写,可根据需要修改。


参考博客:https://www.cnblogs.com/kinson/p/12124764.html