乐于分享
好东西不私藏

【开源UAV】PX4 飞控软件启动流程详解

【开源UAV】PX4 飞控软件启动流程详解

PX4 飞控软件启动流程(NuttX + FMU-v6C)

文档涵盖:从上电到系统就绪的完整启动链,以及各飞行控制模块的加载顺序。目标平台:PX4 FMUv6C(STM32H7, Cortex-M7, NuttX RTOS)


目录

  1. [启动总览](#1-启动总览)
  2. [第一阶段:硬件初始化](#2-第一阶段硬件初始化)
  3. [第二阶段:NuttX 与 NSH 启动](#3-第二阶段nuttx-与-nsh-启动)
  4. [第三阶段:rcS 主启动脚本](#4-第三阶段rcs-主启动脚本)
  5. [第四阶段:传感器初始化](#5-第四阶段传感器初始化)
  6. [第五阶段:状态估计器](#6-第五阶段状态估计器)
  7. [第六阶段:控制与输出](#7-第六阶段控制与输出)
  8. [第七阶段:多旋翼控制模块详解](#8-第七阶段多旋翼控制模块详解)
  9. [模块启动机制](#9-模块启动机制)
  10. [模块间通信:uORB 消息总线](#10-模块间通信uorb-消息总线)
  11. [相关源文件索引](#11-相关源文件索引)

1. 启动总览

从飞控板上电到系统完全就绪,整个启动流程分为七个阶段:


2. 第一阶段:硬件初始化

源文件: boards/px4/fmu-v6c/src/init.c

2.1 stm32_boardinitialize() — 最低层硬件初始化

在 NuttX 内存初始化完成后、设备驱动加载前调用。

__EXPORT void stm32_boardinitialize(void){    board_on_reset(-1);               // PWM 引脚置低(防止误转电机)    board_autoled_initialize();       // LED GPIO 初始化    px4_gpio_init(gpio, ...);         // 批量配置 GPIO (PX4_GPIO_INIT_LIST)    stm32_usbinitialize();            // USB 接口初始化}

PX4_GPIO_INIT_LIST 包含(board_config.h:255):

GPIO功能
ADC 输入引脚电池电压/电流、硬件版本检测
CAN1/CAN2 TX/RXCAN 总线接口
GPIO_HEATER1_OUTPUTIMU 温控加热
GPIO_nPOWER_IN_A/B/C电源检测(Brick1/Brick2/USB)
GPIO_VDD_5V_PERIPH_nEN外设 5V 电源控制
GPIO_VDD_5V_HIPOWER_nEN高功率 5V 电源控制
GPIO_VDD_3V3_SENSORS_EN传感器 3.3V 电源控制
GPIO_TONE_ALARM_IDLE蜂鸣器控制

2.2 board_app_initialize() — 板级应用初始化

由 NuttX boardctl(BOARDIOC_INIT) 调用,在 NSH 启动之前执行。

__EXPORT int board_app_initialize(uintptr_t arg){    VDD_5V_PERIPH_EN(true);          // 打开 5V 外设电源    VDD_5V_HIPOWER_EN(true);         // 打开高功率 5V 电源    px4_platform_init();             // HRT 高精度定时器启动    board_determine_hw_info();       // 读取 ADC 判断硬件版本                                     // V6C00 / V6C01 / V6C02 等    stm32_spiinitialize();           // SPI 总线初始化    board_spi_reset(100xffff);     // SPI 外设复位(10ms)    board_dma_alloc_init();          // DMA 内存分配器初始化    drv_led_start();                 // LED 驱动启动    stm32_sdio_initialize();         // SD 卡接口初始化    px4_platform_configure();        // 根据硬件版本配置外设 I2C/SPI 映射}

硬件版本检测:FMU-v6C 通过 ADC 读取版本/修订引脚,区分 7 种硬件变体:

版本 ID说明
V6C00FMUv6C Rev 0, I2C4 外部但有内部设备
V6C01FMUv6C Rev 1, I2C4 内部 I2C2 外部
V6C02FMUv6C Rev 2, BMI088 + ICM42688P
V6C10无 PX4IO Rev 0
V6C11无 PX4IO Rev 1
V6C21FMUv6C Mini Rev 1
V6C22FMUv6C Mini Rev 2, BMI088 + ICM42688P

3. 第二阶段:NuttX 与 NSH 启动

NuttX 配置: boards/px4/fmu-v6c/nuttx-config/nsh/defconfig

CONFIG_INIT_ENTRYPOINT="nsh_main"        // 系统入口 = NSH 主函数CONFIG_NSH_ARCHINIT=y                     // 启动时调用 board_app_initialize()CONFIG_NSH_CROMFSETC=y                    // 自动挂载 CROMFS 到 /etcCONFIG_FS_CROMFS=y                        // 压缩 ROMFS 支持(默认)CONFIG_FS_ROMFS=y                         // 普通 ROMFS 支持(备选)

ROMFS 嵌入

启动脚本存储在 ROMFS 中,编译时嵌入固件,运行时挂载为根文件系统:

挂载后的 /etc/ 目录结构:

/etc/├── rcS                                ← 主启动脚本(自动执行)├── init.d/│   ├── rc.mc_defaults                 ← 多旋翼默认参数│   ├── rc.board_defaults              ← FMU-v6C 板级参数│   ├── rc.board_sensors               ← FMU-v6C 传感器启动│   ├── rc.vehicle_setup               ← 飞行器类型分支│   ├── rc.mc_apps                     ← 多旋翼控制模块│   ├── rc.sensors                     ← 通用传感器│   ├── rc.autostart                   ← 自动生成: 空气框架选择│   ├── rc.autostart.post              ← 空气框架额外参数│   └── airframes/│       ├── 4001_quad_x                ← 通用四旋翼 X 型│       ├── 4014_s500                  ← S500 机架│       └── ...                        ← 其他空气框架└── extras/    └── px4_io-v2_default.bin          ← IO 协处理器固件

4. 第三阶段:rcS 主启动脚本

源文件: ROMFS/px4fmu_common/init.d/rcS

执行流程(按顺序):

步骤操作含义
1ver all打印系统版本信息
2挂载 SD 卡 (/dev/mmcsd0/fs/microsd)外部存储
3检查 hardfault log异常时播放错误提示音
4param load / param import加载飞控参数(优先 SD,后备 MTD)
5检查 SYS_AUTOCONFIG需要时重置参数
6rc.board_arch_defaults架构级默认参数(如适用)
7rc.board_defaultsFMU-v6C 板级参数
8rc.additional_init附加初始化(如适用)
9rc.autostart加载空气框架配置
10tone_alarm start启动蜂鸣器
11dataman start航点/任务存储
12send_event start事件通知
13load_mon start资源负载监控
14RGB LED 启动状态指示灯
15用户配置覆盖 (/fs/microsd/etc/config.txt)可选
16传感器初始化见下一节
17状态估计器 (EKF2)EKF 启动
18PX4IO协处理器固件校验与启动
19RC 输入遥控信号处理
20Commander飞行模式状态机
21输出驱动DShot / PWM
22UAVCAN / CyphalCAN 总线外设
23rc.vehicle_setuprc.mc_apps控制模块启动
24其他模块磁偏估计、云台、FFT 等
25rc.logging日志记录器
26rc.autostart.post空气框架后处理参数
27mavlink boot_complete通知地面站系统就绪
28释放脚本变量回收 RAM

5. 第四阶段:传感器初始化

5.1 FMU-v6C 板级传感器 — rc.board_sensors

源文件: boards/px4/fmu-v6c/init/rc.board_sensors

board_adc start                        ← 板载 ADC(电压/电流检测)硬件版本检查:if HW >= V6C02:    bmi088 -A -R 4 start               ← SPI BMI088 加速度计    bmi088 -G -R 4 start               ← SPI BMI088 陀螺仪else:    bmi055 -A -R 4 start               ← SPI BMI055 加速度计    bmi055 -G -R 4 start               ← SPI BMI055 陀螺仪icm42688p -R 6 start                   ← SPI ICM42688P (冗余 IMU)ms5611 -X -b 4 -a 0x77 start           ← I2C4 气压计ist8310 -X -b 4 -a 0xc  start           ← I2C4 内置磁力计ist8310 -X -b 1 -R 10 start             ← I2C1 外置磁力计(GPS 模块)

5.2 通用传感器 — rc.sensors

源文件: ROMFS/px4fmu_common/init.d/rc.sensors

按参数启动可选传感器(由对应参数控制是否启用):

参数名传感器总线
SENS_EN_BATT=1batt_smbusSMBus 智能电池
SENS_EN_LL40LS=1ll40ls_pwmPWM 接口 Lidar-Lite
SENS_EN_LL40LS=2ll40lsI2C 接口 Lidar-Lite
SENS_EN_MPDT=1mappydotI2C
SENS_EN_MB12XX>0mb12xxI2C 声呐
SENS_EN_PGA460>0pga460UART 声呐
SENS_EN_TRANGER>0lightware_laserUART/I2C 激光测距
SENS_EN_SF1XX>0sf1xx_laserUART/I2C 激光测距
SENS_EN_BMP280=1bmp280I2C/SPI 气压计
SENS_EN_L3GD20=1l3gd20SPI 陀螺仪
SENS_EN_LSM303D=1lsm303dSPI 磁力计
GPS_1_CONFIG≠0gpsUART GPS
SENS_EN_THERMAL=1heaterIMU 恒温加热

5.3 传感器聚合 — sensors start

sensors 模块将多个传感器数据融合为统一的 uORB 主题输出:


6. 第五阶段:状态估计器

由参数决定使用哪个估计器:

# rcS:321-384if param compare -s EKF2_EN 1    ekf2 start &                     ← 默认: EKF2(推荐)if param compare -s LPE_EN 1    local_position_estimator start   ← 备用: LPEif param compare -s ATT_EN 1    attitude_estimator_q start       ← 备用: 姿态估计器

EKF2 数据流


7. 第六阶段:控制与输出

7.1 PX4IO 协处理器

# rcS:388-420if px4io supported    px4io checkcrc ${IOFW}        ← 校验固件版本    if CRC 不匹配        px4io update ${IOFW}      ← 更新固件 (/etc/extras/px4_io-v2_default.bin)    px4io start                   ← 启动 IO 协处理器

PX4IO 负责:PWM 信号生成、RC 输入解析(PPM/SBUS)、安全开关逻辑。

7.2 Commander — 飞行模式状态机

# rcS:466-480commander start                    ← 启动 Commanderdshot start                        ← DShot 数字协议pwm_out start                      ← PWM 输出(非 DShot 时)

Commander 处理:

  • 飞行模式切换(手动/定高/定点/任务/返航)
  • 安全状态机(预解锁 → 已解锁 → 飞行)
  • 预飞检(传感器健康度、GPS 锁定数、磁力计一致性)

7.3 输出驱动


8. 第七阶段:多旋翼控制模块详解

源文件: ROMFS/px4fmu_common/init.d/rc.mc_apps

rc.vehicle_setup 根据 VEHICLE_TYPE=mc 加载 rc.mc_apps

# rc.mc_appscontrol_allocator start              ← 控制分配(混控器)mc_rate_control start                ← 角速率控制(内环 PID)mc_att_control start                 ← 姿态控制(外环 PID)mc_hover_thrust_estimator start      ← 悬停推力在线估计flight_mode_manager start            ← 飞行模式管理mc_pos_control start                 ← 位置控制land_detector start multicopter      ← 着陆检测if MC_AT_EN > 0: mc_autotune_attitude_control start   ← 自整定if MC_NN_EN=1:   mc_nn_control start                   ← 神经网络控制if MC_RAPTOR_ENABLE=1: mc_raptor start                 ← Raptor 竞速控制

8.1 控制流水线

从位置设定点到电机输出的完整控制链路:

8.2 关键 uORB 消息流

uORB 消息发布者订阅者
sensor_combinedsensorsekf2, mc_rate_control
vehicle_attitudeekf2mc_att_control, navigator
vehicle_local_positionekf2mc_pos_control, navigator
vehicle_attitude_setpointmc_pos_control / flight_mode_managermc_att_control
vehicle_rate_setpointmc_att_controlmc_rate_control
actuator_controls_0mc_rate_controlcontrol_allocator
actuator_motorscontrol_allocatordshot / pwm_out
vehicle_control_modecommander所有控制模块
manual_control_setpointmanual_controlcommander, flight_mode_manager

9. 模块启动机制

9.1 从 ekf2 start 到代码执行

9.2 builtin 表的生成

每个模块的 CMakeLists.txt 中定义:

px4_add_module(    MODULE ekf2          ← 模块名(即命令名)    MAIN ekf2            ← 入口函数名(生成 ekf2_app_main)    SRCS ekf2.cpp ...)

编译时对所有模块执行 cmake/px4_add_module.cmake:214

target_compile_definitions(<img class="wxp-inline-math-image" src="blob:app://obsidian.md/8d9eab40-a4be-4b07-a4d1-976f727020db" alt="公式" />{MAIN}_app_main)

所有模块的入口在编译时自动汇总到 board_ioctl.c:48 的 builtin 表中:

FAR const struct builtin_s g_kernel_builtins[] = {    #include <NuttX/kernel_builtin/kernel_builtin_list.h>    // 自动生成的内容:    // {"ekf2", ekf2_app_main, ...},    // {"mc_pos_control", mc_pos_control_app_main, ...},    // ...};

9.3 模块生命周期

模块主循环的代码模式:

while (!should_exit()) {    orb_subscribe()      // 等待新消息    orb_copy()           // 读取数据    run_algorithm()      // 运行核心算法    orb_publish()        // 发布结果    schedule()           // 调度下次运行}

10. 模块间通信:uORB 消息总线

uORB 是 PX4 的核心进程间通信机制,基于发布/订阅模式。

10.1 工作原理

10.2 关键特性

特性说明
多对多一个发布者 → 多个订阅者;多个发布者 → 单个主题
零拷贝订阅者获取的是共享内存的引用
实时性发布立即生效,无队列延迟
自描述所有消息通过 .msg 文件定义
跨平台NuttX/Posix 共用同一套接口

10.3 消息定义示例

消息在 msg/ 目录下以 .msg 文件定义:

# msg/vehicle_attitude.msguint64 timestamp          # 时间戳float32[4] q              # 姿态四元数float32[4] delta_q_reset  # 重置时的四元数增量uint8 quat_reset_counter  # 重置计数器

11. 相关源文件索引

板级文件

文件作用
boards/px4/fmu-v6c/default.px4board板级构建配置
boards/px4/fmu-v6c/src/init.c板级硬件初始化
boards/px4/fmu-v6c/src/board_config.h板级硬件定义(GPIO、ADC、I2C等)
boards/px4/fmu-v6c/src/hw_config.hBootloader 硬件配置
boards/px4/fmu-v6c/src/CMakeLists.txt板级源文件编译
boards/px4/fmu-v6c/init/rc.board_defaults板级默认参数
boards/px4/fmu-v6c/init/rc.board_sensors板级传感器启动
boards/px4/fmu-v6c/extras/px4_io-v2_default.binIO 协处理器固件

ROMFS 启动脚本

文件作用
ROMFS/px4fmu_common/init.d/rcS主启动脚本
ROMFS/px4fmu_common/init.d/rc.mc_defaults多旋翼默认参数
ROMFS/px4fmu_common/init.d/rc.mc_apps多旋翼控制模块启动
ROMFS/px4fmu_common/init.d/rc.vehicle_setup飞行器类型分支
ROMFS/px4fmu_common/init.d/rc.sensors通用传感器启动
ROMFS/px4fmu_common/init.d/rc.autostart自动生成:空气框架选择
ROMFS/px4fmu_common/init.d/airframes/4001_quad_x四旋翼 X 型配置
ROMFS/px4fmu_common/init.d/airframes/4014_s500S500 机架配置
ROMFS/CMakeLists.txtROMFS 编译处理

NuttX 平台文件

文件作用
platforms/nuttx/CMakeLists.txtNuttX 固件链接与 ROMFS 嵌入
platforms/nuttx/cmake/px4_impl_os.cmakeNuttX 平台编译标志
platforms/nuttx/src/px4/common/board_ioctl.c模块启动(builtin 表)
boards/px4/fmu-v6c/nuttx-config/nsh/defconfigNuttX 内核配置

CMake 构建系统

文件作用
CMakeLists.txt顶层 CMake:模块遍历与编译
cmake/px4_config.cmakeCONFIG 解析,匹配 .px4board
cmake/kconfig.cmakeKconfig 处理,生成模块列表
cmake/px4_add_module.cmake模块注册与 builtin 号生成

关键控制模块

模块源码路径功能
sensorssrc/modules/sensors/传感器聚合
ekf2src/modules/ekf2/EKF2 状态估计
commandersrc/modules/commander/飞行模式状态机
control_allocatorsrc/modules/control_allocator/控制分配(混控)
mc_rate_controlsrc/modules/mc_rate_control/角速率 PID
mc_att_controlsrc/modules/mc_att_control/姿态控制
mc_pos_controlsrc/modules/mc_pos_control/位置控制
flight_mode_managersrc/modules/flight_mode_manager/飞行模式管理
navigatorsrc/modules/navigator/导航与任务执行
loggersrc/modules/logger/飞行日志
land_detectorsrc/modules/land_detector/着陆检测
dshotsrc/drivers/dshot/DShot 协议输出

文档信息

目标平台: PX4 FMUv6C (STM32H743IIK6, NuttX)

机型: 四旋翼 X 型 (Airframe 4001)

对应代码: PX4-Autopilot main 分支