PX4源码学习(一):结构概述
最近在做PX4固件的移植开发工作,由于之前没有这方面开发经验,加之PX4源码又比较庞杂,所以想要通过一点一点的学习梳理和实践,使这部分工作能够尽快开展起来。博客中如有错误,恳请大家指正,同时欢迎小伙伴们一起交流学习。
另:这篇博客很多内容借鉴了其他大神的博客,根据自己的理解做了部分修改,关于原创还是转载的问题我有些疑问,如有不妥,敬请告知。
PX4飞控源码系统框架介绍:
注:本篇内容中所编译的PX4 固件版本为v1.11,以 px4_fmu-v2_default 为例。
一、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