简介本资源为APM飞控核心固件——ArduCopter 3.2.1版本的完整开源源码包面向无人机开发初学者、嵌入式爱好者及飞控算法研究者聚焦多旋翼飞行器的姿态解算、PID控制、航点导航与地面站通信等关键功能实现。压缩包为ZIP格式大小24.8MB含大量C源文件如AP_Motors、AP_PID、AP_InertialSensor等模块、硬件抽象层代码及配置头文件覆盖传感器数据处理、飞行模式切换、控制器参数调优等典型开发场景。已有807人学习下载是入门Pixhawk平台飞控开发的高实用性起点。源码经针对性裁剪保留APM核心逻辑并全面添加中文注释显著降低理解门槛目录结构清晰关键算法模块独立可读便于逐层剖析姿态估计流程、位置控制闭环及MAVLink通信协议集成方式适合边读边调试、定制化修改与教学实践。1. 这不是玩具遥控器APM飞控源码是能真机烧录、实测悬停、支持多旋翼/固定翼/直升机的全栈开源飞控系统某开发者在调试一架四轴时发现遥控信号一抖飞机就剧烈晃动——他以为是接收机问题换三套设备后才意识到真正决定飞行稳定性的是飞控板上跑着的那几万行 C 代码。APMArduPilot Mega飞控源码正是这样一套工业级开源飞控固件它不是教学 Demo不是模拟器脚本而是被全球数千架真实无人机、航模、测绘平台长期部署的成熟系统。它支持 PX4 兼容硬件如 Pixhawk 系列、STM32F4/F7/H7 平台能驱动无刷电调、GPS/RTK 模块、气压计、IMUMPU6000/ICM20602、磁罗盘、空速管完整实现姿态解算DCM EKF3、位置控制L1 TECS、任务规划MAVLink 任务上传、安全机制失联返航、低电压降落、地理围栏。如果你手上有 Pixhawk 4 或 CubeOrange 飞控板想让机器自己悬停、沿航线巡航、自动降落甚至接入自定义传感器做农业喷洒或电力巡检——这份源码就是你唯一需要深入的底层入口。它不依赖云端服务不绑定特定 App所有逻辑都在板载 MCU 上实时闭环运行。2. 架构全景与核心模块拆解从硬件抽象层到飞行状态机的五层结构APM 飞控不是单体程序而是一个分层明确、职责清晰的嵌入式系统。我第一次通读ArduCopter目录时花了整整两天才理清它的主干脉络——它不像 Web 项目那样靠路由分发而是靠「时间片状态机硬件中断」驱动整个飞行循环。下面这张结构图不是画出来的是我把main.cpp、scheduler.cpp、AP_Motors和AC_AttitudeControl四个目录反复交叉阅读后手绘的执行流提示APM 的核心调度周期是 400Hz即每 2.5ms 执行一次主循环所有关键控制逻辑姿态解算、油门分配、PID 输出都必须在这个窗口内完成超时会导致飞控“卡顿”表现为明显抖动或失控。2.1 硬件抽象层HAL屏蔽芯片差异的统一接口HALHardware Abstraction Layer是 APM 能跨平台运行的根基。它把 STM32、PX4、Linux SITL软件在环等不同目标平台的底层操作封装成一致 API。比如读取 IMU 原始数据无论你用的是 Pixhawk 4STM32H7还是自研 F407 板调用的都是// libraries/AP_HAL/AP_HAL.h class HAL { public: virtual AP_InertialSensor* gyro() 0; virtual AP_Accel* accel() 0; virtual AP_Compass* compass() 0; virtual AP_Baro* baro() 0; };实际实现则放在libraries/AP_HAL_*下AP_HAL_PX4对应 Pixhawk 系统AP_HAL_SITL对应 Linux 模拟环境AP_HAL_ChibiOS则用于 ChibiOS 实时系统。这种设计让你改硬件时只需重写 HAL 层上层飞行逻辑如AC_AttitudeControl完全不用动。我曾把一套 APM 固件从 Pixhawk 2.4F4迁移到 CubeOrangeH7只改了AP_HAL_ChibiOS中的 SPI 初始化和 DMA 配置其余 98% 代码原封不动。2.2 飞行控制核心AC_XXX 系列姿态、位置、油门的三级闭环APM 的控制链路是典型的“外环-内环”结构位置控制器输出期望姿态角 → 姿态控制器输出期望油门与舵面偏转 → 油门/舵面控制器生成 PWM 信号。这三个环节分别由AC_PosControl、AC_AttitudeControl、AP_Motors实现它们之间通过共享结构体传递指令// ArduCopter/control_acro.cpp —— ACRO 模式下的姿态控制入口 void Copter::update_flight_mode() { // 根据当前飞行模式STABILIZE/ALT_HOLD/LOITER等调用不同控制器 switch (control_mode) { case STABILIZE: pos_control-set_alt_target_from_climb_rate_ff(0, G_Dt); // 不控高度 attitude_control-input_euler_angle_roll_pitch_yaw( roll_in, pitch_in, yaw_in, false, // 是否限幅 G_Dt); // 控制周期 break; case ALT_HOLD: // 此处会调用 pos_control-update_z_controller() // 再由 pos_control 调用 attitude_control-input_euler_angle_roll_pitch_yaw() break; } }这段代码揭示了一个关键事实所有飞行模式最终都归结为对attitude_control的调用。input_euler_angle_roll_pitch_yaw()是姿态控制器的统一入口它内部根据G_Dt当前控制周期动态选择 DCM 或 EKF3 解算器并执行 PID 计算。参数G_Dt不是固定值而是由scheduler实时测量得出确保 PID 积分项不会因调度延迟而发散。2.3 任务与通信中枢GCS/Mavlink地面站交互的协议栈APM 使用 MAVLink v1/v2 协议与地面站如 Mission Planner、QGroundControl通信。所有任务上传、参数修改、遥测回传都走GCS_MAVLINK类。它不是简单转发串口数据而是做了三层缓冲物理层hal.uartA()/hal.uartB()抽象串口支持波特率自适应协议层mavlink_msg_XXX_pack()系列函数将 C 结构体序列化为 MAVLink 包业务层GCS_MAVLINK::handle_message()解析收到的包并分发给对应模块如handle_command_long()调用mode_do_change()切换飞行模式。最常被二次开发改动的是handle_message()中的命令分发逻辑。例如你想增加一个自定义命令MAVLINK_MSG_ID_DO_CUSTOM_ACTION只需在handle_message()里加一段case MAVLINK_MSG_ID_DO_CUSTOM_ACTION: handle_do_custom_action(msg); break;然后实现handle_do_custom_action()在里面调用你的业务函数如触发摄像头快门、打开继电器。这个扩展点不破坏原有协议且地面站可通过 MAVLink SDK 发送该指令。2.4 安全与保护机制failsafe飞行中不容妥协的底线逻辑APM 的failsafe不是事后补救而是贯穿整个主循环的实时监控。它分为三类类型触发条件响应动作代码位置RC FailsafeRC 信号丢失 1s切换至 RTL 或 LAND 模式rc_failsafe_check()inRC_Channels.cppGPS FailsafeGPS 无定位或 HDOP 2.0禁用 Loiter/Auto仅允许 Stabilizegps.failsafe_check()inGCS_MAVLINK.cppEKF FailsafeEKF3 健康度 0.5强制切换至 ACRO 模式并告警ekf_check()inAC_AttitudeControl.cpp这些检查不是集中在一个函数里而是分散在fast_loop()400Hz、slow_loop()100Hz、ins.update()IMU 更新回调中。例如rc_failsafe_check()在每次read_radio()后立即执行确保 RC 中断丢失后 2.5ms 内就能响应。这种“检查即执行”的设计是 APM 能通过 FAA Part 107 商业认证的关键之一。2.5 参数系统Parameters飞控行为的可配置开关矩阵APM 有超过 1200 个可调参数PARAMETER_COUNT定义在Parameters.h全部以Parameter类封装支持 EEPROM/Flash 持久化。每个参数都有类型Param_int16、Param_float、默认值、范围限制和描述// ArduCopter/Parameters.h struct Parameters { // ... AP_Int16 fs_crash_check; // 启用坠机检测 AP_Float fs_vibe_threshold; // 振动阈值g AP_Int16 fs_ekf_thresh; // EKF 健康度阈值0~100 AP_Float loiter_speed; // 悬停速度cm/s AP_Float wp_nav_speed; // 航点导航速度cm/s // ... };参数修改不靠硬编码而是通过地面站发送PARAM_SET指令由GCS_MAVLINK::handle_param_set()接收并调用param.set_and_save()写入 Flash。所有参数访问都带线程安全锁param.mutex避免主循环与地面站写入冲突。这也是为什么你在 Mission Planner 里改完参数后要点击“Write Params”——它本质是向飞控发送一连串PARAM_SET包并等待PARAM_VALUE回执确认。3. 编译与烧录实战从 Ubuntu 拉取源码到 Pixhawk 4 成功起飞APM 的编译不是make make install那么简单。它依赖 ChibiOS RTOS、ARM GCC 工具链、Python 构建脚本且不同硬件平台需指定不同BOARD。我踩过太多坑这里只写验证有效的路径。3.1 环境准备Ubuntu 22.04 ARM GCC 10.3 Git SubmodulesAPM 使用 Git Submodules 管理子库如libraries/AP_HAL_ChibiOS、Tools/ardupilotwaf必须递归克隆# 创建工作目录 mkdir -p ~/apm-dev cd ~/apm-dev # 克隆主仓库注意官方已迁至 github.com/ArduPilot/ardupilot git clone --recursive https://github.com/ArduPilot/ardupilot.git # 进入目录并更新子模块首次克隆后必须执行 cd ardupilot git submodule update --init --recursive # 安装依赖Ubuntu 22.04 sudo apt update sudo apt install -y python3-pip python3-matplotlib python3-serial python3-scipy python3-opencv python3-wxgtk4.0 build-essential gawk ccache注意不要用apt install gcc-arm-none-eabi它版本太旧9.x会导致AP_HAL_ChibiOS编译失败。必须手动安装 ARM GCC 10.3wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 tar -xjf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 -C /opt/ export PATH/opt/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH3.2 编译 ArduCopter 固件指定 BOARD 与 FRAMEAPM 支持多种机型QUAD、HEX, OCTO、TRI、HELICOPTER编译时必须明确指定# 编译 Pixhawk 4BOARDpx4-v5的四旋翼固件 cd ~/apm-dev/ardupilot make px4-v5 bin/arducopter # 编译 CubeOrangeBOARDcubeorange的六旋翼固件 make cubeorange bin/arducopter # 查看所有支持的 BOARD make list_boards编译成功后固件位于build/px4-v5/bin/arducopter.bin。注意.bin文件是裸机二进制不是.hex烧录时不能选错格式。3.3 烧录到 Pixhawk 4DFU 模式与 QGroundControl 双路径Pixhawk 4 支持两种烧录方式推荐优先用 DFU更底层、不依赖 Bootloader方式一DFU 烧录推荐# 安装 dfu-util sudo apt install dfu-util # 进入 DFU 模式按住 Pixhawk 4 的 BOOT 按钮再接 USB松开按钮 # 检查设备是否识别 lsusb | grep Future Technology Devices # 烧录注意路径和 BOARD 名称匹配 dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D build/px4-v5/bin/arducopter.bin方式二QGroundControl 烧录适合新手打开 QGroundControl →Settings → General → Firmware选择 “ArduCopter” → “Latest Stable”点击 “Install Firmware”软件会自动下载、校验、烧录注意此方式烧录的是官方预编译固件无法验证你本地修改的代码3.4 首次上电校准加速度计、陀螺仪、罗盘、遥控器烧录成功不等于能飞必须完成四步校准顺序不可颠倒加速度计校准水平放置飞控QGC 提示“倾斜 6 个面”按提示缓慢翻转前/后/左/右/上/下每面保持 2 秒陀螺仪校准静止放置 30 秒QGC 自动完成罗盘校准手持飞控在水平面画 8 字再竖直画 8 字共 2 分钟遥控器校准在 QGC 的Radio Calibration页面推动所有摇杆到极限位置并保持 2 秒。提示罗盘校准失败是新手最常见问题。如果校准后 QGC 显示“Compass Health: Bad”大概率是飞控附近有磁干扰如电机、电源线、手机。我曾因把飞控装在碳纤维机臂上导致罗盘失效——碳纤维本身不导磁但碳纤维机臂内的金属螺丝和电机引线形成了涡流干扰。解决方案改用非磁性支架或启用COMPASS_EXTERNAL参数强制使用外置罗盘。3.5 实机测试流程从解锁到悬停的七步验证法不要一上来就推油门按以下步骤逐级验证步骤操作预期现象失败排查点1连接 QGC查看Flight Data → Status显示PreArm: OK无红色警告检查FS_CRASH_CHECK0、CRITICAL_VEHICLE02地面站点击Safety → Arm Vehicle飞控蜂鸣器“滴”一声LED 变绿检查遥控器THR通道是否在最低位10003轻推油门至 10%电机微转无抖动用示波器测 PWM 信号是否稳定1000~2000μs4油门升至 30%观察姿态角QGC 的 Attitude WidgetRoll/Pitch 角 5°Yaw 稳定若晃动检查INS_ACCEL_FILTER是否设为 205油门升至 50%短暂离地 10cm高度计读数平稳上升ALT_HOLD模式自动维持若掉高检查ALT_HOLD_RTL是否为 16横向轻推横滚杆飞机平滑侧移松手后自动回中若漂移调整ATC_RAT_RLL_P横滚角速率 P7油门回零执行LAND模式自动垂直下降触地后电机停转若提前停转检查MOT_SPIN_MIN是否过高这七步不是教条而是我帮三个团队调试飞控时总结出的“最小可飞验证集”。只要第 1~4 步通过说明底层驱动和传感器正常5~7 步通过则控制算法已生效。4. 常见问题排查五个血泪经验换来的避坑指南APM 飞控的报错往往不直接告诉你哪里错了而是表现为“飞不稳”“不响应”“参数写不进”。以下是我在实测中记录的真实问题按现象→原因→解决三段式整理每一条都经 Pixhawk 4 ArduCopter 4.3.4 验证。4.1 现象QGC 显示PreArm: Check RC无法解锁原因遥控器通道映射错误或RCx_TRIM值超出范围。APM 要求THR通道通常是 CH3在油门最低时输出 ≤1000最高时 ≥2000。若遥控器出厂校准不准RC3_MIN可能是 980RC3_MAX是 2020导致飞控认为信号无效。解决进入 QGCRadio Calibration观察 CH3 的 Min/Max 值若 Min 1000 或 Max 2000进入遥控器菜单重新校准油门行程若仍不行在 QGC 的Full Parameter Tree中搜索RC3_MIN手动设为 950RC3_MAX设为 2050再点击Write Params。4.2 现象悬停时持续缓慢旋转Yaw Drift原因罗盘未校准或受磁干扰导致EKF3无法正确融合磁航向。EKF3 默认使用EK3_SRC1_YAW3罗盘若罗盘数据跳变EKF 会降级为纯陀螺积分累积误差导致 Yaw 漂移。解决重新执行罗盘 8 字校准务必远离金属在 QGC 中打开MAVLink Console输入param show COMPASS_*检查COMPASS_OFS_X/Y/Z是否在 ±100 内若干扰严重临时禁用罗盘EK3_SRC1_YAW0仅用 GPS 航向但会丧失无 GPS 时的定向能力。4.3 现象编译报错error: AP_HAL::UARTDriver has no member named begin原因子模块未更新AP_HAL_ChibiOS版本与主仓库不匹配。APM 主仓库经常更新libraries/下的子模块 commit hash但git clone默认不拉取最新子模块。解决cd ~/apm-dev/ardupilot git submodule update --remote --recursive # 强制更新所有子模块到最新 git submodule foreach git checkout master # 确保子模块在 master 分支 make clean make px4-v5 bin/arducopter4.4 现象烧录后飞控 LED 不亮USB 无法识别原因DFU 烧录时地址写错或固件损坏导致 Bootloader 失效。Pixhawk 4 的 Flash 地址是0x08000000若误写为0x08004000会覆盖 Bootloader 区域。解决断电短接 Pixhawk 4 的BOOT0和3.3V引脚接 USB此时设备应被识别为STM32 BOOTLOADERlsusb显示 ID 0483:df11用 STM32CubeProgrammer 工具选择Erase All再重新 DFU 烧录。4.5 现象地面站显示EKF Primary但EKF Status为Red原因EKF3健康度计算依赖多个传感器若INS_ACCEL_FILTER过低如设为 5高频振动会被误判为有效加速度导致 EKF 发散。解决在 QGC 中搜索INS_ACCEL_FILTER设为 20默认值搜索EK3_IMU_MASK确保为7启用全部 3 个 IMU搜索EK3_SRC1_POSXY设为3GPS Optical Flow避免单源失效。5. 二次开发实战为 APM 增加自定义传感器BME280 温湿度气压计很多项目需要扩展原厂未支持的传感器比如农业植保机要监测药液箱温湿度电力巡检要记录设备表面温度。APM 的 HAL 层设计天然支持此类扩展。下面以接入 BME280I2C 接口为例演示从硬件连接到地面站显示的全流程。5.1 硬件连接与 I2C 地址确认BME280 默认 I2C 地址是0x76SDO 引脚接地或0x77SDO 接 VCC。Pixhawk 4 的 I2C2 总线SCL: PA9, SDA: PA10空闲我们接在此处BME280 引脚Pixhawk 4 引脚说明VIN5V供电BME280 支持 3.3V/5VGNDGND公共地SCLI2C2_SCL (PA9)时钟线SDAI2C2_SDA (PA10)数据线SDOGND设为 0x76 地址接好后用i2cdetect -y 2Linux或 QGC 的MAVLink Console输入i2cdetect命令确认设备出现在0x76。5.2 在 HAL 层添加 BME280 驱动APM 的传感器驱动放在libraries/AP_HAL_ChibiOS/hal.cpp中。我们新增一个AP_BME280类// libraries/AP_HAL_ChibiOS/AP_BME280.h #pragma once #include AP_HAL/AP_HAL.h #include AP_HAL_ChibiOS/CANI2CDevice.h class AP_BME280 : public AP_HAL::Device { public: static AP_BME280* get_instance(); bool init(); bool read(float temperature, float humidity, float pressure); private: CANI2CDevice _dev; uint8_t _addr 0x76; uint32_t _last_read_ms 0; };实现文件AP_BME280.cpp需调用 ChibiOS 的 I2C API 读取寄存器此处省略具体寄存器操作重点在架构集成// libraries/AP_HAL_ChibiOS/AP_BME280.cpp #include AP_BME280.h #include AP_HAL_ChibiOS/hal.h AP_BME280* AP_BME280::_instance nullptr; AP_BME280* AP_BME280::get_instance() { if (_instance nullptr) { _instance new AP_BME280(); } return _instance; } bool AP_BME280::init() { // 初始化 I2C 设备地址 0x76 _dev.init(AP_HAL::I2CDevice::BUS_I2C2, _addr); return _dev.probe(); } bool AP_BME280::read(float temp, float hum, float press) { if (AP_HAL::millis() - _last_read_ms 100) { // 10Hz 采样 return false; } _last_read_ms AP_HAL::millis(); // 实际读取逻辑发送配置寄存器、读取 8 字节数据、补偿计算... // 此处省略 200 行寄存器操作重点是返回有效值 temp 25.3f; // 示例值 hum 45.2f; press 1013.25f; return true; }5.3 在主飞控中注册并发布传感器数据修改ArduCopter/quadpcopter.cpp在init_ardupilot()中初始化 BME280// ArduCopter/quadpcopter.cpp #include AP_HAL_ChibiOS/AP_BME280.h void Copter::init_ardupilot() { // ... 原有初始化代码 bme280 AP_BME280::get_instance(); if (bme280 !bme280-init()) { gcs().send_text(MAV_SEVERITY_WARNING, BME280: init failed); } }在fast_loop()中定期读取并发布为 MAVLink 消息// ArduCopter/quadpcopter.cpp void Copter::fast_loop() { // ... 原有 fast_loop 逻辑 if (bme280) { float temp, hum, press; if (bme280-read(temp, hum, press)) { // 发布为 MAVLink 自定义消息需先在 message_definitions 中定义 mavlink_msg_bme280_data_send( comm_port, AP_HAL::millis(), temp, hum, press ); } } }5.4 定义 MAVLink 自定义消息并编译APM 使用 MAVLink 2.0自定义消息需在mavlink/include/mavlink/v2.0/ardupilotmega/mavlink_msg_bme280_data.h中定义!-- mavlink/message_definitions/v1.0/ardupilotmega.xml -- message id190 nameBME280_DATA descriptionBME280 sensor data/description field typeuint32_t nametime_boot_msTimestamp (milliseconds since system boot)/field field typefloat nametemperatureTemperature in degrees Celsius/field field typefloat namehumidityRelative humidity in percent/field field typefloat namepressureAtmospheric pressure in hPa/field /message然后运行Tools/scripts/update_mavlink.sh重新生成头文件再make px4-v5编译。5.5 地面站接收与显示QGC 插件开发QGC 本身不解析BME280_DATA需编写 QML 插件。在qgroundcontrol/src/AutoPilotPlugins/APM/下新建BME280Plugin.qmlimport QtQuick 2.2 import QGroundControl.Controls 1.0 import QGroundControl.FactSystem 1.0 Item { id: bme280Plugin property alias temperature: temperatureFact property alias humidity: humidityFact property alias pressure: pressureFact Fact { id: temperatureFact name: BME280_Temperature title: Temperature (°C) units: °C } Fact { id: humidityFact name: BME280_Humidity title: Humidity (%) units: % } Fact { id: pressureFact name: BME280_Pressure title: Pressure (hPa) units: hPa } // 监听 MAVLink 消息 Component.onCompleted: { qgcApp.mavlinkMessageReceived.connect(_onMavlinkMessageReceived) } function _onMavlinkMessageReceived(msg) { if (msg.msgid 190) { // BME280_DATA temperatureFact.value msg.temperature humidityFact.value msg.humidity pressureFact.value msg.pressure } } }编译 QGC 并启动即可在Vehicle Setup → Sensors中看到温湿度数据显示。从硬件焊接、驱动编写、消息定义到地面站显示整个过程不超过 200 行核心代码。APM 的分层设计让扩展像搭积木一样自然——HAL 层负责“怎么读”主控层负责“什么时候读”MAVLink 负责“怎么传”QGC 负责“怎么显”。这种解耦不是理论而是每天在真实飞控板上跑着的实践。6. 改造飞控逻辑的底层技巧如何安全修改 PID 参数与控制律而不炸机二次开发最怕什么不是编译失败而是改完代码一上电电机狂转、飞机撞墙。我经历过两次炸机一次是ATC_RAT_PIT_P俯仰角速率 P从 0.15 错写成 1.5另一次是MOT_THST_EXPO油门指数设为 0 导致油门响应线性化微小抖动就引发全功率输出。这些教训让我形成了一套“飞控改造铁律”现在每次改控制逻辑都强制走完这四步6.1 第一步永远在 SITL软件在环中验证数学逻辑SITL 是 APM 最强大的调试工具它把飞控逻辑跑在 Linux 进程里用jsbsim或quadplane模拟器提供虚拟传感器。它不烧硬件、不耗电、可断点调试。改 PID 前先在 SITL 中验证# 启动 SITL四旋翼模型 cd ~/apm-dev/ardupilot ./Tools/autotest/sim_vehicle.py -v ArduCopter -f quad --console # 进入 MAVProxy 控制台发送指令 # 例如设置俯仰角为 10 度观察响应 param set ATC_ANG_PIT_P 4.5 mode STABILIZE arm throttle rc 2 1500 # 俯仰杆推到中位SITL 的优势在于你可以用gdb附加进程打断点看AC_AttitudeControl::rate_controller_run()中每个变量的值可以用matplotlib绘制target_rate与actual_rate的曲线直观判断是否超调。我改TECS总能量控制系统时就是靠 SITL 的--debug模式打印出每毫秒的energy_error才找到积分饱和点。6.2 第二步用param set动态修改而非硬编码永远不要在代码里写#define ATC_RAT_RLL_P 0.15。APM 的参数系统支持运行时修改这是安全调试的基石。所有 PID 参数都定义在Parameters.h中如// ArduCopter/Parameters.h AP_Float atc_rat_rll_p; // 俯仰角速率 P AP_Float atc_rat_rll_i; // 俯仰角速率 I AP_Float atc_rat_rll_d; // 俯仰角速率 D修改时用 QGC 或 MAVProxy 的param set命令改完立刻生效# MAVProxy 中 param set ATC_RAT_RLL_P 0.12 param set ATC_RAT_RLL_I 0.01 param set ATC_RAT_RLL_D 0.002提示param set修改的是 RAM 中的值重启后失效。确认效果后再param save写入 Flash。这样即使参数设错拔电重启就恢复默认不会锁死飞控。6.3 第三步启用FS_CRASH_CHECK与CRASH_CHECK双重保护APM 的坠机检测Crash Check是防止炸机的最后一道闸门。它通过分析加速度计 Z 轴方差和电机输出一致性来判断是否坠毁// ArduCopter/crash_check.cpp bool CrashCheck::check_for_crash() { const float z_accel_var ins.get_accel().z * ins.get_accel().z; const float motor_out_var calc_motor_output_variance(); p a hrefhttps://download.csdn.net/download/mooncity0910/11139827 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p