01飞控板概述
1.1 ZP-MH743 飞控简介与定位
ZP-MH743 是一款基于 STM32H743 旗舰级微控制器打造的高性能无人机飞控平台,全面兼容 Betaflight、INAV、MissionPlanner 与 QGroundControl 四大主流地面站生态,无论是追求毫秒级响应的 FPV 竞速飞手、需要稳定悬停与航拍流畅度的创作者,还是从事自主导航算法验证与行业应用的科研团队,都能在这块板上找到得心应手的工具。其强劲的运算核心配合灵活的固件选择,让您既能享受超低延迟的操控快感,也能轻松规划复杂航线、执行自主任务——从竞技场到实验室,ZP-MH743 都能以“一板通吃”的实力覆盖全场景需求。
硬件配置上,ZP-MH743 集成了BMI088+BMI270双冗余高精度工业级 IMU,配合SPA06高灵敏度气压计、QMC5883P地磁计和AT456E板载 OSD 芯片,构成完整的多维感知体系,即便在剧烈机动或强干扰环境下也能提供可靠姿态与位置参考,为飞行安全筑牢双重保障。板载 MicroSD 卡槽支持大容量高速黑匣子记录,相比传统板载 Flash,在存储空间和读写速度上拥有明显优势,为后期调参、故障诊断和科研数据采集提供充足的“飞行记忆”。供电方面,独立设计的 5V 与 10V 双路大电流BEC 模块,能够为图传、GPS、云台等外设提供稳定干净稳定的电源,有效降低系统干扰;而 USB Type‑C 接口、独立 SWD 调试口、蓝牙无线调参模块,以及多路 SH1.0 标准连接器和 IO1~IO4通用扩展引脚,则让固件刷写、参数微调、外设接入和底层开发变得异常灵活,既便于玩家快速上手,也满足了科研机构对硬件可定制性和调试便利性的严苛要求。
飞控板采用业界标准的 35×35mm 安装孔距(对角线 30.5×30.5mm),完美适配绝大多数机架,换装零门槛;正面核心器件与背面电源存储的分层布局,有效隔离热源与敏感元件,配合先进的工艺水准,在紧凑体积下兼顾了稳定性与可靠性。ZP-MH743飞控以双 IMU 冗余、丰富的扩展接口、大容量存储和全生态兼容性,将高端飞控的实用价值拉满。无论您是执着于操控手感的发烧友,还是追求数据精度与系统开放性的研究者,这块飞控板都将以扎实的用料和均衡的性能,成为您每一次升空背后最值得信赖的伙伴。
1.2 ZP-MH743硬件规格
主控与传感器
| 主控芯片 | STM32H743 |
|---|---|
| 内核架构 | ARM Cortex-M7 |
| 主频 | 480 MHz |
| RAM | 1 MB |
| Flash | 2 MB |
| IMU | BMI088+BMI270 |
| 气压计 | SPA06 |
| 磁力计 | QMC5883P |
| OSD | AT7456E |
| 黑匣子 | SD 卡 |
接口功能
| USB | 1路Type-C |
|---|---|
| UART | 8路(UART8被蓝牙占用) |
| PWM | 10路 |
| IIC | 1路 |
| SWD | 1路 |
| CAN | 1路 |
| ADC | 2路 |
| 高清图传 | 支持DJI O3/O4直插 ,支持 DisplayPort |
| 接收机 | 默认为UART6 |
| 其他 | 扩展IO焊盘、蜂鸣器、串行 LED、BOOT 按键 |
| 固件支持 | Betaflight / INAV / PX4/ ArduPilot |
电源与结构尺寸
| 供电输入 | 2–8S,6–36 V |
|---|---|
| 5 V BEC | 最大 3 A,为接收机、GPS、光流等外设供电 |
| 12 V BEC | 最大 3 A,为高清图传、摄像头等外设供电 |
| 飞控尺寸 | 40.1mm x 40.1mm |
| 安装孔距 | 30.5 mm× 30.5 mm |
| 安装孔直径 | 4 mm |
1.飞控板请使用 30.5×30.5mm 孔位进行固定,安装时请确保螺丝及垫片不与板面任何元器件发生接触,以免造成短路或物理损伤。 2. 建议搭配减震柱使用,并均匀锁紧四角,避免因局部受力不均导致板体弯曲,影响传感器精度。 3. 飞控板上的箭头标识应指向机头方向;若因机架结构限制需旋转安装,请在飞控固件中相应调整姿态方向参数,确保姿态解算与实际朝向一致。 4. 安装时请注意飞控板与电调(ESC)之间保持适当距离(建议至少 5mm),避免电调产生的强磁场对板载磁力计造成干扰,影响航向判断。 5. 若机架为碳纤材质,建议在飞控板与机架之间加装绝缘垫片或贴覆绝缘胶带,防止碳纤导电导致意外短路。 6. 所有连接线束应预留适当松弛度,避免绷紧;线束绷紧会将机架振动直接传导至飞控板,降低减震效果。 7. 安装完成后,请手动轻晃机架确认飞控板无松动,并检查各连接器是否因安装位置干涉而出现受力或脱落风险。
1.3 STM32H743 主控芯片性能特点(Cortex-M7, 480MHz, 1MB RAM, 2MB Flash)
ZP-MH743 飞控板选择 STM32H743 作为核心主控,正是看中了它在飞控应用场景下无可比拟的性能优势。这颗芯片基于 Arm Cortex-M7 内核,最高运行频率可达 480MHz,提供 2424 CoreMark 与 1027 DMIPS 的处理能力——对比 F4 系列(约 608 CoreMark)和 F7 系列(约 1082 CoreMark),几乎是倍数级的性能跃升。对于飞控而言,更强的算力直接意味着更从容的滤波处理、更流畅的姿态解算,以及更充裕的资源来运行 GPS 导航、光流定位等复杂任务。即便同时开启多个高级功能,系统依然游刃有余,不必担心卡顿或延迟。
在飞控最核心的姿态解算环节,STM32H743 内置的双精度浮点单元(FPU)发挥了关键作用。传统的 F4 系列仅支持单精度浮点运算,在处理卡尔曼滤波、惯导解算等高精度算法时,精度和速度都受到一定限制。STM32H743 的双精度 FPU 则能以硬件方式加速这些运算,让飞控的姿态解算更加精准,传感器融合更加平滑,无论是悬停稳定性还是高速机动中的操控手感,都能获得实实在在的提升。
存储资源方面,STM32H743 拥有 2MB Flash 和 1MB SRAM,相比 F4 系列的 192–256KB 和 F7 系列的 512KB,容量大幅增加。对于普通玩家来说,更大的内存意味着黑匣子可以记录更长时间的高频数据,调参时能看到更完整的飞行细节;对于进阶用户而言,充足的存储空间也为运行更复杂的固件(如带完整导航功能的 INAV)和多任务并行处理提供了硬件基础。此外,STM32H743 还集成了 192KB 的 TCM 紧耦合内存,专门用于处理最核心的实时任务,确保飞控在关键时刻的响应绝无延迟。
能效方面,STM32H743 的动态功耗效率相比 F7 系列提升了两倍,运行发热更低。这意味着在长时间飞行或高温环境下,飞控板能保持更稳定的工作状态,减少因过热导致的性能下降或意外重启风险。扩展性上,STM32H743 提供了丰富的高速通信接口,可以轻松挂载各类外设传感器。总而言之,STM32H743 带来的不仅是“跑分”上的领先,更是在实际飞行中能真切感受到的操控精度、系统稳定性和功能扩展潜力,让 ZP-MH743 成为一块既能满足当下需求、又能应对未来挑战的飞行平台。
02硬件接口与引脚定义
2.1 板载接口总览(正反面布局图解)
ZP-MH743飞控板采用双面贴片工艺,将丰富的功能接口合理分布在 PCB 的正面和反面。正面主要集成了传感器、OSD、MicroSD卡槽、LDO及部分连接接口,反面则主要布设BEC电源、核心处理芯片、蓝牙芯片、CAN收发器等。这种布局方式在保证功能完整性的同时,有效地利用了有限的 PCB 面积。


在实际安装和维护过程中,建议用户在装机前先仔细辨认各接口的位置和功能,避免因空间紧凑而导致的误接。尤其是在机架内部空间有限的情况下,应提前规划好各线缆的走线路径,确保 USB Type-C 接口和 MicroSD 卡槽留有足够的外部访问空间,以便日后进行固件更新和数据导出。
2.2 USB Type-C 接口(USB1)功能说明
ZP-MH743 配备的 USB Type-C 接口(标记为 USB1)是用户与飞控交互的最主要物理通道。该接口支持 USB 2.0 Full-Speed(12Mbps)通信协议,通过 STM32H743 内置的 USB OTG FS 控制器实现与上位机(PC 或移动设备)的数据通信。USB Type-C 接口的采用相比传统的 Micro-USB 接口具有正反可插拔、机械耐久性更强(支持 10000 次插拔)的优势,在日常使用中更为方便。
USB Type-C 接口在飞控中承担以下核心功能:
1. 固件刷写:通过将飞控置于 DFU(Device Firmware Upgrade)模式或 BOOT 模式,用户可以使用 STM32CubeProgrammer、Betaflight Configurator、INAV Configurator 等工具将新的固件镜像烧录到飞控的 Flash 存储器中。DFU 模式通常通过飞控上的 BOOT 按键触发——先按住 BOOT 键不放,再插入 USB 线缆,飞控即进入 DFU 等待模式。
2. 参数调校:在正常运行模式下,USB 接口虚拟出一个串口(VCP,Virtual COM Port),地面站软件通过该虚拟串口与飞控进行 MSP(Multiwii Serial Protocol)或 MAVLink 协议通信,实现飞行参数的实时读取和修改。用户可以在地面站上调整 PID 参数、设置电机转向、配置传感器校准等。
3. 黑匣子数据下载:当飞控使用板载 Flash 存储黑匣子数据时,用户可以通过 USB 接口将数据下载到电脑进行分析。如果使用 SD 卡记录,则建议直接取出 SD 卡通过读卡器导出,速度更快。
实用提示:在使用 USB 连接飞控时,建议使用质量可靠的数据线(而非仅充电线),否则可能出现上位机无法识别设备的问题。部分劣质线缆的 D+/D- 数据线阻抗不匹配,会导致通信不稳定甚至无法建立连接。此外,在使用 Windows 系统时,可能需要安装 STM32 VCP 驱动或 Zadig 驱动(用于 DFU 模式),建议用户提前准备好驱动环境。
2.3 仿真接口(SWDIO / SWCLK)使用说明
ZP-MH743 板载一组丝印标记为 SWD 的标准仿真调试接口,为开发者提供底层硬件级调试通道,可直接对接 ST‑Link 或 J‑Link 等主流调试器,实现代码单步跟踪、寄存器读写与固件在线烧录,极大便利飞控底层开发与深度问题排查。
调试串口的主要应用场景包括:
- 飞控固件开发与调试:开发者可使用 ST-Link 或 J-Link 调试器,通过 SWD 接口对 STM32H743 进行单步执行、断点设置和寄存器实时监控,快速定位固件 Bug,优化控制算法执行效率,大幅提升开发迭代速度。
- 底层硬件功能验证:在产品原型阶段或外设驱动开发时,可通过 SWD 接口直接访问芯片内部寄存器,验证 GPIO、SPI、UART、I2C 等外设接口的电气行为与通信时序是否符合预期,确保硬件设计无误。
- 飞控系统故障深度排查:当飞控出现异常重启、死机或传感器读数异常等疑难问题时,通过 SWD 接口抓取内核运行状态和内存数据,分析故障现场,精准定位问题根源,比仅依赖日志输出更具深度和可靠性。
- 科研与教学实验平台:对于高校或研究机构,SWD 接口提供了底层硬件与软件结合的教学入口,学生可借助调试器深入理解 ARM 内核运行机制、实时操作系统任务调度以及飞控底层实现原理,是嵌入式系统教学的极佳平台。
2.4 PWM输出接口
ZP-MH743 支持最多 11路电机/电调输出(PWM11用以穿行LED功能)。这些输出通道可以驱动各类电子调速器(ESC),PWM1-8支持双向Dshot。在标准四旋翼配置下,通常使用 PWM1-4四个通道;六旋翼使用PWM1-6;八旋翼则使用 PWM1-8通道。多余的通道也可以被重新配置为伺服舵机输出,用于控制云台俯仰、起落架收放等辅助功能。
2.5 PWM 定时器分组:
| 分组 | 通道 | 说明 |
|---|---|---|
| 第 1 组 | PWM1、PWM2、PWM3、PWM4 |
同组通道通常需要使用兼容的输出协议/频率 |
| 第 2 组 | PWM5、PWM6 |
同组约束 |
| 第 3 组 | PWM7、PWM8、PWM11 |
PWM11 同时用于串行 LED 功能 |
| 第 4 组 | PWM9、PWM10 |
同组约束 |
注意:同一定时器组内的通道通常不能任意混用不同输出协议。
2.6 电调协议:
- 普通 PWM 电调:选择固件支持的标准 PWM 协议。
- DShot 电调:通常优先使用
Dshot300或者Dshot600。 - 双向 DShot:需要飞控固件和电调固件同时支持。
注意:PX4 与 INAV 暂不支持双向 DShot
2.7 接收机
UART6 默认配置为 RC 输入接口, 如有需要可以配置到其他 UART。
| 协议 | 建议接线 | 备注 |
|---|---|---|
| SBUS | UART6-RX |
通常只需单向信号线与 GND/供电 |
| DSM / SRXL | UART6-RX |
通常只需单向信号线与 GND/供电 |
| FPort | UART6-TX |
通常只需单向信号线与 GND/供电 |
| CRSF / ELRS | UART6-TX UART6-RX TX与RX交叉连接 |
可自动传输遥测 |
| SRXL2 | UART6-TX |
ArduPilot 下设置 SERIAL6_OPTIONS = 4 |
2.8 UART 串口映射
ArduPilot 串口映射
| ArduPilot 端口 | 物理接口 | 默认用途 / 特性 |
|---|---|---|
| SERIAL0 | USB | USB 虚拟串口 |
| SERIAL1 | UART1 |
MAVLink2,支持 DMA |
| SERIAL2 | UART2 |
DisplayPort,支持 DMA |
| SERIAL3 | UART3 |
GPS,支持 DMA |
| SERIAL4 | UART4 |
MAVLink2,支持 DMA |
| SERIAL5 | UART5 |
支持 DMA |
| SERIAL6 | UART6 |
RC 输入,支持 DMA |
| SERIAL7 | UART7 |
电调遥测,支持 DMA |
| SERIAL8 | UART8 |
板载蓝牙数传,支持 DMA |
PX4 串口映射
| PX4 设备 | PX4 接口名 | 物理接口 |
|---|---|---|
| ttyACM0 | USB | USB 虚拟串口 |
| ttyS0 | TELEM1 |
UART1 |
| ttyS1 | GPS2 | UART2 |
| ttyS2 | GPS1 | UART3 |
| ttyS3 | TELEM2 |
UART4 |
| ttyS4 | TELEM3 |
UART5 |
| ttyS5 | RC | UART6 |
| ttyS6 | URT6 | UART7 |
| ttyS7 | TELEM4/SERIAL4 |
UART8 |
2.9 I²C / SPI / CAN 总线接口
ZP-MH743 通过 SH1.0mm连接器引出了 I²C 和 CAN 接口,为各类高速和低速外设的连接提供了全面支持。
I²C 总线:ZP-MH743 通常将一组 I²C 总线引出至外部连接器,用于连接外置磁力计(如 QMC5883L、HMC5883L、IST8310 等)和其他 I²C 传感器。I²C 总线采用 SDA(数据线)和 SCL(时钟线)两线制,支持多设备共享同一总线(通过不同的 7 位地址区分),标准模式速率为 400kHz(Fast Mode)。SDA 和 SCL 线路上已集成4.7kΩ 上拉电阻,但是如果总线上的设备较多或线路较长,可能需要降低总线速率以确保通信稳定性。
CAN 总线:ZP-MH743 将 CAN 总线接口引出至外部连接器,为高端用户提供了工业级的通信扩展能力,可扩展 CAN GPS 模块、CAN 电调(如 APD U-Series CAN ESC)、CAN 空速管等(需要固件支持)。
2.10 MicroSD 卡槽用途与选型建议
ZP-MH743 背面的 MicroSD 卡槽(CARD1)通过SDIO 接口与 STM32H743 主控芯片相连,为飞控提供了可扩展的大容量数据存储方案。该卡槽在飞控应用中承担以下核心功能:
黑匣子飞行数据记录:黑匣子(Blackbox)是飞控中用于记录飞行过程中各种参数的数据记录器,类似于民航客机上的"黑匣子"。记录的数据包括:陀螺仪和加速度计原始数据、PID 控制器输出值、电机转速指令、遥控器输入值、GPS 位置信息、电池电压/电流等。这些数据以高采样率(通常 1kHz–8kHz)连续记录,数据量巨大。使用 MicroSD 卡记录相比板载 Flash 记录具有明显优势:容量更大(一张 8GB 卡可以记录数十小时的飞行数据)、读取更方便(直接拔卡通过读卡器拷贝)、不会占用固件存储空间。 航点任务存储:在使用 INAV 或 ArduPilot 等支持自主航点飞行的固件时,航点任务数据(包含数十甚至上百个航点的经纬度、高度、速度等参数)可以存储在 SD 卡上,便于任务的导入导出和反复使用。
SD 卡选型建议:
| 参数 | 推荐规格 | 说明 |
|---|---|---|
| 容量 | 4GB–32GB | SDHC 规格即可,过大容量可能不被固件识别 |
| 速度等级 | Class 10 / UHS-I | 满足高采样率黑匣子写入需求 |
| 格式 | FAT32 | 大部分飞控固件仅支持 FAT32 文件系统 |
| 品牌 | 闪迪(SanDisk)、三星(Samsung)、金士顿(Kingston) | 选择可靠品牌,避免使用杂牌卡 |
| 类型 | microSDHC | 注意不要购买 SDXC(64GB 及以上),默认格式为 exFAT,不兼容 |
实用提示:在使用 SD 卡前,建议先在电脑上格式化为 FAT32 格式(分配单元大小选择 4096 字节/簇)。部分大容量 SD 卡(64GB 及以上)出厂格式为 exFAT,飞控固件可能无法识别。此外,SD 卡在高频振动环境下可能出现接触不良的问题,建议在装机时使用一小片海绵或双面胶对 SD 卡进行辅助固定,防止飞行中因振动导致卡槽松动和数据丢失。定期检查 SD 卡的剩余空间并清理旧数据,避免因存储空间不足而导致黑匣子记录中断。
2.11 电压检测
板载电池电压检测分压比例为1:21。
03外围传感器与模块
3.1 IMU(陀螺仪/加速度计)型号与特性
IMU(Inertial Measurement Unit)惯性测量单元是飞控系统中最为关键的传感器,直接决定了飞行器姿态感知的精度和响应速度。ZP-MH743 集成了双冗余高精度工业级 IMU,集成了三轴陀螺仪和三轴加速度计,能够实时测量飞行器相对于惯性空间的角速度和加速度信息。ZP-MH743搭载以下IMU芯片:
BMI088: BMI088是博世专门为无人机和机器人等严苛应用环境打造的高性能 IMU。其核心陀螺仪源自博世成熟的汽车技术,具备低于 2°/h 的出色偏置稳定性和低于 15 mdps/K 的低温度偏移系数,即使在较大温度变化下也能保持低噪音和低漂移特性。加速度计支持高达 ±24g 的宽测量范围,有效避免强机动下的信号截断。BMI088 采用双芯片分立架构(加速度计与陀螺仪独立芯片),拥有卓越的振动抑制能力,能够有效抑制来自电机和旋翼的高频振动干扰——对于飞控而言,这意味着在剧烈机动或强风环境下,飞控依然能获得干净、稳定的姿态数据,为精准控制奠定坚实基础。
BMI270:BMI270则代表了另一种技术路线——在保证高性能的同时追求极致功耗与集成度。作为 BMI260 系列成员,BMI270 同样采用博世汽车验证的陀螺仪技术,并集成了行业首个静止 CRT(组件重新调整)自校准功能,可自动补偿焊接应力带来的漂移。其显著改进在于整体加速度计性能——极低的零 g 偏移和灵敏度误差、低温漂移以及对 PCB 应力的稳健性。功耗方面,BMI270 在全速输出数据率下典型电流低于 700μA,约为 BMI088 的三分之一。对于 FPV 竞速等追求轻量化与长续航的场景,BMI270 的低功耗特性是一大加分项;而硬件内置的低通抗混叠滤波器则能有效滤除高频噪声,输出更干净的数据,配合 ZP-MH743 强大的 STM32H743 算力,能够在调参时大幅简化滤波配置、提升飞行手感。
两颗传感器各有所长:BMI088 以汽车级 robustness 和卓越抗振性,成为高振动环境下的“工业级坦克”;BMI270 则以低功耗、高集成度和自校准特性,为追求效率与响应速度的场景提供理想选择。ZP-MH743 将两者集成于一身,双冗余设计不仅提升了系统容错能力,更让玩家可以在不同飞行风格和应用场景中自由发挥——无论是重载续航还是竞速穿越,这块飞控板都能提供最可靠的姿态感知基石。
实用提示:在首次使用前,务必执行陀螺仪校准——将飞行器放置在水平且稳定的表面上,通过地面站软件触发校准程序。校准过程中请勿触碰或移动飞行器,否则校准结果将不准确,可能导致飞行器在飞行中出现持续漂移或自旋。此外,如果更换了机架或改变了电机的安装方式,建议重新执行陀螺仪校准和加速度计水平校准。
3.2 气压计
气压计(Barometer)是飞控系统中用于测量大气压力并据此估算飞行高度的传感器。ZP-MH743 搭载了SPA06数字气压计芯片。
ZP-MH743 飞控板搭载新款歌尔(Goertek)SPA06 高精度数字气压传感器,测量范围覆盖 300~1100hPa(从海平面以下至海拔 9000 米),绝对精度达 ±0.3hPa,相对精度更是高达 ±0.03hPa(约 ±0.25 米),为飞控系统提供分米级的高度分辨能力。在无人机应用中,这意味着定高悬停稳如磁石吸附、自主航线飞行时的爬升与下降平滑精准,无论是航拍创作还是 FPV 穿越,高度控制都更加从容可信。
相较于上一代 SPL06,SPA06 实现了两项核心突破:一是精度大幅跃升——绝对精度从 ±1hPa 提升至 ±0.3hPa(提升超 3 倍),相对精度从 ±0.06hPa 提升至 ±0.03hPa(提升 2 倍),高度误差从米级缩小至分米级,定高与航线规划能力的提升在实际飞行中感知明显;二是功耗进一步优化——待机电流从 1μA 降至 0.5μA(降低 50%),配合更高效的 FIFO 数据缓存机制,主控芯片可在两次气压读取之间保持休眠,在长续航飞行中更能体现能效优势。两项提升共同发力,让 ZP-MH743 的气压感知系统在精度与续航两个维度上同时迈上新台阶。
气压计的工作原理基于大气压力随海拔高度升高而降低的物理规律(在海平面附近,每升高约 8.5m 大气压降低约 1hPa)。飞控固件通过读取气压计的压力值并结合温度补偿算法,计算出相对于起飞点的相对高度。需要注意的是,气压高度测量容易受到以下因素的干扰:(1)气流扰动——高速飞行时气流对气压计进气口的冲击会产生虚假的压力变化;(2)温度漂移——气压计对温度敏感,快速升降过程中环境温度的变化会影响测量精度;(3)阳光直射——阳光直接照射气压计芯片会导致温度读数异常,进而影响高度计算。因此,飞控 PCB 上的气压计通常配备有金属遮光罩或透气海绵覆盖,既防止光线直射又保证气压传递。
在使用气压计进行高度保持(Altitude Hold)飞行时,建议用户在起飞前等待 30 秒至 1 分钟让气压计读数稳定后再解锁起飞,以获得更准确的高度基准值。
3.3 磁力计/罗盘(内置与外置)
磁力计(Magnetometer),也称为电子罗盘,用于测量地球磁场的方向和强度,为飞控提供飞行器的航向(Heading)信息。航向信息在 GPS 导航和自主返航等应用中至关重要——飞控需要知道飞行器的朝向才能正确地执行航线飞行和返航操作。ZP-MH743 板载QMC5883P磁力计。
ZP-MH743 飞控板选用上海矽睿科技(QST)QMC5883P 作为板载三轴地磁传感器。该芯片基于先进的各向异性磁阻(AMR)技术,将磁传感器与信号调理 ASIC 集成于一颗 3.0×3.0×0.9mm³ 的微型封装内,搭载 16 位 ADC,磁场分辨率达 2 毫高斯,可实现 1° 至 2° 的罗经航向精度;磁场测量范围宽达 ±30 高斯,远超市面同类产品常见的 ±8 高斯量程。内置温度补偿功能可在 -40°C 至 +85°C 的宽温范围内自动维持灵敏度一致性,I2C 接口支持最高 1.5kHz 的数据输出频率,为飞控系统提供高速、精准的地磁基准数据。
在飞控应用中,QMC5883P 为航向锁定与姿态参考系统(AHRS)提供了坚实的地磁支撑。±30 高斯的宽量程使其在电机、电调等强磁干扰环境下仍能保持有效测量,不易饱和——这对飞控板上密集排布的动力与信号走线尤为关键,直接意味着更稳定、更可信的机头指向。同时,AMR 技术的低噪声特性与内置温度补偿共同保障了地磁数据在全天候飞行中的一致性。相较于上一代 QMC5883L,QMC5883P 实现了两项核心提升:一是磁场量程从 ±8 高斯扩展至 ±30 高斯,抗饱和能力大幅增强,在强磁环境中航向数据更加稳定可靠;二是QMC5883P 额外提供了温度数据输出寄存器,可实时监测芯片工作温度,为温度补偿算法提供直接数据来源。
校准注意事项:无论是内置还是外置磁力计,在首次使用和每次改变安装位置后都必须执行磁力计校准。校准过程通常要求用户将飞行器在空中沿各个轴旋转 360°(即做"8 字"动作),飞控采集足够多的方向样本后计算出硬铁和软铁补偿参数。在 Betaflight 和 INAV 中,磁力计校准可以通过地面站软件的专用界面触发;在 MissionPlanner 中,校准过程有详细的图形化引导。未校准或校准不准确的磁力计会导致飞行器在自主飞行中出现航向偏差,严重时可能导致返航方向完全错误。
3.4 OSD 芯片
OSD(On-Screen Display,屏幕叠加显示)芯片。支持 PAL(625 行/50Hz)和 NTSC(525 行/60Hz)两种视频制式,可以在视频画面上叠加最多 16 行 × 30 列的字符矩阵(PAL 制式下)。每个字符从内部的 256 字符字库中选取,用户可以自定义部分字符图案(如电池图标、信号强度条等)。
通过 OSD,飞手可以在 FPV 眼镜或显示器上直接看到以下关键飞行信息:
• 电池电压和电流(实时监控电池状态)
• 飞行高度(气压计或 GPS 高度)
• 飞行速度(GPS 速度)
• 飞行时间
• GPS 坐标和卫星数量
• 航向角和返航方向箭头
• 遥控信号强度(RSSI / LQ)
• 飞行模式(ANGLE / HORIZON / ACRO 等)
• 人工地平线
• 罗盘方位指示
在 Betaflight 和 INAV 的地面站中,用户可以使用图形化的 OSD 布局编辑器自由安排各信息元素在屏幕上的位置,实现个性化的信息显示方案。OSD 的字符集也可以自定义,许多社区提供了精美的第三方 OSD 字体包,可以显著提升信息显示的美观度和可读性。
3.5 黑匣子/数据记录
黑匣子(Blackbox)数据记录功能是飞控的一项重要辅助工具,它记录了飞行过程中的详细参数数据,供用户在飞行后进行深入分析。ZP-MH743 支持MicroSD 卡黑匣子。
SD 卡记录模式:通过正面的 MicroSD 卡槽(CARD1),飞控可以将黑匣子数据直接写入 SD 卡。SD 卡存储的优势在于容量大、数据传输快(通过读卡器直接拷贝到电脑)和管理方便(可以按日期或飞行场地分类整理文件夹)。
黑匣子数据的分析与应用:记录的黑匣子数据可以通过 Betaflight Blackbox Explorer、Blackbox Log Viewer 等专用工具进行分析。这些工具可以将原始数据解码并以图表形式呈现,帮助用户:
• PID 调参优化:通过对比 PID 设定值(Setpoint)和实际陀螺仪响应(Gyro),判断 P、I、D 各项参数是否合理。例如,如果飞行器在快速翻转后出现明显的震荡超调,可以通过黑匣子数据确认是 P 值过高还是 D 值不足。
• 滤波器效果评估:观察陀螺仪原始数据(Gyro Raw)和滤波后数据(Gyro Filtered)的对比图,评估当前滤波器配置对振动噪声的抑制效果,并据此调整滤波器的截止频率和类型。
• 电机健康检测:分析各电机的输出指令差异,识别是否存在某个电机响应异常(如转速不匹配、轴承磨损等)的情况。
• 飞行复盘:结合 GPS 数据和遥控输入数据,回放完整的飞行过程,分析飞行技巧和操作习惯。
3.6 GPS/罗盘模块的选配与连接
GPS(Global Positioning System)模块是实现自主导航功能的核心传感器,为飞控提供飞行器的地理位置(经纬度)、海拔高度、地面速度和精确时间信息。ZP-MH743 通过 U16插座连接外置 GPS 模块。
一般GPS 模块还集成了磁力计(罗盘)芯片,通过一根共同的线缆同时传输 GPS(UART)和磁力计(I²C)数据。因此,GPS模块接口需要同时包含 GPS TX/RX、I²C SDA/SCL、电源和地线。
安装位置建议:GPS 天线应尽可能安装在飞行器顶部,远离碳纤维板和其他可能遮挡卫星信号的结构件。理想的安装方式是将 GPS 模块通过碳纤维桅杆或折叠支架安装在机架最高处,天线面朝天空。同时,GPS 模块应远离大电流线路(如电池供电线)和大面积金属件,以减少对 GPS 信号和磁力计测量的电磁干扰。
连接方式:GPS 模块的 UART 接口(TX/RX)连接到飞控的 GPS UART 端口(交叉接线:GPS TX → 飞控 UART RX,GPS RX → 飞控 UART TX)。如果 GPS 模块集成了磁力计,还需将 I²C 接口(SDA/SCL)连接到飞控的 I²C 端口。GPS 模块的供电通常为 5V(取决于模块型号),接线前请查阅模块的规格书确认供电要求。
3.7 光流/避障等扩展传感器
除了上述核心传感器外,ZP-MH743 还可以通过其丰富的接口资源连接各类扩展传感器,实现更多的自主飞行功能。
光流传感器(Optical Flow Sensor):光流传感器通过高速采集地面纹理图像并计算图像帧间的像素位移来估算飞行器相对于地面的水平运动速度。这一信息在 GPS 信号不可用的室内环境中尤为重要——飞控可以将光流数据与加速度计数据融合,实现室内环境下的精确悬停和低速平移飞行。使用光流传感器时需要注意:(1)传感器需要面朝正下方安装,距地面 0.5m–3m 为最佳工作范围;(2)地面需要有一定的纹理特征,在光滑地板、水面或高空中光流传感器将失效;(3)通常需要搭配测距传感器(如激光测距仪或超声波模块)提供精确的高度信息,以补偿高度变化对光流估计的影响。
激光测距仪(LiDAR / Laser Rangefinder):激光测距仪向下发射激光脉冲并测量回波时间,提供厘米级精度的对地高度测量。激光测距数据可用于精确的自动起降、地形跟随飞行和低空定高飞行。
超声波测距模块:超声波模块通过发射超声波脉冲并接收回波来测量距离,成本低廉但精度和量程不及激光测距仪(典型量程 2cm–4m,精度 ±1cm)。
避障传感器:对于需要自主避障功能的应用场景,可以连接多方向的测距传感器阵列(前、后、左、右、上、下各安装一组),飞控根据各方向的距离信息实时判断障碍物位置并执行规避机动。在 ArduPilot 固件中,这一功能被称为 Proximity(近接感知)系统,支持多达 8 个方向的传感器输入。INAV 固件也提供了基础的避障支持,但功能相对简单。
空速管(Airspeed Sensor):对于固定翼飞行器,空速管(皮托管)通过测量总压与静压之差来计算飞行空速。空速信息对于固定翼的失速预防、自动油门控制和精确着陆至关重要。常用的空速传感器模块使用IIC数字接口或者ADC模拟采样接口。
04硬件安装与接线
4.1 飞控在机架上的安装方向与减震
飞控板表面的箭头标识代表了飞控的默认机头朝向。安装时,请务必将箭头指向飞行器的正前方(即机头方向),这是飞控进行姿态解算和坐标轴定义的基础。若因机架结构限制需要将飞控旋转安装(例如箭头指向机头左侧或右侧),则必须在飞控固件中进行相应的姿态方向参数设置(如 Betaflight 中的 board_alignment参数),明确告知飞控实际安装方向,否则飞控会将机头方向误判,导致飞行器起飞即侧翻甚至失控。
飞控板对高频振动十分敏感,振动直接影响陀螺仪与加速度计的数据质量,进而劣化姿态解算精度与控制响应。因此,强烈建议在飞控板与机架之间加装减震柱(减震球)进行安装。减震柱能有效衰减来自电机与螺旋桨的高频振动,为传感器提供相对干净的力学环境。安装时,应使用标准的 30.5×30.5mm 孔位,将减震柱置于飞控四角,并均匀锁紧,确保四角受力一致。过度锁紧会导致减震柱失去弹性,反而成为振动传导的硬通道;锁紧力度不足则可能导致飞控板晃动,造成姿态估计震荡。理想状态是飞控板在轻微外力下可有约 0.5~1mm 的弹性浮动,既能有效隔振,又不会因过度位移影响控制精度。
附加安装建议:
- 安装时请确保螺丝及垫片不与板面任何元器件发生接触,以免造成短路或物理损伤。
- 若机架为碳纤材质(导电),建议在飞控板与机架之间加装绝缘垫片或贴覆绝缘胶带,防止意外短路。
- 所有连接线束应预留适当松弛度,避免绷紧——线束绷紧会将机架振动直接传导至飞控板,削弱减震效果。
- 安装完成后,建议手动轻晃机架确认飞控板无松动,并检查各连接器是否存在受力或脱落风险。
4.2 四合一电调(ESC)接线方案
电调(Electronic Speed Controller)是连接飞控和无刷电机之间的功率驱动器件,接收飞控发出的转速指令并驱动电机以相应的速度旋转。ZP-MH743 支持多种电调通信协议,用户需要根据所使用的电调型号选择匹配的接线和配置方案。
ZP-MH743对四合一电调接线:
- 地线(GND):连接到电调输出接口GND。
- 电源线(VBAT):连接到电调输出接口VBAT。
- 信号线(
M1–M4):连接到电调输入引脚 M1–M4。 - 专线回传线(RX): 连接到电调输出引脚TX。
- 电流检测线:连接到电调电流采集输出 ADC。
排线的连接顺序应在安装前仔细核对电调和飞控的引脚定义图,不同厂家的排线引脚排列可能不同。错误的接线可能瞬间烧毁飞控或电调。
4.3 遥控器接收机接线
遥控器接收机是连接飞手操控指令与飞控系统的桥梁,其接线正确性直接关系到飞行安全。ZP-MH743 支持多种接收机协议的接入,以下是各协议的接线方式:
| 协议 | 建议接线 | 备注 |
|---|---|---|
| SBUS | UART6-RX |
通常只需单向信号线与 GND/供电 |
| DSM / SRXL | UART6-RX |
通常只需单向信号线与 GND/供电 |
| FPort | UART6-TX |
通常只需单向信号线与 GND/供电 |
| CRSF / ELRS | UART6-TX UART6-RX TX与RX交叉连接 |
可自动传输遥测 |
| SRXL2 | UART6-TX |
ArduPilot 下设置 SERIAL6_OPTIONS = 4 |
4.4 GPS 模块接线
GPS 模块是实现自主导航功能的核心传感器,为飞控提供飞行器的地理位置(经纬度)、海拔高度、地面速度和精确时间信息。以下是标准 GPS 模块接线方式:
| 引脚 | 信号 | 连接到飞控 | 说明 |
|---|---|---|---|
| 1 | VCC (5V) | 5V | GPS 模块供电 |
| 2 | GND | GND | 地线 |
| 3 | GPS TX | UART RX | GPS 数据发送 |
| 4 | GPS RX | UART TX | GPS 配置接收 |
| 5 | I²C SDA | I²C SDA | 磁力计数据线 |
| 6 | I²C SCL | I²C SCL | 磁力计时钟线 |
如果 GPS 模块不包含罗盘功能,则仅需要连接前 4 根线(VCC、GND、TX、RX)。
接线注意事项:
1. TX/RX 交叉连接:GPS 模块的 TX 必须连接到飞控 UART 的 RX,GPS 模块的 RX 必须连接到飞控 UART 的 TX。这是串口通信的基本规则,接反将无法通信。
2. 供电电压确认:大多数 GPS 模块设计为 5V 或 3.3V 供电,接线前务必查阅模块说明书确认供电要求。将 5V 供电的模块误接 3.3V 可能导致模块工作不稳定;将 3.3V 模块误接 5V 可能永久损坏模块。
3. 线缆长度:GPS 模块通常安装在距离飞控较远的位置(如桅杆顶部),线缆长度可能达到 20cm–50cm。较长的 I²C 线路容易出现信号完整性问题,建议使用带有屏蔽层的线缆,并尽量缩短线路长度。如果 I²C 通信不稳定(表现为磁力计数据跳变或读取失败),可以尝试降低 I²C 总线速率(从 400kHz 降至 100kHz)。
4. 搜星等待:GPS 模块在冷启动后需要约 30–60 秒进行搜星定位(在开阔地带),在此期间 GPS 指示灯通常会闪烁。建议在 GPS 获得 3D Fix(至少 6 颗以上卫星)后再解锁起飞,以确保返航点记录准确。
4.5 图传与摄像头接线(模拟/数字)
FPV(First Person View)图传系统是飞手获得沉浸式飞行体验的关键设备,ZP-MH743 同时支持模拟图传和数字图传两种方案。
模拟图传接线:
模拟图传系统由摄像头(Camera)、图传发射机(VTX)和 OSD 芯片三部分组成,接线如下:
• 摄像头:摄像头的视频输出(VIDEO OUT)连接到飞控的视频输入(VIN),同时摄像头需要供电(通常 5V 或 3.3V–20V,取决于摄像头型号)。
**• 飞控 OSD:飞控内部将 OSD 芯片生成的字符叠加信号与摄像头输入的视频信号混合,从视频输出引脚(VOUT)输出叠加了飞行信息的复合视频信号。
• 图传发射机:飞控的视频输出(VOUT)连接到图传发射机的视频输入(VTX),图传发射机还需要供电(5V 或 7V–36V,取决于发射功率和型号)和地线。
• 图传控制线:为了实现地面站远程调整图传频道和功率,图传发射机的控制线连接到飞控的一个空闲 UART 的 TX 引脚。
模拟图传系统的优点是延迟极低( 1ms)、成本低廉、信号衰减时画面逐渐变差(雪花/条纹)而非突然中断,这对 FPV 竞速飞手来说是非常重要的安全特性。缺点是分辨率较低(通常为 480p–600p 的模拟分辨率)且容易受到多径干扰。
数字图传接线:
数字图传系统将摄像头和视频处理模块集成在一起,飞控的角色简化为提供 OSD 数据:
• 视频连接:数字图传系统的摄像头直接连接到图传主机模块(通过专用排线),不经过飞控处理。
• OSD 数据连接:飞控的一个 UART(如 UART4 或 UART6)配置为 MSP DisplayPort 模式,通过 TX 引脚将 OSD 数据发送给图传主机模块。图传主机模块在其内部将飞行信息叠加到高清视频画面上。
• 供电:数字图传系统通常需要较高的供电功率,一般由独立的 BEC 或电调的 BEC 输出直接供电,不通过飞控。
• 控制线:部分数字图传系统支持通过 UART 进行远程频道/功率控制,接线方式与模拟图传的控制线类似。
数字图传系统的优势在于高清画质(720p–1080p)、抗干扰能力强和 OSD 画面更精美。缺点是延迟相对较高(约 20ms–40ms),且在信号极限距离时画面可能出现突然冻结或马赛克(数字信号的特性),这对飞行安全有一定影响。
ZP-MH743支持DJI O3/O4直插
4.6 典型接线示意总图
在完成所有部件的接线后,进行一次全面的接线复查是确保首飞安全的关键步骤。以下是 ZP-MH743 飞控典型接线图示:


接线复查清单:
1. 电源极性及连接可靠性检查:使用万用表确认所有供电线路的极性正确,特别是电调电源输出连接极性以及可靠性。
2. 信号线交叉检查:确认所有 UART 通信线路的 TX-RX 交叉连接正确(发射端 TX → 接收端 RX)。
3. 地线共地检查:确认所有外设的 GND 与飞控的 GND 已互连,形成共同的参考地电位。
4. 短路检查:使用万用表的通断挡检查电源正极与地线之间是否存在短路,确认无短路后方可首次上电。
5. 线缆固定检查:确认所有线缆已使用扎带或热缩管固定,不会在飞行中因振动而松脱。特别注意信号排线的连接器是否卡扣到位。
6. 散热空间检查:确认飞控、电调和图传发射机周围有足够的空气流通空间,不会被线缆或其他部件遮挡。
7. 桨叶检查:首飞前确认螺旋桨安装方向正确(正反桨不混淆)、紧固牢靠,且桨叶无裂纹或变形。
首次上电流程:
完成上述所有接线和检查后,按照以下步骤进行首次上电:
1. 将飞行器放置在水平、稳定的表面上,确保周围无障碍物和人员。
2. 拆下所有螺旋桨(首飞调试阶段务必卸桨!)。
3. 通过 USB Type-C 线缆连接飞控至电脑,打开地面站软件(如 Betaflight Configurator)。
4. 确认地面站能正常识别飞控,进入配置界面。
5. 依次检查:IMU 方向是否正确(在软件中晃动飞行器,观察 3D 模型是否同步运动)、接收机信号是否正常(拨动摇杆,观察通道值是否变化)、电机顺序和转向是否正确(使用电机测试功能逐一确认)。
6. 确认无误后,断开 USB,安装螺旋桨,连接电池进行首次低空悬停测试。
【提示】编者注:本章内容涵盖了 ZP-MH743 飞控从硬件接口认知到完整装机接线的全过程。在实际操作中,请务必以安全为第一原则——每次接线操作前断开电源、首飞调试前拆卸螺旋桨、在开阔安全的环境中进行飞行测试。良好的装机习惯和严谨的检查流程是安全飞行的基础。
05固件基础知识
5.1 飞控固件概述(Betaflight / ArduPilot / INAV /PX4简介)
无人机飞控固件是运行在飞控板主控芯片上的嵌入式软件,负责传感器数据读取、控制算法执行、遥控指令处理及电机控制信号输出。目前主流的开源飞控固件主要分为四大流派,各自针对不同的飞行场景与用户群体进行了深度优化。
Betaflight 是目前穿越机(FPV)领域占有率最高的固件,起源于 Cleanflight 的分支项目。它以极致的操控响应速度和飞行手感著称,PID 控制器与滤波算法经过大量竞速飞手与花飞玩家的实战检验,持续迭代优化。Betaflight 主要支持自稳(Angle)、半自稳(Horizon)和全手动(Acro)三种飞行模式,不依赖 GPS 导航,飞行表现完全取决于飞手的操控技巧。其更新频率快、社区生态活跃,配套的地面站和调参工具极为丰富,是追求极限操控体验的 FPV 竞速与花飞玩家的首选固件。
ArduPilot 是全球范围内功能最为全面的开源自动驾驶平台之一,支持多旋翼(ArduCopter)、固定翼(ArduPlane)、无人车(ArduRover)及水下航行器(ArduSub)等多种载具类型。其核心优势在于高度成熟的自主飞行能力——支持复杂航点任务规划、地理围栏、多级失效保护、高精度 GPS 导航以及丰富的多传感器融合架构。ArduPilot 采用 EKF(扩展卡尔曼滤波)进行状态估计,支持双 IMU 冗余、光流定位、视觉导航等高级功能,广泛应用于航拍测绘、农业植保、工业巡检等专业行业领域。配合 Mission Planner 或 QGroundControl 地面站,可形成完整的行业级解决方案。
INAV 可视为 Betaflight 与 ArduPilot 之间的平衡之选。它最初源于 Cleanflight 分支,重点强化了 GPS 导航能力。INAV 在保留良好手动操控手感的同时,加入了 GPS 定点悬停(Position Hold)、自动返航(RTH)、航点飞行等导航功能,尤其擅长固定翼的自主导航飞行。其航点任务系统支持条件逻辑(Logic Conditions),能够实现相当复杂的自主任务编排。对于既享受花飞操控乐趣、又希望拥有 GPS 辅助功能的玩家,以及固定翼长航时飞行爱好者而言,INAV 是一个兼具手感与智能的中间路线。
PX4 是另一款国际主流的专业级开源飞控固件,由 Dronecode 基金会维护,与 ArduPilot 并称行业双雄。PX4 采用现代化的多进程架构,运行于 NuttX 实时操作系统之上,代码结构清晰、模块化程度高,便于开发者进行二次开发与功能定制。PX4 支持多旋翼、固定翼、垂直起降(VTOL)及无人车等多种载具,内置多套 EKF 状态估计器,可根据传感器配置自动切换,并支持光流、视觉里程计、RTK 高精度定位等扩展。在地面站方面,PX4 与 QGroundControl 深度绑定,提供直观的飞行界面与完整的任务规划能力。PX4 在学术研究、工业级无人机系统及复杂自主飞行项目中尤为受青睐,适合对系统架构开放性、可定制性有较高要求的开发团队与科研机构。
四大固件各有侧重:Betaflight 专注操控极限,ArduPilot 追求功能广度与行业可靠性,INAV 兼顾手感与导航便利,PX4 则在系统架构与现代工程实践上更具优势。用户可根据自身飞行风格、应用场景及开发需求灵活选择,而 ZP-MH743 对四大固件的全面兼容,则让这一切选择都成为可能——同一块飞控,随心切换,无限玩法。
5.2 固件版本选择策略(稳定版 vs 开发版)
每款固件都有稳定版(Release / Stable)和开发版(Nightly / Development)两种发布轨道。
稳定版经过充分测试,功能相对固定,bug 较少,适合日常飞行和生产使用。稳定版的版本号通常以整数或偶数开头(如 Betaflight 4.5、INAV 7.1、ArduPilot 4.5),在发布前会经历 Release Candidate(RC)阶段的社区测试。对于大多数用户,尤其是初学者,强烈建议使用稳定版固件。
开发版(也称 Nightly Build)是每日自动编译的最新版本,包含最新的功能和 bug 修复,但也可能引入新的问题。开发版适合有一定经验的进阶用户,用于测试新功能或修复特定 bug。使用开发版时应特别注意:刷写前务必备份当前配置(CLI dump / diff),并保留一份已知好用的稳定版固件文件以备回退。
对于 ZP-MH743 飞控,建议的固件选择策略是:首次使用刷写最新稳定版 → 完成基础配置和首飞验证 → 根据飞行需求逐步优化参数。除非遇到必须修复的特定 bug,否则不建议在正式飞行中使用开发版。
5.3 STM32 DFU 模式与串口刷机原理
STM32 微控制器支持多种固件更新方式,理解其底层原理有助于在遇到问题时快速定位和解决。
DFU 模式(Device Firmware Upgrade) 是 STM32 芯片内置的一种 USB 引导加载模式。当飞控板通过 USB 连接到电脑时,可以通过软件命令或硬件操作(如按住 BOOT 按键上电)使芯片进入 DFU 模式。在 DFU 模式下,芯片内部的 System Bootloader 会接管 USB 通信,等待主机发送新的固件数据并写入 Flash 存储器。DFU 模式的优点是不需要额外的硬件烧录器,直接通过 USB 即可完成刷写。ZP-MH743 飞控的 USB Type-C 接口支持 DFU 模式,这是最常用的固件更新方式。
串口刷机 则利用 STM32 的 USART Bootloader,通过 UART 串口接口传输固件数据。串口刷机通常需要将 BOOT 引脚设置为特定电平,然后通过串口工具(如 STM32 Flash Loader Demonstrator 或 Betaflight Configurator 的固件刷写功能)进行刷写。串口刷机的应用场景包括:USB DFU 功能损坏无法使用时的备选方案,以及批量生产时的固件预装。
SWD/JTAG 烧录 是另一种底层刷写方式,需要使用 ST-Link、J-Link 等专用调试器,通过 SWD(Serial Wire Debug)或 JTAG 接口直接访问芯片的 Flash 存储器。这种方式通常在开发调试阶段使用,或者在芯片完全变砖(Bootloader 也被损坏)时作为恢复手段。ZP-MH743 飞控预留了调试接口(SWDIO / SWCLK),可用于此类操作。
06Betaflight 固件刷写
准备软件工具
| 工具 | 用途 |
|---|---|
| Zadig 2.8 | 安装 DFU 驱动 |
| STM32CubeProgrammer | ST 官方烧录工具,可用于烧录飞控和固件 |
| bf.zettatree.com | Betaflight 飞控配置与固件烧录 |
6.1 进入 DFU 模式并安装驱动
1. 让飞控进入 DFU 模式
- 按住飞控 USB 接口旁的 BOOT 按钮。
- 保持按钮按下,同时插入 USB 数据线并连接电脑。
- 飞控上电约 2 秒后,松开 BOOT 按钮。

2.在 Zadig 中显示全部设备
打开 Zadig 2.8,在 Options菜单中勾选 List All Devices。

3. 选择 DFU 设备
打开设备列表并选择 DFU in FS Mode。如果飞控主控为 STM32F405,设备名称也可能显示为STM32 BOOTLOADER。
如果列表中没有对应设备,请检查:
- 插入 USB 数据线前,BOOT 按钮是否保持按下。
- 当前 USB 数据线是否支持数据传输并能正常工作。

4. 安装 DFU 驱动
点击 Install Driver,安装 WinUSB 驱动。

等待驱动安装完成。打开 Windows 设备管理器,如果能够看到 DFU in FS Mode设备,即表示电脑已经正确识别飞控的 DFU 模式。

完成以上准备后,即可按照下面Betaflight 固件的流程进行烧录。
6.2 烧录 Betaflight 固件
使用本地固件文件
- 让飞控进入 DFU 模式并打开 bf.zettatree.com。

- 在固件烧写工具中点击右下角烧写固件,点击查找DFU设备,然后连接,表示飞控已经被正确识别。

- 点击本地电脑加载固件,选择电脑中的 Betaflight 固件文件。

- 下载完成后,点击左侧的烧写固件开始烧录。

6.3 使用STM32CubeProgrammer进行烧录
- 切换CubeProgrammer连接方式,右上角点击 ST-LINK ▼, 将其改成: USB

- 选择USB后:点击端口旁边的刷新按钮; 端口显示为
USB1; 点击绿色的“连接”。

- 进入左侧的"擦除和编程",打开固件文件 ,选择电脑中的 Betaflight 固件文件,点击连接,点击开始烧录。

- 烧录完成

07ArduPilot 固件刷写
7.1 Mission Planner 固件刷写工具使用
Mission Planner 是 ArduPilot 项目官方推荐的地面站软件,内置了完善的固件刷写功能。Mission Planner 仅支持 Windows 平台(基于 .NET Framework),但可以通过 Mono 在 Linux/macOS 上运行(体验有限)。
安装 Mission Planner:访问 https://ardupilot.org/planner/ 下载最新版安装包,运行安装向导完成安装。首次启动时,Mission Planner 会自动检测系统环境并提示安装缺少的运行时组件。
Mission Planner 的固件刷写功能位于 "Initial Setup" → "Install Firmware" 页面。该页面列出了所有支持的载具类型(Copter、Plane、Rover、Sub),点击对应图标即可开始刷写。
7.2 烧录ArduPilot Bootloader
1.进入STM32 DFU模式
- 拔掉USB线。
- 按住飞控板上的
BOOT按键。 - 保持按住并插入USB线。
- 等待约2秒。
- 松开
BOOT
2.连接CubeProgrammer
右上角 ST-LINK→ 改为 USB→ 点击刷新→ 选择 USB1→ 点击“连接”

3.打开Bootloader文件
选择:ZP-MH743_bl.bin
因为这是 .bin裸二进制文件,需要填写开始地址:0x08000000

4.开始烧录
点击:开始烧录
第一阶段完成后,芯片中只有ArduPilot Bootloader,还需要继续安装主固件。

7.3 Mission Planner烧录ArduCopter主固件
1.启动刚烧录的ArduPilot Bootloader
不要按BOOT,先不插入飞控,打开Mission Planner ,进入:初始设置→ 安装固件。
2. 加载自定义固件
点击页面中的: Load custom firmware(加载自定义固件), 选择:arducopter.apj。

3.按照提示插入飞控
选择 .apj后:
- 不按
BOOT。 - 插入飞控USB线。
- 等待Mission Planner扫描Bootloader。
- 如果提示重新插拔,就按提示拔插一次。

4.烧录成功

08INAV 固件刷写
8.1 INAV Configurator 安装
INAV Configurator 是 INAV 固件的官方配置和刷写工具,与 Betaflight Configurator 界面相似(两者都源自 Cleanflight Configurator),但功能针对导航飞行做了专门优化。
安装方法: 访问 INAV 官方 GitHub 发布页面(https://github.com/iNavFlight/inav-configurator/releases),下载最新版本的安装包。安装过程与 Betaflight Configurator 类似——Windows 下载 .exe 或 .zip,macOS 下载 .dmg,Linux 下载 .AppImage。
安装完成后打开 INAV Configurator,建议先在设置中检查更新,确保使用最新版本的 Configurator 以支持最新的 INAV 固件版本。INAV Configurator 的固件刷写和配置界面与 Betaflight Configurator 布局类似,上手较为容易。
8.2 固件下载与刷写流程
INAV 固件的刷写流程与 Betaflight 非常相似,都是通过 Configurator 的 Firmware Flasher 页面完成。
使用STM32CubeProgrammer烧录inav固件
- 切换CubeProgrammer连接方式,右上角点击 ST-LINK ▼, 将其改成: USB

- 选择USB后:点击端口旁边的刷新按钮; 端口显示为
**USB1**; 点击绿色的“连接”。

- 进入左侧的"擦除和编程",打开固件文件 ,选择电脑中的inav固件文件,点击连接,点击开始烧录。

- 烧录完成

09PX4固件刷写
9.1QGroundControl安装
QGroundControl 是 PX4 固件主要配套的地面站软件,也支持部分 ArduPilot 飞控。它通过 MAVLink 协议与飞控通信,可用于固件刷写、机架选择、传感器校准、遥控器设置、参数调整、航点任务规划以及飞行状态监控,适合无人机自主飞行和科研开发。
安装方法:访问 QGroundControl 官方下载页面(https://qgroundcontrol.com/downloads/),根据电脑系统下载对应安装包。Windows 下载 .exe 安装程序,macOS 下载 .dmg 文件,Linux 通常下载 .AppImage 文件。安装完成后,通过 USB 或数传模块连接飞控,即可进行固件安装、参数配置和飞行任务规划。
9.2 烧录PX4 Bootloader
1. 进入STM32 DFU模式
- 拔掉USB线。
- 按住飞控板上的
BOOT按键。 - 保持按住并插入USB线。
- 等待约2秒。
- 松开
BOOT
2.连接CubeProgrammer
右上角 ST-LINK→ 改为 USB→ 点击刷新→ 选择 USB1→ 点击“连接”

3.打开Bootloader文件
点击“浏览”,选择ZettaTree_ZP-MH743_bootloader(3).bin,因为它是裸 .bin文件,需要填写开始地址:0x08000000。

9.3使用QGroundControl烧写PX4主固件
1. 打开QGroundControl固件页面
2.选择自定义PX4固件
- 勾选Advanced settings/高级设置
- 打开固件版本下拉菜单
- 选择Custom firmware file...
- 选择本地固件文件 选择:
ZettaTree_ZP-MH743_default(3).px4

3.烧录完成

10四大主流地面站概述与对比分析
飞控板是无人机的"大脑",而地面站(Ground Control Station, GCS)则是操作者与这颗大脑沟通的"桥梁"。选择合适的地面站并熟练掌握其配置方法,是每一位无人机操控者和开发者必须具备的基本技能。目前,与 ZP-MH743 飞控(基于 STM32H743)兼容的主流地面站主要有四款:Betaflight Configurator、Mission Planner、INAV Configurator和 QGroundControl。它们分别对应不同的固件生态和使用场景,各有侧重、各有所长。本章将对这四款地面站进行全面概述与横向对比,帮助读者在实际应用中做出最佳选择。
10.1 Betaflight Configurator 概述——穿越机竞速与花飞的标杆
Betaflight Configurator 是专为 Betaflight 固件设计的官方配置工具,基于 Electron 框架构建,支持 Windows、macOS 和 Linux 三大平台。作为穿越机(FPV Freestyle/Racing)领域使用最广泛的地面站,它已成为该细分市场的行业标准。
核心特点:
• 极致的飞行性能调校:提供完善的 PID 参数调节面板,支持 P/I/D/FF(前馈)各轴独立调节,内置多种滤波器(Gyro Lowpass、Dynamic Notch Filter、RPM Filter 等),可将飞行性能打磨到极致。
• *丰富的 OSD 编辑功能*:内置可视化 OSD 布局编辑器,支持模拟图传 OSD(MAX7456)和高清数字图传 OSD(DJI O3/Air Unit、Walksnail、HDZero 等),用户可自由拖拽飞行参数显示位置。
• 黑匣子日志系统:内置 Blackbox 日志记录功能,可记录陀螺仪原始数据、PID 响应、电机输出等高频飞行数据,配合 Blackbox Explorer 工具进行精细分析。
• CLI 命令行接口:提供功能强大的命令行界面,几乎所有参数都可通过 CLI 命令精确设置,是高级玩家调参的核心工具。
• 配置预设(Presets)系统:Betaflight 4.x 版本引入了在线预设系统,用户可一键加载社区贡献的 PID 调参、滤波器配置、OSD 布局等预设方案。
• 实时数据仪表盘:连接飞控后,可在 Setup 页面实时查看陀螺仪姿态、电池电压、GPS 坐标、传感器状态等信息。
适用人群:FPV 穿越机竞速选手、花飞(Freestyle)玩家、对飞行手感和操控响应有极致追求的航模爱好者。
版本与更新:Betaflight Configurator 通过 GitHub Releases 发布,当前主流版本配合 Betaflight 4.4/4.5 固件使用。建议始终使用与飞控固件版本匹配的 Configurator 版本,以避免兼容性问题。
10.2 Mission Planner 概述——ArduPilot 生态的全功能地面站
Mission Planner 是 ArduPilot 项目官方推荐的地面站软件,由 Michael Oborne 主导开发,基于 .NET 框架构建,原生支持 Windows 平台。作为 ArduPilot 生态中最成熟、功能最全面的地面站,它几乎涵盖了无人机运维的所有环节。
核心特点:
• 全面的初始设置向导:提供图形化的设置流程,引导用户完成加速度计校准、罗盘校准、遥控器校准、电调校准等关键步骤,降低了 ArduPilot 的上手门槛。
• 强大的航线规划功能:内置航点编辑器(Waypoint Editor),支持丰富的航点类型——标准航点(WAYPOINT)、悬停等待(LOITER_UNLIM/LOITER_TIME)、条件偏航(CONDITION_YAW)、自动起飞(TAKEOFF)、自动降落(LAND)、兴趣点环绕(ROI)、舵机控制(DO_SET_SERVO)等。此外还支持测绘航线自动生成(Survey Grid)。
• 完整的参数管理:ArduPilot 拥有超过 1000 个可配置参数,Mission Planner 提供了分类浏览、搜索、比较、导入导出等功能,方便用户精确管理每一项配置。
**• 飞行数据分析(DF Logs):内置 DataFlash 日志分析模块,可解析 ArduPilot 的 .bin/.BIN 日志文件,提供图表化的飞行数据回放、振动分析、PID 性能评估等功能。
• *仿真与 SITL 支持*:可配合 SITL(Software In The Loop)模拟器,在无实机条件下进行航线验证、飞行训练和参数调试。
• 遥测与数传支持:支持 SiK 系列数传电台(433MHz/915MHz)、WiFi 数传、蓝牙数传等多种通信链路,可在飞行过程中实时监控飞行状态。
• 多机型支持:同一个 Mission Planner 软件可配置多旋翼(Copter)、固定翼(Plane)、 rover(地面车)、潜艇(Sub)等所有 ArduPilot 支持的机型。
适用人群:航测/巡检/植保等行业应用用户、需要进行自主航线飞行的用户、ArduPilot 固件开发者与研究人员。
平台说明:Mission Planner 原生仅支持 Windows。macOS/Linux 用户可通过 Mono 运行或使用 QGroundControl 作为替代方案。
10.3 INAV Configurator 概述——自主导航与 GPS 辅助飞行的优选
INAV Configurator 是 INAV 固件的官方配置工具,同样基于 Electron 框架,界面布局与 Betaflight Configurator 相似,但在功能侧重点上有明显差异。INAV 可以看作是 Betaflight 的一个分支(fork),它在保留 Betaflight 核心飞行控制能力的基础上,大幅增强了 GPS 导航和自主飞行功能。
核心特点:
• *增强的 GPS 导航功能*:支持 GPS Return to Home(自动返航)、GPS Position Hold(定点悬停)、Waypoint Mission(航点任务)、RTH(返航)航线定制等导航功能,是 INAV 相较于 Betaflight 最显著的优势。
• 多传感器融合定位:支持 GPS+气压计+磁力计+光流+激光测距的多传感器融合定位方案,即使在 GPS 信号不佳的环境下也能实现较为可靠的悬停与导航。
• 灵活的飞行模式:除基本的 Angle/Horizon/Acro 模式外,还提供 NAV POSHOLD(定点悬停)、NAV RTH(自动返航)、NAV WP(航点飞行)、NAV LAUNCH(固定翼弹射起飞)、CRUISE(巡航模式)等导航模式。
• 固定翼支持优化:INAV 对固定翼飞机的支持远优于 Betaflight,提供完善的固定翼混控、自动起飞降落、航线规划等功能。
• OSD 增强:支持更丰富的 OSD 元素,包括导航信息(距离/方向/返航箭头)、电池预估剩余飞行时间、风速风向等。
• RTH 航线定制:可自定义返航高度、返航路径(直线/原路返回)、降落行为等,满足不同场景的安全需求。
适用人群:需要在穿越机平台上实现 GPS 辅助飞行和自主导航的用户、固定翼航拍与长航时飞行用户、介于 Betaflight 纯手动操控与 ArduPilot 全自动导航之间的"中间路线"用户。
10.4 QGroundControl 概述——PX4/ArduPilot 双栈的跨平台方案
QGroundControl(简称 QGC)是一款开源、跨平台的地面站软件,由 Dronecode 基金会维护。它同时支持 PX4 和 ArduPilot 两大固件体系,是目前兼容性最广的地面站之一。QGC 基于 Qt 框架开发,可在 Windows、macOS、Linux、Android 和 iOS 平台上运行。
核心特点:
• 双固件兼容:同时支持 PX4 Pro 和 ArduPilot 固件,用户无需安装两套地面站即可管理不同固件的飞行器。
• 跨平台运行:原生支持桌面端(Windows/macOS/Linux)和移动端(Android/iOS),特别适合在平板上使用的户外场景。
• 直观的航线规划:提供地图式的航线规划界面,支持拖拽航点、设置高度/速度/悬停时间等参数,界面直观友好。
• MAVLink 协议原生集成:QGC 基于 MAVLink 通信协议构建,能够完整解析和展示 MAVLink 标准定义的所有飞行数据和状态信息。
• 视频流接收:支持通过 RTSP/RTP 协议接收飞行器的实时视频流,并在界面上叠加 OSD 信息。
• 自动任务与地理围栏:支持航点任务、地理围栏(GeoFence)、安全区域(No-Fly Zone)等功能的图形化配置。
• 固件烧录:内置固件刷写功能,可直接通过 USB 为 PX4/ArduPilot 飞控刷写固件,无需额外工具。
适用人群:PX4 固件用户、需要跨平台使用的用户、科研机构和高校的无人机开发团队、同时管理多种固件飞行器的团队。
10.5 四大地面站功能对比总表
下表从多个维度对四款地面站进行横向对比,帮助读者快速了解各平台的能力边界:
| 对比维度 | Betaflight Configurator | Mission Planner | INAV Configurator | QGroundControl |
|---|---|---|---|---|
| 对应固件 | Betaflight | ArduPilot (Copter/Plane/Rover) | INAV | PX4 / ArduPilot |
| 开发框架 | Electron (Web技术) | .NET (C#) | Electron (Web技术) | Qt (C++) |
| 平台支持 | Win / Mac / Linux | Win (Mono可跨平台) | Win / Mac / Linux | Win / Mac / Linux / Android / iOS |
| 主要适用机型 | 穿越机/花飞/竞速 | 多旋翼/固定翼/行业机 | 导航穿越机/固定翼 | 多旋翼/固定翼/行业机 |
| PID 调参 | 极其精细,黑匣子闭环 | 完善,图形化+日志分析 | 较完善,类似BF | 完善,配合日志分析 |
| 航线规划 | 无(不支持) | 极其强大,支持测绘/巡检 | 基础航点任务 | 完善,地图式编辑 |
| GPS 导航 | 基础(仅GPS Rescue) | 全面(RTH/航点/围栏) | 较强(RTH/航点/定点) | 全面(RTH/航点/围栏) |
| OSD 配置 | 极强,模拟+数字全覆盖 | 不支持(OSD由其他工具配) | 较强,类似BF | 基础MAVLink OSD |
| 日志分析 | 黑匣子Explorer外部工具 | 内置DF Logs分析 | 黑匣子Explorer | 内置MAVLink日志分析 |
| 仿真支持 | 无 | SITL 完善 | SITL 基础支持 | SITL + Gazebo 完善 |
| 图传配置 | 模拟/DJI/Walksnail/HDZero | 不涉及 | 模拟/DJI/Walksnail | 不涉及 |
| 参数规模 | ~200个核心参数 | 1000+参数 | ~300个核心参数 | 1000+(ArduPilot)/500+(PX4) |
| CLI 命令行 | 支持,功能强大 | MAVLink Console | 支持,类似BF | MAVLink Console |
| 社区活跃度 | 极高(FPV社区核心) | 高(行业应用社区) | 中等(INAV社区) | 高(Dronecode社区) |
| 学习曲线 | 低(界面友好) | 较高(功能复杂) | 中低(类似BF) | 中等(界面直观) |
| 多语言支持 | 英文为主,部分中文 | 支持中文界面 | 英文为主 | 支持中文界面 |
| 移动端支持 | 无(第三方app有限) | 无(第三方app: AndroPilot等) | 无 | Android + iOS 原生支持 |
10.6 适用场景选型指南
不同的应用场景对地面站的功能需求差异显著,下面针对几种典型场景给出选型建议:
1. FPV 花飞(Freestyle)/ 竞速(Racing)
首选:Betaflight Configurator
花飞和竞速场景的核心需求是极致的飞行手感和操控响应,对 GPS 导航和航线规划的需求几乎为零。Betaflight 固件以其低延迟、高响应性的 PID 控制器著称,配合 Betaflight Configurator 提供的精细 PID 调参、滤波器配置和 OSD 编辑功能,是 FPV 玩家的不二之选。ZP-MH743 飞控的 STM32H743 处理器提供了强大的算力支撑,可实现 8kHz 的 PID 循环频率和多层滤波器叠加,将飞行性能推向极限。
2. 航拍
首选:Mission Planner 或 QGroundControl
航拍场景需要稳定的飞行平台和精确的航线控制,以确保拍摄画面的连贯性和一致性。ArduPilot 固件配合 Mission Planner 提供了完善的自动航线规划、兴趣点环绕(ROI)、等间距航点拍照等功能,是专业航拍的理想选择。如果使用 PX4 固件,则选择 QGroundControl。INAV 也可作为轻量级航拍方案的选择,特别是小型航拍机。
3. 测绘 / 巡检
首选:Mission Planner
测绘和巡检是 Mission Planner 的传统强项。其内置的 Survey Grid(测绘网格)功能可根据用户划定的多边形区域自动生成覆盖航线,支持设置航向重叠率、旁向重叠率、飞行高度、地面分辨率(GSD)等参数。配合 ArduPilot 的精确航线跟踪能力,可实现高质量的航测作业。Mission Planner 还支持与 Pix4D、Agisoft Metashape 等后期处理软件的工作流对接。
4. 自主飞行 / 长航时巡航
首选:Mission Planner 或 INAV Configurator
需要自主飞行的场景(如物流配送、管线巡检、边境巡逻等),Mission Planner 提供了最完善的航线规划和自主飞行支持,包括条件跳转(CONDITION_YAW)、伺服机构控制(DO_SET_SERVO)、相机触发(DO_DIGICAM_CONTROL)等高级航点命令。如果只是需要基础的 GPS 辅助悬停和自动返航功能,INAV 是一个更轻量的选择。
5. 科研开发 / 教学实验
首选:QGroundControl + Mission Planner(双地面站方案)
科研和教学场景通常需要灵活的参数调整和完善的仿真支持。QGroundControl 的跨平台特性和 PX4 固件的模块化架构非常适合科研开发。同时可安装 Mission Planner 作为 ArduPilot 的配置和日志分析工具。SITL 仿真功能允许在无实机条件下进行算法验证和飞行训练,大大降低了研发成本和风险。
10.7 地面站之间的切换策略与参数迁移
在某些场景下,用户可能需要在不同固件和地面站之间切换。例如,将一台花飞穿越机从 Betaflight 切换到 INAV 以获得 GPS 导航功能,或者在同一台飞控上从 ArduPilot 切换到 Betaflight 以获得更好的花飞性能。以下是切换策略和注意事项:
10.7.1 Betaflight ↔ INAV 切换
Betaflight 和 INAV 同源于 Cleanflight 项目,两者在参数体系上有较多相似之处,但也有重要差异:
• CLI 备份与还原:在 Betaflight 中执行 dump all命令导出完整配置,在 INAV 中同样可执行 dump命令。但两者的 CLI 命令并非完全兼容,需要逐项核对并手动调整差异项。
• PID 参数迁移:两者的 PID 控制器架构不同(INAV 的 PID 控制器经过独立优化),不建议直接复制 PID 数值。建议从 INAV 默认值开始重新调参。
• OSD **布局迁移:OSD 元素的编号和位置定义在两个固件中不完全相同,建议重新配置。
• *电机/接收机配置*:电机顺序、电调协议、接收机协议等基础配置在两者间基本兼容,可直接迁移。
• 固件刷写:切换固件时,建议使用 STM32CubeProgrammer 或 DFU 方式完全擦除闪存后再刷写新固件,避免残留配置导致异常。
10.7.2 ArduPilot ↔ Betaflight/INAV 切换
ArduPilot 与 Betaflight/INAV 的参数体系完全不同,迁移工作量较大:
• 参数不可直接迁移:ArduPilot 使用命名参数体系(如 ATC_RAT_RLL_P),Betaflight/INAV 使用 CLI 命令体系(如 set p_pitch = 45),两者无法自动转换。
• 遥控器设置:ArduPilot 的遥控器校准流程和通道映射与 Betaflight/INAV 不同,切换后需重新校准和配置。
• 传感器校准:加速度计、罗盘等传感器校准数据存储在飞控闪存中,固件切换后需重新校准。
• 建议策略:在切换前,分别记录两个固件的关键参数值(PID、遥控器通道映射、电机方向等),切换后手动重新配置。保留一份详细的"参数对照表"作为参考。
10.7.3 Mission Planner ↔ QGroundControl 切换
由于两者都可通过 MAVLink 协议与 ArduPilot 通信,切换成本最低:
• 参数完全兼容:ArduPilot 的参数存储在飞控端,两个地面站读写的是同一套参数,无需迁移。
• 航线文件转换:Mission Planner 使用 .way格式,QGroundControl 使用 .plan格式。两者都可通过 MAVLink 标准格式进行导入导出。
• 建议策略:日常使用中可以同时安装两个地面站,根据场景灵活选择。例如在 Windows 电脑上使用 Mission Planner 进行详细的航线规划和日志分析,在户外使用平板上的 QGroundControl 进行实时监控和简单任务调整。
10.7.4 通用迁移建议
1. 备份为先:在切换任何固件或地面站之前,务必完整备份当前配置。Betaflight/INAV 使用 diff all或 dump all命令;ArduPilot 使用 Mission Planner 的"Write Params to File"功能。
2. 分步切换:不要一次性切换所有参数,先确保基础飞行功能正常(电机转向、接收机响应、传感器方向),再逐步迁移高级功能。
3. 首飞保守:切换固件后的首次飞行应在开阔、安全的环境中进行,以默认参数试飞,确认无异常后再逐步调优。
4. 文档记录:建立一份飞控配置档案,记录每次固件版本、关键参数、调参历史和飞行表现,便于日后追溯和复现。
11Betaflight Configurator 配置
Betaflight Configurator 是 ZP-MH743 飞控在 Betaflight 固件下的核心配置工具。本章将从首次连接开始,逐步深入到各项高级配置,帮助读者全面掌握 Betaflight Configurator 的使用方法。特别针对 FPV 花飞和 PID 调参两大核心场景,提供详尽的实操指南和经验分享。
11.1 校准加速度计
做法:打开 Betaflight App 并连接飞控,拆除螺旋桨,将机体放在坚固、水平且无振动的桌面上,点击“校准加速度计”。在出现完成提示前不要移动或触碰机体。 作用:建立飞控对重力方向和水平姿态的基准,供 ANGLE、HORIZON、姿态显示以及需要姿态信息的导航/救援功能使用。

做法:看到“加速度计校准完成”后,保持机体水平,检查俯仰和横滚是否接近 0°。轻轻向前、向后和左右倾斜机体,确认页面中的 3D 模型与真实动作方向一致;若方向不一致,先修正飞控板方向或传感器对齐,再重新校准。 作用:验证校准值、坐标轴方向和板载安装方向是否正确,避免自稳模式给出反向修正而导致起飞即侧翻。
11.2 配置动力与电池监测

做法:在“动力 电池”中按实际硬件选择电压计和电流计来源,填写电芯最低、最高、告警电压及电池容量。连接电池后,用可信万用表或功率计的读数对照页面数值,通过“校准”或调整电压比例、分压器数值、电流比例和偏移量,使显示值与实测值一致,然后保存。 作用:让飞控正确计算总电压、电流和已用容量,从而提供低电压告警、OSD 电量显示和必要的电池保护依据。
11.3 电机配置
做法:彻底拆除全部螺旋桨,在“电机”页面启动“重新排序电机”向导并给电调上电。软件会低速转动某一电机,点击示意图中与实际转动电机对应的位置;按提示重复,直到所有电机位置完成映射。 作用:把飞控的电机输出编号与机架上的真实安装位置对应起来,使横滚、俯仰和偏航控制能够驱动正确的电机。

做法:保持螺旋桨拆除,在电机方向向导中逐个选择 1~4 号电机(或使用 All),观察实际旋转方向是否与图中的箭头和当前 Props In/Props Out 设置一致;不一致时执行反转并重新检查。 作用:保证每个电机的旋转方向与混控器和螺旋桨安装方向一致,才能产生正确的升力和反扭矩。
11.4 接收机配置

做法:先在“端口”页对接收机所连接的 UART 启用 Serial RX;再到“接收机”页选择“串行(通过 UART)”和实际协议(截图为 CRSF)。打开遥控器并完成绑定,检查 A/E/R/T 与各 AUX 条随摇杆和开关正确变化,按遥控器设置调整通道映射和端点,使主通道大致达到 1000/1500/2000,油门最低值也要处于可识别范围。 作用:让飞控正确解析遥控器的横滚、俯仰、偏航、油门和开关指令,并在协议支持时获得遥测和链路质量信息。
11.5 飞行模式设置(Angle / Horizon / Acro)
Betaflight 提供三种基本飞行模式,通过遥控器上的开关切换:

做法:在“模式”页给 ARM 选择 AUX1,并把有效范围放在截图所示的高位区间(1700~2100);给 ANGLE 选择 AUX2,并按遥控器开关位置设置对应范围。拨动开关时观察黄色通道指示线,确认它确实进入和离开黄色有效区,最后点击“保存”。 作用:ARM 决定何时允许电机进入解锁状态,ANGLE 用于启用带最大倾角限制的自稳模式;清晰分离各区间可避免一个开关位置同时误触发多个模式。

做法:继续在“模式”页为支持的功能划分三段开关范围,例如将 AUX2 的中位 1300~1700 分配给 ALTHOLD,低位 900~1300 分配给 POS HOLD。保存后逐档拨动开关,确认只有预期模式被激活;MAG、HEADFREE、FAILSAFE 等未计划使用的模式保持未分配。 作用:利用三段开关在飞行中选择不同辅助模式。高度保持依赖可靠的高度估计,位置保持通常还依赖加速度计、气压计、GPS 等传感器和对应固件功能;模式范围只负责“何时启用”,不能替代硬件安装、校准与参数检查。
更多模式
| 模式(界面名称) | 中文 / 类别 | 作用 |
|---|---|---|
| ARM | 解锁|安全 | 解锁飞控,使 PID 控制与电机输出进入可飞行状态;关闭后为上锁。 |
| ANGLE | 自稳|飞行 | 限制最大倾角,并让横滚/俯仰摇杆回中时机体自动回到水平。 |
| HORIZON | 地平|飞行 | 小杆量时自动回正,大杆量时逐渐过渡为 Rate/Acro,可完成翻滚。 |
| ALTHOLD | 定高|导航 | 自动调节油门以保持当前高度,驾驶员仍可控制水平运动和航向。 |
| ANTI GRAVITY | 抗重力|控制 | 在油门快速变化时增强 I 项等补偿,减少抬头、低头或姿态下沉。 |
| MAG | 航向保持|导航 | 利用磁力计保持机头航向,抑制偏航漂移。 |
| HEADFREE | 无头|飞行 | 把横滚/俯仰指令按固定参考航向解释,不随当前机头朝向旋转。 |
| HEADADJ | 航向重置|动作 | 把当前机头方向设为 HEADFREE 的新参考方向。 |
| CAMSTAB | 云台稳定|外设 | 根据机体姿态驱动相机云台舵机,使画面尽量保持水平。 |
| POS HOLD | 定点|导航 | 自动维持当前水平位置,驾驶员可通过摇杆改变目标位置。 |
| PASSTHRU | 直通|固定翼 | 将接收机操纵量直接送往固定翼舵机,绕过姿态稳定控制。 |
| BEEPER | 蜂鸣器|动作 | 主动鸣叫,用于寻找飞行器、确认状态;可同时触发已配置的 DShot Beacon。 |
| LEDLOW | 灯带关闭|外设 | 关闭或压低可编程 LED 灯带输出,常用于省电或减少夜间干扰。 |
| CALIB | 空中校准|校准 | 启动飞行中加速度计横滚/俯仰偏置校准,用于修正自稳模式的水平。 |
| OSD DISABLE | 关闭叠加|显示 | 临时隐藏 OSD 字符叠加,让视频画面不显示飞行数据。 |
| TELEMETRY | 遥测|通信 | 按开关启用或关闭遥测数据输出。 |
| SERVO1 | 舵机 1|外设 | 按模式条件控制自定义飞机混控中的第 1 路舵机功能。 |
| SERVO2 | 舵机 2|外设 | 按模式条件控制自定义飞机混控中的第 2 路舵机功能。 |
| SERVO3 | 舵机 3|外设 | 按模式条件控制自定义飞机混控中的第 3 路舵机功能。 |
| BLACKBOX | 黑匣子|日志 | 控制 Blackbox 日志记录;分配开关后可只在需要时记录飞行数据。 |
| FAILSAFE | 强制失控|测试 | 人为触发第二阶段失控保护,用于验证降落、掉落或 GPS Rescue 等策略。 |
| AIR MODE | 空中模式|控制 | 在零油门附近仍保持完整 PID 控制权,提升翻滚、滑行和低油门姿态控制。 |
| 3D DISABLE | 关闭 3D|控制 | 在已启用 3D 功能时,激活该模式会临时取消双向推力,改用普通单向油门逻辑。 |
| FPV ANGLE MIX | 视角混合|控制 | 按相机上仰角混合横滚与偏航,使倾斜相机画面中的转弯更接近水平视角。 |
| BLACKBOX ERASE | 擦除日志|动作 | 擦除板载 FlashFS 中的 Blackbox 日志。 |
| CAMERA CONTROL 1 | 相机动作 1|外设 | 触发兼容 FPV 相机/RC Device 中预先配置的第 1 个控制动作。 |
| CAMERA CONTROL 2 | 相机动作 2|外设 | 触发兼容 FPV 相机/RC Device 中预先配置的第 2 个控制动作。 |
| CAMERA CONTROL 3 | 相机动作 3|外设 | 触发兼容 FPV 相机/RC Device 中预先配置的第 3 个控制动作。 |
| FLIP OVER AFTER CRASH | 撞机翻转|安全 | 俗称 Turtle Mode:上锁后用电机反转脉冲把倒扣的多旋翼翻回正面。 |
| PREARM | 预解锁|安全 | 在 ARM 前增加第二道开关条件,降低误碰解锁开关造成启动的风险。 |
| GPS BEEP SATELLITE COUNT | 卫星数播报|提示 | 用蜂鸣次数提示当前可见/已使用的 GPS 卫星数量。 |
| VTX PIT MODE | 图传维修模式|图传 | 让支持的模拟图传进入极低功率 Pit Mode,减少对其他飞手频道的干扰。 |
| USER1 | 用户模式 1|扩展 | 提供通用逻辑开关,可通过 PINIOBox 控制外设 GPIO 或供其他功能监视。 |
| USER2 | 用户模式 2|扩展 | 提供第 2 个通用逻辑开关,可通过 PINIOBox 控制外设或作为自定义触发条件。 |
| USER3 | 用户模式 3|扩展 | 提供第 3 个通用逻辑开关,可通过 PINIOBox 控制外设或作为自定义触发条件。 |
| USER4 | 用户模式 4|扩展 | 提供第 4 个通用逻辑开关,可通过 PINIOBox 控制外设或作为自定义触发条件。 |
| PID AUDIO | PID 音频|调试 | 把 PID 控制器状态编码为音频信号,供特殊调试或调参流程监听/记录。 |
| PARALYZE | 瘫痪锁定|安全 | 触发后让飞行器保持不可解锁状态,通常要断电重启才能恢复。 |
| GPS RESCUE | GPS 救援|导航 | 引导多旋翼爬升、返向 Home 并接近起飞点;可作为手动救援或失控策略。 |
| ACRO TRAINER | 特技训练|飞行 | 保持 Acro 的速率手感,但利用加速度计限制最大倾角,帮助练习手动姿态。 |
| VTX CONTROL DISABLE | 锁定图传控制|图传 | 禁止 Betaflight 通过 OSD/控制链路更改图传频道、频段或功率。 |
| LAUNCH CONTROL | 起步控制|竞速 | 起跑前保持机体预定俯仰/姿态,松开条件后快速释放,用于竞速发车。 |
| MSP OVERRIDE | MSP 接管|通信 | 允许来自 MSP/伴飞计算机的已选通道覆盖接收机输入。 |
| STICK COMMANDS DISABLE | 禁用杆量指令|安全 | 禁用由四个摇杆组合触发的校准、配置切换、保存和杆量解锁等命令。 |
| BEEPER MUTE | 蜂鸣静音|提示 | 压制蜂鸣器状态音和警告音,适合需要临时安静的场合。 |
| READY | 准备就绪|竞赛 | 向 OSD/状态系统标记“已准备”,用于竞赛发车或流程协同。 |
| LAP TIMER RESET | 圈速清零|竞赛 | 重置基于 GPS 的圈速计时与相关统计。 |
| CHIRP | 扫频激励|调试 | 执行频率扫掠激励,采集机体响应,供系统辨识、滤波/控制分析或 Autotune 流程使用。 |
| AUTOPILOT | 飞行计划|实验 | 按预设飞行计划/航点执行自动飞行控制。 |
11.6 更多功能
固件更新(Firmware Flasher)
用于选择目标板、固件版本和编译功能,并构建、下载和写入 Betaflight 固件。刷写通常会清除原配置,应先保存 diff/备份,自动识别后仍要核对 Target,刷写完成再逐项复查参数。
端口(Ports)
把各 UART 分配给 MSP、Serial RX、GPS、遥测、VTX 控制等外设。UART 必须与实际焊接的 RX/TX 端口一致;不要把 MSP 当作普通开关,也不要无必要地在同一 UART 上制造功能冲突。
配置(Configuration)
集中设置机架/混控、陀螺仪与 PID 循环频率、接收机和电调协议、板方向以及固件功能开关。这些选项直接影响控制周期、CPU 负载和外设可用性,应按目标板、陀螺仪和电调能力设置。
失控保护(Failsafe)
定义遥控链路丢失后飞控的处理方式,例如立即停转、受控下降或 GPS Rescue。应让接收机在失联时停止发送有效数据,并在拆桨台架和安全场地验证失控保护确实会按预期触发。
预设(Presets)
通过一组 CLI 命令快速应用调参、滤波、遥控链路、OSD、VTX 等配置。优先选择与当前固件版本和机型匹配的官方预设;社区预设要先阅读说明、查看将执行的 CLI,并在备份后谨慎应用。
PID 调校(PID Tuning)
调整 PID 增益、前馈、摇杆 Rates/Expo、油门曲线以及陀螺仪和 D 项滤波,并可使用多个 PID/Rate Profile。修改应小步进行,结合电机温度、振动、回弹和 Blackbox 日志判断,避免盲目减滤波或大幅提高 D 值。
调整(Adjustments)
把 AUX 开关或旋钮映射为飞行中的参数调整工具,可做增减式或绝对值调整。它适合有经验的调参验证,但误操作可能使飞行器立刻不稳定;调整值通常还需要在落地后显式保存。
舵机(Servos)
设置舵机最小、中点、最大值、方向、速率以及接收机通道映射,常用于固定翼、三旋翼、云台或特殊机构。端点要避免机械顶死,舵机供电和资源映射也必须满足硬件要求。
GPS
选择 UBLOX、NMEA 或 MSP 等协议,配置自动设置、卫星系统和 Home 点策略,并查看 3D Fix、卫星数、位置、速度和精度。GPS 数据供 OSD、GPS Rescue 和支持的位置功能使用;未获得可靠 3D Fix 前不能依赖导航功能。
电机(Motors)的其他设置
除编号和旋向外,还用于选择 Mixer、DShot 协议、双向 DShot、磁极数、动态/静态怠速、3D 模式和电机测试。双向 DShot 是 RPM 滤波的重要前提,磁极数必须正确;任何台架转动测试都必须拆除螺旋桨。
OSD
把电压、电流、已用容量、链路质量、飞行时间、GPS、告警等信息布置到 FPV 画面,并设置单位、制式和 OSD Profile。应优先显示飞行安全相关信息,避免元素过多遮挡画面。
视频发射(Video Transmitter)
配置模拟或 HDZero 图传的频段、信道、功率、Pit Mode、低功率解锁和 VTX Table。通常需要先在端口页启用 SmartAudio 或 Tramp;频率和发射功率必须遵守当地法规,DJI/Walksnail 通常不依赖此页。
LED 灯带(LED Strip)
定义可编程 LED 的位置、朝向、颜色和功能,使其显示解锁状态、飞行方向、模式、警告或电量。只有固件包含 LED_STRIP 且信号线接到正确资源时才生效,同时要核对灯带电压和总电流。
传感器(Sensors)
查看并启用陀螺仪、加速度计、磁力计、气压计、测距和光流等硬件,设置板方向/传感器方向,完成校准并观察实时曲线。安装方向或校准错误会直接污染姿态和导航估计,应先解决传感器错误再调飞行参数。
线传日志(Tethered Logging)
通过当前有线连接实时采集调试数据,适合台架检查和短时诊断,不占用板载 Flash/SD 卡。有线状态限制机体运动,不能把它当作正常自由飞行记录方式。
黑盒(Blackbox)与 Blackbox Viewer
设置日志存储设备、采样率和 Debug 模式,下载或擦除日志;新版 App 还可直接用 Viewer 查看曲线、频谱、姿态和 GPS 轨迹。Blackbox 是排查振动、电机噪声、PID 回弹和失控原因的主要证据,采样率应兼顾细节与存储容量。
命令行(CLI)
提供图形界面未覆盖的完整参数、资源映射、诊断和备份能力。常用 diff all/dump 备份配置,修改后用 save 保存并重启。CLI 命令和变量具有版本差异,错误的 resource/set 操作可能导致端口、传感器或电机输出失效。
12Mission Planner 配置(ArduPilot)
12.1 Mission Planner安装与连接
Mission Planner是ArduPilot生态中常用的Windows地面站软件,可用于固件刷写、参数配置、传感器校准、飞行模式设置、航线规划以及日志下载与分析。第一次连接飞控时,建议先通过USB完成基础配置,再根据户外使用需要配置数传电台或WiFi数传。
12.1.1 软件安装
访问ArduPilot官方Mission Planner页面,下载当前稳定版本的安装程序。
运行安装程序,根据安装向导完成软件与驱动安装。
安装完成后启动Mission Planner。首次启动可能需要等待地图、驱动和组件初始化。
连接飞控前关闭INAV Configurator、Betaflight Configurator、QGroundControl及其他串口工具,避免COM端口被占用。
12.1.2 USB连接
| 使用USB数据线连接飞控 ↓ 右上角选择正确COM口 ↓ 波特率选择115200 ↓ 点击Connect |
|---|
确认使用的是能够传输数据的USB线,而不是仅供充电的电源线。
打开Windows设备管理器,展开“端口(COM和LPT)”,插拔飞控并观察新增或消失的COM口。
在Mission Planner右上角选择对应COM口,波特率选择115200,然后点击“Connect”。
连接成功后会自动读取参数,HUD能够显示飞控姿态,右上角按钮变为“Disconnect”。
| 连接失败排查:依次更换USB数据线、检查设备管理器、关闭其他地面站和串口工具、重新启动Mission Planner,并重新选择COM口。若仍无端口,应检查USB驱动、飞控供电和BOOT模式。 |
|---|
12.1.3 数传电台连接
户外飞行时通常不便使用USB线,可使用SiK数传电台或WiFi数传模块实现Mission Planner与飞控之间的MAVLink通信。
(1)SiK数传电台
将地面端数传电台连接至电脑USB口。
将机载端数传电台连接至飞控的TELEM1或TELEM2接口,并确认TX、RX、5V和GND接线正确。
在Mission Planner右上角选择地面端数传对应的COM口。
波特率通常选择57600;如果厂家修改过电台串口速率,应以实际设置为准。
点击Connect,等待参数读取完成。
(2)WiFi数传
电脑连接WiFi数传模块的热点后,在Mission Planner中选择UDP或TCP连接。UDP常用端口为14550,但实际IP地址和端口应以模块说明书为准。
12.2 初始设置向导
进入“初始设置(INITIAL SETUP)”后,应按照机架类型、飞控方向、加速度计、罗盘、遥控器、输出映射、电调、飞行模式和电机测试的顺序完成配置。前一项未验证正确时,不要继续下一项。
12.2.1 机架类型配置
| 初始设置 ↓ 必要硬件 ↓ 机架类型 |
|---|
机架类型决定飞控采用哪一种电机混控关系。普通X型四旋翼应选择Quad(四旋翼)和X布局,对应参数通常为FRAME_CLASS=1、FRAME_TYPE=1。

*图12-1 机架类型选择界面*
截图来源:用户实际操作界面
操作步骤
确认无人机实际为四旋翼,且四个机臂呈X型布置。
在上方Frame Class区域选择四旋翼图标。
在下方机架类型区域选择X布局,不要误选Plus、Y6、H、V尾或其他机型。
写入设置后重启飞控,再进入页面确认Class为Quad、Type为X。
| 图中说明:截图中的“X,Y6A”行包含多种布局图标,实际使用普通X型四旋翼时只选X型四旋翼图标。不要根据图标颜色盲目复制其他机架。 |
|---|
12.2.2 加速度计校准与水平校准
| 初始设置 ↓ 必要硬件 ↓ 加速度计校准 |
|---|
加速度计校准用于修正三轴传感器的零偏、比例和安装误差,是ArduCopter的必要校准项目。若飞控箭头未指向机头,应先正确设置AHRS_ORIENTATION,再进行六面校准。

*图12-2 加速度计校准与校准水平界面*
截图来源:用户实际操作界面
(1)完整六面校准
拆除全部螺旋桨,将无人机放在稳定、平整的表面上。
点击“校准加速度计”。
按照屏幕提示依次完成:水平正放、左侧朝下、右侧朝下、机头朝下、机头朝上和倒置。
每个姿态放稳后保持完全静止,再点击确认或按提示继续。
出现“Calibration Successful”后重启飞控。
(2)校准水平
“校准水平”只用于重新设定当前安装状态下的水平基准,不等同于完整六面校准。六面校准已经成功,但HUD在机械水平状态下存在小幅倾斜时,可将整机前后、左右调平后点击“校准水平”。
| 不要手动猜参数:新手不建议直接填写AHRS_TRIM_X或AHRS_TRIM_Y。应优先使用“校准水平”按钮;若飞控安装方向改变、六面校准失败或姿态误差较大,则必须重新完成六面校准。 |
|---|
12.2.3 罗盘校准
| 初始设置 ↓ 必要硬件 ↓ 指南针/罗盘 ↓ Onboard Mag Calibration |
|---|
罗盘用于提供航向信息。罗盘校准应在加速度计校准完成后进行,并尽量选择室外、远离车辆、钢筋、铁门、手机、电脑、电源和大电流线缆的环境。
确认Mission Planner已检测到内部或外置罗盘。外置GPS罗盘通常距离电机和电调更远,可作为优先罗盘。
点击Onboard Mag Calibration中的Start按钮。
缓慢转动整架无人机,使六个面都朝向不同方向,覆盖完整空间姿态。
所有启用罗盘显示校准成功后,重启飞控。
把无人机水平转动90°,确认Mission Planner中的机头方向同步转动且方向一致。
| 判断标准:不要只依据Offsets是否小于某个固定值判断校准质量。应综合查看校准是否成功、罗盘一致性、航向是否正确以及是否存在EKF compass variance等预解锁提示。 |
|---|
12.2.4 遥控器校准
| 初始设置 ↓ 必要硬件 ↓ 遥控器校准 |
|---|

图*12-3 遥控器校准界面*
截图来源:用户实际操作界面
遥控器校准用于记录每个通道的最小值、最大值和中位值。校准前应断开动力电池,打开遥控器并确保接收机已经对频。
| 截图状态:图12-3中所有通道均显示0,说明当时飞控没有收到有效的遥控器输入。此时不能直接点击校准,应先检查接收机供电、对频、信号线和串口协议。 |
|---|
操作步骤
进入遥控器校准页面,移动摇杆,确认相应通道条能够变化。
点击“校准遥控”,按提示将所有摇杆推到四个角和全部极限位置。
将所有旋钮和辅助开关拨到全部挡位,尤其是飞行模式开关。
点击“完成”,将横滚、俯仰和偏航摇杆回中,油门保持最低。
确认CH1至CH4的中位值约为1500,端点通常接近1100和1900。
| 通道 | 默认功能 | 验证方法 |
|---|---|---|
| CH1 | Roll 横滚 | 右摇杆左右移动时变化 |
| CH2 | Pitch 俯仰 | 右摇杆前后移动时变化 |
| CH3 | Throttle 油门 | 左摇杆上下移动时变化 |
| CH4 | Yaw 偏航 | 左摇杆左右移动时变化 |
| CH5 | 飞行模式(默认) | 拨动模式开关时变化 |
如果通道顺序与实际遥控器不一致,可修改RCMAP_ROLL、RCMAP_PITCH、RCMAP_THROTTLE和RCMAP_YAW。修改映射后应重启飞控并重新进行遥控器校准。
12.2.5 Servo Output输出映射
| 初始设置 ↓ 必要硬件 ↓ Servo Output |
|---|

图12-4 Servo Output输出映射界面
截图来源:用户实际操作界面
Servo Output页面用于设置每个物理输出端口对应的功能、最小值、中位值和最大值。图中输出1至输出4分别被映射为Motor2、Motor3、Motor4和Motor1,这是当前ZP_MH743固件与板级输出定义的实际配置示例。
| 不要照抄:不同飞控固件目标和载板的物理输出顺序可能不同。不要仅凭图12-4把输出1至输出4照抄到其他飞控,应使用电机测试页面验证每个物理端口对应的电机位置。 |
|---|
| Reverse复选框:Servo Output中的Reverse主要用于反转舵机输出逻辑,不是改变普通无刷电机机械旋转方向的常规方法。无刷电机方向错误时,应交换任意两根电机相线,或在BLHeli/AM32等电调软件中设置Normal/Reversed。 |
|---|
12.2.6 电调校准
| 初始设置 ↓ 必要硬件或Optional Hardware ↓ ESC Calibration |
|---|
传统PWM电调需要校准油门端点,使各电调对最小和最大油门信号的理解一致。DShot和DroneCAN属于数字协议,通常不需要传统PWM油门行程校准。
确认全部螺旋桨已经拆除。
先查明电调支持的协议,并在飞控中设置正确的输出协议。
如果是传统PWM电调,严格按照Mission Planner页面提示和电调说明书完成上电、提示音和断电操作。
如果是DShot电调,跳过传统ESC Calibration,直接进行电机测试和方向检查。
12.2.7 飞行模式配置
| 初始设置 ↓ 必要硬件 ↓ 飞行模式 |
|---|

图*12-5 飞行模式配置界面*
截图来源:用户实际操作界面
ArduCopter最多可通过一个飞行模式通道选择六个模式。默认飞行模式通道通常是CH5,由FLTMODE_CH参数指定。拨动遥控器开关时,页面中的“当前PWM”应变化,并高亮对应的飞行模式档位。
| 截图状态:图12-5中“当前PWM”为0,说明当时没有有效的飞行模式通道输入。应先返回遥控器校准页面确认模式开关对应的通道,再设置FLTMODE_CH。 |
|---|
| 挡位 | 新手推荐模式 | 说明 |
|---|---|---|
| 1 | Stabilize | 基础自稳,手动控制油门 |
| 2 | AltHold | 定高,不保持水平位置 |
| 3 | Loiter | GPS定点悬停 |
| 4 | RTL | 自动返航 |
| 5 | Stabilize或PosHold | 作为备用模式 |
| 6 | 预留 | 完成基础飞行后再设置AutoTune或Auto |
设置完成后点击“保存模式”,反复拨动开关,确认Mission Planner顶部显示的当前模式与开关挡位一致。RTL应设置在容易触及但不易误触的位置。
12.2.8 电机测试
| 初始设置 ↓ 可选硬件 ↓ 电机测试 |
|---|

图12-6 Quad X电机测试界面
截图来源:用户实际操作界面
| 最高安全要求:电机测试前必须拆除全部螺旋桨,人员、线缆和工具远离电机。测试时只短时低油门运行。 |
|---|
图中已经识别Class为Quad、Type为X。Mission Planner按A、B、C、D顺序测试电机,X型四旋翼从机头右侧电机开始,随后沿顺时针方向依次测试。
| 测试按钮 | 电机编号 | 位置 | 图中要求方向 |
|---|---|---|---|
| A | Motor 1 | 右前 | CCW 逆时针 |
| B | Motor 4 | 右后 | CW 顺时针 |
| C | Motor 2 | 左后 | CCW 逆时针 |
| D | Motor 3 | 左前 | CW 顺时针 |
测试步骤
测试持续时间先设置为2秒。
油门百分比先设置为5%,点击Test motor A。
如果电机不转,可逐步提高到10%,必要时短暂测试15%,不要直接提高到较高油门。
依次测试A、B、C和D,记录实际转动位置和方向。
点击Stop all motors停止所有输出。
| Spin Arm与Spin Min:“Set Motor Spin Arm”用于设置解锁后地面怠速,“Set Motor Spin Min”用于设置飞行中的最小电机输出。新手不应在尚未完成电调校准和电机测试时随意点击。 |
|---|
12.3 完整参数配置与管理
12.3.1 参数管理界面
Mission Planner的“配置/调试(CONFIG/TUNING)”页面提供完整参数表、参数树、文件导入导出和差异比较功能。修改重要参数前,应先保存当前参数文件。
| 功能 | 作用 |
|---|---|
| Full Parameter List | 显示全部参数,可搜索、修改并写入飞控 |
| Full Parameter Tree | 按功能分类浏览参数 |
| Write Params | 将修改后的参数写入飞控 |
| Refresh Params | 重新读取飞控中的参数 |
| Save to File | 导出参数文件,用于备份 |
| Load from File | 从参数文件导入设置 |
| Compare | 对比当前参数与文件之间的差异 |
| 操作习惯:一次只修改一个功能组,写入后重启并验证。不要把其他机架、其他固件版本或其他飞控的完整参数文件直接导入ZP-MH743。 |
|---|
12.3.2 基础参数
| 参数 | 作用 | 设置原则 |
|---|---|---|
| FRAME_CLASS | 机架大类 | 普通四旋翼选择Quad,通常为1 |
| FRAME_TYPE | 电机布局 | 普通X型选择X,通常为1 |
| AHRS_ORIENTATION | 飞控安装方向 | 按飞控箭头实际安装方向设置 |
| FLTMODE_CH | 飞行模式输入通道 | 默认通常为5,按遥控器实际通道设置 |
| ARMING_CHECK | 解锁前安全检查 | 保持全部检查开启,通常为1 |
| ARMING_RUDDER | 摇杆解锁/上锁 | 需要摇杆解锁时按实际需求设置 |
| BATT_MONITOR | 电池监测类型 | 按电源模块和飞控硬件设置 |
| BATT_CAPACITY | 电池容量 | 填写实际额定容量,单位mAh |
| MOT_PWM_TYPE | 电调输出协议 | 按PWM、DShot或其他实际协议设置 |
12.3.3 PID与初始调参原则
ATC_RAT_RLL_P/I/D、ATC_RAT_PIT_P/I/D和ATC_RAT_YAW_P/I/D分别控制横滚、俯仰和偏航角速度环。不同机架尺寸、桨叶、电机、电池和重量对应的合适增益差异很大,因此不应把网络教程中的固定数值直接写入。
| 推荐流程:先使用固件默认值完成低空首飞,确认机械振动和滤波正常,再通过Initial Tune Parameters、日志、QuikTune或AutoTune逐步调节。 |
|---|
| 现象 | 首先排查 | 最后才考虑 |
|---|---|---|
| 起飞立即侧翻 | 电机位置、转向、桨叶、飞控方向 | PID |
| 原地高速自旋 | CW/CCW、电机编号、偏航通道 | 偏航PID |
| 高频快速抖动 | 桨、电机、机架、VIBE、滤波 | P/D增益 |
| 悬停缓慢漂移 | 遥控中位、水平校准、风、GPS | I项 |
| AltHold上下跳动 | 振动、气压计、悬停油门 | 高度参数 |
12.3.4 导航与返航参数
常用导航参数包括航点速度、爬升/下降速度、航点加速度、返航高度和降落速度。较新固件中部分高度参数使用“_M”后缀并以米为单位,旧版本则可能使用厘米。修改前必须查看Mission Planner当前参数说明中的单位。
| 功能 | 常见参数 | 设置原则 |
|---|---|---|
| 航点水平速度 | WPNAV_SPEED |
根据机体性能和任务场景逐步设置 |
| 航点爬升/下降速度 | WPNAV_SPEED_UP / WPNAV_SPEED_DN |
初次任务使用保守速度 |
| 航点加速度 | WPNAV_ACCEL |
过大可能造成急加速和大倾角 |
| 返航高度 | RTL_ALT_M或版本对应参数 |
高于返航路径上的最高障碍物 |
| 返航最终高度 | RTL_ALT_FINAL_M或版本对应参数 |
0通常表示最终降落 |
| 降落速度 | LAND_SPD_MS或版本对应参数 |
根据机体和起落架安全设置 |
12.4 常用飞行模式详解
12.4.1 Stabilize(自稳模式)
Stabilize模式会自动将横滚和俯仰恢复到水平,但不会自动保持高度或水平位置。飞手需要手动控制油门。该模式适合首飞、基础姿态检查和GPS异常时的人工接管。
12.4.2 AltHold(定高模式)
AltHold使用气压计和惯性传感器保持高度。横滚、俯仰和偏航仍由飞手控制,松开横滚和俯仰摇杆后飞机回平,但不会自动保持水平位置。油门处于中位死区时保持高度,离开死区后控制上升或下降。
12.4.3 Loiter(定点模式)
Loiter会保持高度、航向和水平位置,需要可靠的GPS位置、罗盘和低振动。摇杆控制水平移动和升降,松开摇杆后飞机减速并重新定点。首次测试前必须先确认AltHold稳定。
12.4.4 RTL(自动返航)
RTL会根据返航参数先调整到安全高度,再返回Home或最近的Rally Point,随后悬停或降落。返航高度必须高于返航路径中的障碍物。RTL依赖GPS、罗盘和EKF,不能把传感器异常时的RTL当作万能救援手段。
12.4.5 Auto(自动任务模式)
Auto按照已经上传到飞控的任务航点执行自动飞行。使用前应完成航线回读、障碍物检查、电池余量评估、Loiter和RTL验证,并准备随时切换至人工模式接管。
12.4.6 Guided(引导模式)
Guided由地面站、伴随计算机或MAVLink指令实时发送目标位置。它不要求预先定义完整任务,但依赖可靠的通信链路和位置估计。
12.4.7 Drift(漂移模式)
Drift采用类似车辆的操控方式,适合特定飞行体验,不是初学者首飞必需模式。其工作仍依赖良好的姿态与速度估计。
12.4.8 PosHold(位置保持模式)
PosHold在摇杆居中时保持位置、航向和高度,飞手的横滚和俯仰输入直接控制倾斜角。它同样需要可靠GPS和罗盘。通常优先推荐Loiter,熟悉后再使用PosHold。
12.4.9 新手测试顺序
| Stabilize短暂离地 ↓ Stabilize约1米悬停 ↓ AltHold定高 ↓ Loiter定点 ↓ RTL返航 ↓ Auto任务 |
|---|
| 原则:当前模式不稳定时,不要进入下一模式。发现异常应立即切回Stabilize或AltHold,并在安全位置降落。 |
|---|
12.5 地理围栏与安全保护
12.5.1 地理围栏
地理围栏用于限制最大高度、最大半径或多边形区域。设置围栏前必须保证位置估计可靠,否则可能出现“Fence enabled, need position estimate”等预解锁提示。
在飞行计划或围栏页面绘制允许飞行的区域。
设置最大高度和最大半径,并根据任务场景选择围栏触发后的动作。
上传围栏后回读确认,并在低风险条件下验证。
围栏不能替代人工观察、合法空域确认和障碍物避让。
12.5.2 遥控器失控保护
遥控器失控保护在飞控检测到RC信号丢失或油门通道低于失控阈值时触发。可通过Mission Planner故障保护页面设置RTL、Land或SmartRTL等动作。实际动作应根据GPS可靠性、飞行距离和场地环境选择。
| 测试方法:拆桨状态下连接Mission Planner,打开遥控器确认通道正常,然后关闭遥控器,观察HUD和Messages是否出现Radio Failsafe。 |
|---|
12.5.3 电池失控保护
ArduCopter支持低电量和严重低电量两级保护。常见做法是低电量执行RTL,严重低电量执行Land。电压阈值必须根据电池串数、类型、负载压降和实际容量设置,不能照抄其他无人机。
12.5.4 GCS失控保护
GCS失控保护通过MAVLink心跳判断地面站连接是否中断。主要参数包括FS_GCS_ENABLE和FS_GCS_TIMEOUT。只有飞行过程中确实依赖地面站控制或监控时,才应根据任务需求配置相应动作。
12.5.5 EKF与位置估计保护
旧教程中的FS_GPS_ENABLE已经被归档。当前ArduCopter主要通过EKF失控保护监测位置、速度和罗盘估计质量。关键参数包括FS_EKF_ACTION和FS_EKF_THRESH。发生EKF异常时,GPS依赖模式可能自动切换至Land或AltHold等安全模式。
| 不要关闭安全检查:出现PreArm、EKF variance或Compass inconsistent等提示时,应排查传感器、安装方向、振动、GPS和电磁干扰,不应通过关闭ARMING_CHECK或把阈值调得极端来强制起飞。 |
|---|
12.6 日志分析与飞行数据回放
12.6.1 日志类型
| 日志类型 | 文件格式 | 主要用途 |
|---|---|---|
| DataFlash日志 | .bin | 飞控本地记录,包含传感器、姿态、PID、EKF和电机等详细数据 |
| MAVLink遥测日志 | .tlog | 地面站记录通信数据,可回放HUD和地图轨迹 |
12.6.2 DataFlash日志下载
| 飞行数据(DATA) ↓ DataFlash Logs ↓ Download Logs ↓ 选择日志并下载 |
|---|
飞行后先断桨或确保电机无法意外启动,再连接Mission Planner。
进入DataFlash Logs页面读取日志列表。
选择需要的.bin日志并下载到电脑。
使用Review a Log或Log Browser打开并分析。
12.6.3 关键数据检查
| 数据组 | 重点字段 | 用途 |
|---|---|---|
| 振动 | VIBE.VibeX/Y/Z、Clip0/1/2 | 判断机械振动和加速度计削波 |
| 姿态 | ATT.DesRoll/Roll、DesPitch/Pitch | 比较目标姿态与实际姿态 |
| 角速度PID | PIDR、PIDP、PIDY | 观察角速度误差和PID输出 |
| 电池 | BAT.Volt、Curr、CurrTot | 检查压降、电流和容量消耗 |
| 位置估计 | XKF/NKF相关字段 | 判断GPS、罗盘和EKF健康状态 |
| 高度控制 | CTUN或版本对应字段 | 观察高度、爬升率和油门输出 |
振动分析应优先查看VIBE和Clip计数,而不是只看原始ACC曲线。Vibe大部分时间低于约30 m/s²通常较理想,超过60 m/s²并伴随Clip持续增加时,应优先处理螺旋桨、电机、机架和飞控减震。
12.6.4 飞行数据回放
Mission Planner可以打开.tlog文件进行HUD和地图回放。回放时可调整速度,定位模式切换、失控保护、位置跳变或电池压降发生的时间点,并与.bin日志中的传感器数据进行交叉分析。
12.7 多旋翼与固定翼配置差异
12.7.1 机架类型
| 项目 | 多旋翼 | 固定翼 |
|---|---|---|
| 机架配置 | 使用FRAME_CLASS和FRAME_TYPE选择Quad、Hexa等布局 |
不使用多旋翼电机混控,需配置机翼、尾翼和舵面输出 |
| 起降方式 | 垂直起降 | 滑跑、手抛、弹射或跑道降落 |
| 动力输出 | 多个电机共同控制姿态和升力 | 通常一个主电机加多个舵机 |
12.7.2 飞行模式
| 多旋翼常用模式 | 固定翼对应模式 | 说明 |
|---|---|---|
| Stabilize | Manual / Stabilize | 基础人工与姿态稳定 |
| AltHold | 无完全等价模式 | 固定翼通常通过高度与速度控制系统保持飞行状态 |
| Loiter | Loiter | 多旋翼定点悬停,固定翼绕点盘旋 |
| RTL | RTL | 自动返回Home |
| Auto | Auto | 执行航点任务 |
| Guided | Guided | 接受地面站或伴随计算机指令 |
| — | FBWA / FBWB / CRUISE | 固定翼常用辅助飞行模式 |
12.7.3 传感器与执行机构
多旋翼主要依靠IMU、气压计、罗盘、GPS和电机混控;固定翼通常还需要空速管、副翼、升降舵、方向舵以及相应舵机行程和反向配置。固定翼的舵机反向可以在Servo Output中设置,而多旋翼无刷电机的机械转向通常通过换相线或电调软件修改。
12.7.4 PID参数体系
多旋翼使用ATC_RAT_RLL/PIT/YAW等姿态控制参数;固定翼使用横滚、俯仰、偏航速率控制参数,并涉及L1导航和TECS总能量控制。两套参数体系不能相互照抄。
12.8 解锁、上锁与遥控器快捷开关设置
ArduCopter只有在解锁(ARMED)后才允许电机进入正常工作状态。解锁不是简单的“启动电机”动作:飞控会先检查传感器、遥控器、飞行模式、电池、位置估计和安全开关等条件。第一次操作必须拆除全部螺旋桨,并在Mission Planner中观察PreArm提示。
| 严重安全警告:快捷开关配置错误、开关方向设置错误或飞行中误触,可能使电机立即停转。所有解锁、上锁、紧急停机和辅助通道测试,必须先在拆桨状态下完成。不得通过ARMING_CHECK=0绕过故障。 |
|---|
12.8.1 解锁前必须满足的条件
拆除全部螺旋桨,清理电机周围的工具、线缆和其他物体。
先打开遥控器,再给飞控和电调上电;上电后将无人机放平并保持静止,等待陀螺仪初始化完成。
油门摇杆保持最低,飞行模式优先切换到Stabilize。不要在RTL、Brake、Land、Circle或其他不允许普通地面解锁的模式中反复尝试。
确认遥控器CH1至CH4输入正常,油门最低值通常接近1000~1100,偏航摇杆方向与Mission Planner显示一致。
如飞控带硬件安全开关,长按安全开关,直到安全指示灯进入允许输出的状态。
查看飞行数据页面的HUD和Messages,不得存在阻止解锁的PreArm错误。
若计划使用Loiter、RTL、Auto或Guided,应在室外等待GPS、Home和EKF位置估计正常。
确认电池电压显示与实际电池一致,不能在“Battery low voltage failsafe”等告警状态下强制解锁。
12.8.2 使用摇杆解锁和上锁
| 配置/调试 ↓ 全部参数表(Full Parameter List) ↓ 搜索 ARMING_RUDDER |
|---|
ARMING_RUDDER决定是否允许通过偏航摇杆执行解锁和上锁。它只在油门处于最低位置附近时生效。
| ARMING_RUDDER数值 | 功能 | 适用说明 |
|---|---|---|
| 0 | 禁止摇杆解锁和上锁 | 推偏航摇杆不会执行解锁动作。 |
| 1 | 只允许摇杆解锁 | 可以右偏航解锁,但不能用左偏航上锁。 |
| 2 | 允许摇杆解锁和上锁 | 适合需要使用标准摇杆动作的用户。 |
将ARMING_RUDDER设置为2,点击“Write Params”写入参数;如果界面提示需要重启,则重新上电后再验证。
Mode 2遥控器解锁:油门拉到最低,将左摇杆推到右下角,也就是“油门最低+偏航最右”,保持约5秒。
Mission Planner显示ARMED后,立即松开偏航摇杆,让其回到中间;不要持续保持右偏航超过15秒,以免进入AutoTrim相关操作。
上锁:确认飞机已经落地、油门最低,将左摇杆推到左下角,也就是“油门最低+偏航最左”,保持约2秒。
Mission Planner显示DISARMED且电机完全停止后,先断开动力电池,最后关闭遥控器。
| 标准记忆:右下角解锁,左下角上锁;但动作生效的前提是ARMING_RUDDER允许、油门确实最低、模式可解锁且所有PreArm检查通过。 |
|---|
12.8.3 使用Mission Planner地面站按钮解锁
在拆桨调试、SITL仿真或地面排故时,也可以使用Mission Planner发送解锁/上锁命令。实机测试时仍须满足所有安全检查。
进入“飞行数据(DATA)”,打开左下方“动作(Actions)”标签。
确认油门最低、模式可解锁、无人机静止且没有关键PreArm告警。
点击Arm/Disarm相关按钮,按照弹窗提示确认操作。
若地面站按钮也无法解锁,应查看Messages中的完整PreArm原因;不要连续点击,也不要关闭ARMING_CHECK。
若地面站按钮可以解锁但摇杆不能解锁,重点检查ARMING_RUDDER、CH3最低值、CH4方向和遥控器校准。
12.8.4 设置遥控器快捷解锁/上锁开关
除摇杆动作外,还可以把一个未被占用的遥控器通道分配为解锁功能。例如将遥控器两挡或三挡开关映射到CH7,再通过RC7_OPTION指定功能。CH7只是示例,也可以使用其他空闲通道,但不能与横滚、俯仰、油门、偏航或飞行模式通道重复。

图12-10 RC7_OPTION参数设置示例(截图中当前值为165)
截图来源:用户提供的ARMING文档
| 图中关键说明:用户截图中的RC7_OPTION=165不是普通的“低挡上锁、高挡解锁”,而是三挡ARM/Motor Emergency Stop功能。若只需要普通两挡解锁/上锁,应选择RCx_OPTION=153。 |
|---|
(1)先确认快捷开关使用的接收机通道
在遥控器中选择一个不易误触的开关,将它输出到空闲通道,例如CH7。不要使用默认飞行模式通道CH5。
进入“初始设置 → 必要硬件 → 遥控器校准”,拨动该开关,确认只有对应通道发生变化。
两挡开关应能达到低位小于1200 μs、高位大于1800 μs;三挡开关的中位通常处于1200~1800 μs。
如果高位达不到1800或低位降不到1200,应在遥控器端调整该通道的行程端点,然后重新校准遥控器。
(2)在全部参数表中分配功能
| 配置/调试 ↓ 全部参数表 ↓ 搜索 RC7_OPTION(或实际通道对应的RCx_OPTION) | |||
|---|---|---|---|
| RCx_OPTION | 功能名称 | 开关动作与适用场景 | |
| 153 | ARM/DISARM | 高位:在通过解锁检查后请求解锁;低位:无条件上锁。适合普通两挡快捷开关,但飞行中误拨低位风险极高。 | |
| 154 | ARM/DISARM with AIRMODE | 高位解锁并启用AirMode,低位上锁。主要面向Acro/特技应用,新手不建议使用。 | |
| 165 | ARM/Motor Emergency Stop | 三挡功能:高位请求解锁;中位解除电机急停但不请求解锁;低位执行电机紧急停止。与普通上锁并不相同。 |
普通快捷解锁/上锁:把RC7_OPTION设置为153。
使用用户截图中的三挡急停逻辑:把RC7_OPTION设置为165,并确认遥控器确实为三挡开关。
点击“Write Params”,重新启动飞控,再回到遥控器校准或Status页面检查通道PWM。
保持拆桨,先测试低位、中位和高位,观察Mission Planner中的ARMED/DISARMED状态以及Messages提示。
确认动作方向完全正确后再决定是否保留该快捷开关;不熟悉时应恢复RC7_OPTION=0并使用标准摇杆解锁。
12.8.5 选项153与165的功能区别
| 比较项目 | RCx_OPTION=153 | RCx_OPTION=165 |
|---|---|---|
| 开关类型 | 通常使用两挡开关 | 必须使用三挡开关 |
| 高位 | 请求解锁,仍受PreArm检查约束 | 请求解锁,仍受PreArm检查约束 |
| 中位 | 无独立中位功能 | 解除Motor Emergency Stop,但不主动请求解锁 |
| 低位 | 直接上锁/Disarm | 执行Motor Emergency Stop,电机输出立即停止,但飞控状态逻辑不同于普通上锁 |
| 飞行中误触风险 | 可能直接上锁,电机无法正常恢复 | 电机立即停止;快速回到中位或高位可能恢复输出,但仍可能导致坠机 |
| 新手建议 | 仅在充分理解风险、使用防误触开关并完成拆桨测试后使用 | 仅作为明确的三挡急停方案使用,不要把它当作日常上锁开关 |
12.8.6 解锁失败的快速排查
| 现象 | 优先检查 | 处理方法 |
|---|---|---|
| CH7拨动时数值不变 | 遥控器通道映射、接收机、对频和信号协议 | 先让Radio Calibration页面出现正常通道变化,再配置RC7_OPTION。 |
| 摇杆右下角无反应 | ARMING_RUDDER、CH3最低值、CH4方向、当前模式 |
设置ARMING_RUDDER=2,重新校准遥控器并切换到Stabilize。 |
| 开关高位仍不能解锁 | PreArm、硬件安全开关、电池、GPS/EKF和模式 | 查看Messages中的完整PreArm提示并逐项处理。 |
| 开关动作方向相反 | 遥控器通道反向和高低位PWM | 优先在遥控器端调整开关方向;重新检查低位1200、高位1800。 |
| 显示ARMED但电机不转 | 动力电池、电调协议、输出映射和MOT_SPIN_ARM |
确认电调上电、Servo Output映射和电机协议正确。 |
| 出现Battery low voltage failsafe | 电池电压、电池监测比例和保护阈值 | 先校准电压并使用充足电量的电池,不要绕过保护。 |
12.8.7 推荐的新手配置
| 推荐顺序:先使用ARMING_RUDDER=2掌握“右下角解锁、左下角上锁”;熟悉PreArm和安全流程后,如确有需要,再使用一个带防误触保护的两挡开关配置RCx_OPTION=153。RCx_OPTION=154和165属于特定用途功能,不应在不理解AirMode或Motor Emergency Stop逻辑时照抄。 |
|---|
12.9 飞行计划与航点任务设置
Mission Planner的“飞行计划(PLAN)”页面用于编辑自动任务。用户可以在地图上添加航点,设置起飞、航点飞行、悬停、改变速度、返航和降落等命令,并将任务写入飞控。飞行计划只负责描述自动任务,不能替代传感器校准、失控保护、空域确认和人工接管准备。

图12-7 Mission Planner飞行计划与航点编辑界面
截图来源:用户实际操作界面
| 图中地图缩放范围较大,且存在跨越较远区域的红色/橙色连线。正式规划任务时,应先清空或回读当前任务,把地图放大到实际作业区域,确认Home位置、航点坐标和高度均正确后再写入飞控。不能仅凭地图上出现连线就认为任务有效。 |
|---|
12.9.1 飞行计划界面组成
| 界面区域 | 主要内容 | 新手操作重点 |
|---|---|---|
| 地图区域 | 显示Home、飞机位置、航点、航迹、围栏和地形 | 放大到实际作业区域,避免误点到远距离位置 |
| 右侧航点列表 | 显示任务序号、命令、坐标、高度和命令参数 | 逐行核对命令类型和高度,不要只看地图图标 |
| 任务读写按钮 | 读取航点、写入航点、保存航点文件、加载航点文件 | 写入后必须再次读取,确认飞控中的任务与计划一致 |
| 高度设置区 | 可选择Relative、Absolute或Terrain高度基准 | 初学阶段优先使用相对Home高度,并确认单位 |
| 默认参数区 | 航点半径、悬停半径、默认高度等 | 先采用保守值,实际数值根据场地和机体性能调整 |
12.9.2 创建一个基础四旋翼任务
连接飞控后进入“飞行计划”。实机规划前应等待GPS定位正常;仅编辑离线任务时可以不连接飞控,但写入任务前必须建立连接。
将地图移动并放大到实际飞行区域。确认屏幕中的位置不是省级或全国级缩放,避免因误点击产生几十或几百千米外的航点。
在高度基准中选择Relative(相对Home高度)。初学阶段不建议混用绝对海拔和地形跟随高度。
在任务起点加入TAKEOFF命令,并填写安全起飞高度。高度应高于附近地面障碍,同时符合当地法规和场地限制。
在地图上依次点击需要经过的位置,生成WAYPOINT航点。第一次练习建议只设置3至4个近距离航点,形成简单三角形或矩形路线。
如需在某点停留,可把该行命令改为LOITER_TIME,并填写悬停时间;如需改变任务速度,可在适当位置加入DO_CHANGE_SPEED。
任务末尾加入RTL或LAND。第一次实机任务优先使用RTL,并在此前已经单独验证RTL工作正常。
点击“写入航点(Write WPs)”上传任务,随后点击“读取航点(Read WPs)”回读,逐行检查命令、顺序、坐标和高度。
12.9.3 常用任务命令
| 任务命令 | 作用 | 新手注意事项 |
|---|---|---|
| TAKEOFF | 在Auto任务中爬升到指定高度 | 确认高度单位和起飞上方无障碍物 |
| WAYPOINT | 飞往指定经纬度和高度 | 航点间距离不宜过大,转弯处预留安全空间 |
| LOITER_TIME | 在指定位置悬停一定时间 | 悬停依赖GPS、罗盘和位置估计 |
| DO_CHANGE_SPEED | 修改后续任务段的飞行速度 | 第一次任务采用较低速度,不要追求快速飞行 |
| RTL | 结束任务并返回Home | 必须提前验证Home、GPS、罗盘和返航高度 |
| LAND | 在指定位置自动降落 | 首次任务不建议在狭窄区域直接使用自动降落 |
12.9.4 Home位置与高度基准
飞行计划页面中的Home图标用于任务规划和距离计算。实机飞行时,飞控通常在获得可靠位置并完成解锁时建立实际Home点。因此,不能仅在地图上拖动Home图标,就假定实机返航点已经被安全修改。起飞前必须在飞行数据页面确认Home已建立,且飞机当前位置、地图位置和航向一致。
- Relative:相对Home高度。适合大多数初学者任务,但必须确认Home位置和起飞点地面高度。
- Absolute:相对海平面的绝对高度。需要准确理解当地海拔和任务数据来源。
- Terrain:相对地形高度。依赖地形数据和相关功能配置,不建议在首次任务中直接使用。
12.9.5 航线保存、写入与回读
点击“保存航点文件”,将任务保存到电脑,文件名中写明地点、日期和版本。
点击“写入航点”将任务发送至飞控,等待状态栏提示写入完成。
立即点击“读取航点”,从飞控回读任务。不要省略这一步。
对比回读后的任务列表,重点检查第一个命令、最后一个命令、所有高度、速度改变命令和返航/降落位置。
修改任务后重新保存为新版本,不要覆盖唯一的正确任务文件。
12.9.6 自动任务执行顺序
完成首飞、AltHold、Loiter和RTL单项测试,确认飞行器在人工和位置模式下均可稳定飞行。
在地面完成电池、GPS、EKF、罗盘、Home、任务距离和预计飞行时间检查。
起飞后先在Loiter中悬停,确认位置稳定,再切换到Auto执行任务。
任务执行时持续观察电池、GPS、EKF、当前航点、距离和飞行模式。
出现航向异常、位置漂移、低电量或任务路线不正确时,立即切换回Loiter或Stabilize人工接管。
| 实机任务首次验证应采用“低高度、低速度、短距离、少航点”的原则。任何自动任务都必须预留人工接管开关和安全降落区域。 |
|---|
12.10 参数修改、调参与飞行数据显示
Mission Planner将“参数修改”和“飞行数据显示”分为两个主要界面:“配置/调试(CONFIG/TUNING)”用于修改飞控参数,“飞行数据(DATA)”用于观察HUD、地图、告警、实时状态和遥测数据。参数修改改变的是飞控控制行为,飞行数据和日志则用于判断修改是否有效,二者应配合使用。

图12-8 Mission Planner飞行数据、HUD、地图和状态显示界面
截图来源:用户实际操作界面
| 图中HUD显示“PreArm: Battery 1 low voltage failsafe”、电池约10.0 V,并显示“GPS:未定位”。这是一组明确的禁止起飞信号。应先检查电池实际电压、电池监测比例、低电压阈值和GPS状态,处理告警后才能继续测试。 |
|---|
12.10.1 飞行数据页面的主要区域
| 显示区域 | 作用 | 重点观察内容 |
|---|---|---|
| HUD | 显示姿态、航向、高度、速度、模式和主要告警 | 地平线、当前模式、解锁状态、PreArm文字 |
| 地图 | 显示飞机位置、航迹、Home、航点和任务路线 | 位置是否与实际一致、航向是否正确、是否出现跳点 |
| Quick(快速) | 以大字体显示选定的遥测字段 | 电压、电流、高度、地速、偏航、航点距离 |
| Actions(动作) | 执行解锁、模式、速度或高度等地面站操作 | 仅在明确理解命令效果时使用 |
| Messages(消息) | 显示飞控发送的信息、警告和错误 | PreArm、Failsafe、EKF、GPS、罗盘和电池告警 |
| Status(状态) | 显示完整实时遥测字段 | Roll、Pitch、Yaw、卫星数、HDOP、振动、RC输入等 |
12.10.2 HUD与地图的正确读取方法
- 姿态:飞机向右倾斜时,人工地平线会以飞行仪表的方式相反倾斜;判断时应同时观察Roll和Pitch数值。
- 模式:确认HUD右下角显示的Stabilize、AltHold、Loiter或Auto与遥控器开关一致。
- 解锁状态:ARMED表示电机输出已允许,DISARMED表示上锁。任何告警状态下均不应强行解锁。
- 电池:同时查看电压、电流和剩余容量。百分比只在容量和电流计配置正确时才有参考价值。
- GPS:未定位时地图位置和Home可能不可靠,不能测试Loiter、RTL、Auto和Guided。
- EKF与VIBE:EKF异常或振动过大可能导致定高、定点和导航失效。
12.10.3 参数修改的标准流程
进入“配置/调试 → 全部参数表(Full Parameter List)”。
点击“Save to File”保存当前完整参数,文件名注明日期和修改前状态。
使用搜索框查找目标参数,先阅读当前固件版本显示的参数说明、单位、范围和重启要求。
记录原值,只修改一个参数或一组明确关联的参数;不要一次批量修改多个不相关项目。
输入新值后点击“Write Params”。需要重启的参数应断开并重新上电,再点击“Refresh Params”确认写入值。
进行低风险地面测试或短时间悬停,下载日志并比较修改前后的表现。
若效果变差,立即恢复保存的原值;不要继续在错误方向上叠加修改。
| 不要使用“Reset to Default”代替普通参数修改。恢复默认值会清除大量已有配置,之后通常需要重新完成传感器、遥控器、输出和安全设置。 |
|---|
12.10.4 新手调参顺序
| 阶段 | 应完成的工作 | 进入下一阶段的条件 |
|---|---|---|
| 机械与安装 | 检查桨、电机、机架、重心、飞控固定和线束 | 无松动、无碰擦、方向正确 |
| 传感器与输出 | 完成加速度计、罗盘、遥控器、电机顺序和转向检查 | 无关键PreArm错误 |
| 初始悬停 | 使用默认或初始参数完成Stabilize低空悬停 | 无侧翻、自旋和高频振荡 |
| 振动与滤波 | 检查VIBE、Clip和日志频谱,先解决机械振动 | 振动处于可接受范围 |
| 姿态调参 | 按官方流程进行QuikTune、手动调参或AutoTune | 飞机已可稳定控制并能随时接管 |
| 导航验证 | 依次测试AltHold、Loiter、RTL和Auto | 每种模式单独验证正常 |
12.10.5 建议固定显示的实时数据
| 数据 | 用途 | 异常表现 |
|---|---|---|
| Flight Mode | 确认当前控制逻辑 | 模式与开关不一致或意外跳变 |
| Arm Status | 确认是否允许电机输出 | 未准备解锁、意外解锁 |
| Battery Voltage/Current | 判断电池和动力负载 | 电压过低、压降过大、读数与万用表不符 |
| GPS Fix/Sat/HDOP | 判断位置质量 | 未定位、卫星少、HDOP过高 |
| EKF Status | 判断位置和姿态估计健康度 | EKF红色、方差告警、位置跳变 |
| VIBE/Clip | 判断机械振动和传感器削波 | VIBE持续偏高或Clip不断增加 |
| Altitude/Ground Speed | 监控高度与水平速度 | 高度漂移、速度异常增加 |
| WP Distance/Current WP | 监控自动任务进度 | 航点不前进、距离持续增大 |
12.10.6 Quick、Messages和Status的使用
在Quick页面双击空白或数据项,根据界面提示添加需要的大字体遥测字段。
进入Messages页面查看完整告警。HUD通常只显示最重要或最近的信息,排故时应读取全部消息。
进入Status页面搜索roll、pitch、yaw、battery、gps、ekf、vibe、rcin等字段,确认原始数据与实物动作一致。
飞行过程中不建议频繁切换复杂页面。应提前固定最需要的字段,并由地面人员协助观察。
12.10.7 飞行后验证参数效果
下载DataFlash .bin日志,重点查看ATT、PIDR、PIDP、PIDY、VIBE、BAT、GPS和XKF/NKF数据。
比较目标姿态与实际姿态曲线,判断是否存在明显滞后、超调或持续振荡。
对比参数修改前后的相同动作或相同任务,不要用完全不同的风况和载荷直接下结论。
确认改动确实改善后,再进行下一项小幅修改,并保存新的参数版本。
| 截图中的固件为ArduCopter V4.7.0-dev。开发版参数名称、默认值和行为可能变化。真实飞行和教学演示优先采用与ZP-MH743板型匹配、经过厂家或团队验证的Stable稳定版。 |
|---|
12.11 Mission Planner模拟飞行(SITL)
Mission Planner的“模拟(SIMULATION)”页面可以启动SITL(Software in the Loop,软件在环)飞行器。SITL在电脑中运行ArduPilot固件和飞行动力学模型,可用于练习地面站操作、验证航点任务、熟悉模式切换和测试参数逻辑,而不会让真实电机和螺旋桨转动。

图12-9 Mission Planner模拟飞行(SITL)启动界面
截图来源:用户实际操作界面
| 图中固件分支选择为“Latest(Dev)”。初学者进行教学和任务练习时,应优先选择Stable稳定分支。Copter Swarm等按钮用于多机/集群测试,单架四旋翼基础练习不需要使用。 |
|---|
12.11.1 模拟界面主要选项
| 选项 | 作用 | 新手建议 |
|---|---|---|
| Home Location | 设置模拟飞行器的初始位置 | 拖动地图标记到熟悉的开阔区域 |
| Heading | 设置初始机头航向 | 第一次保持0°或使用默认值 |
| Sim Speed | 设置仿真运行速度倍率 | 第一次保持1倍速度 |
| Model | 选择车辆和机架动力学模型 | 选择与四旋翼对应的Quad/X模型 |
| Stable / Latest(Dev) | 选择模拟固件分支 | 优先Stable;开发测试才使用Latest |
| Extra command line | 传入SITL启动参数 | 基础练习保持为空 |
| Wipe | 清除上一次仿真保存的参数 | 参数混乱或更换模型时勾选一次 |
12.11.2 启动单架四旋翼SITL
先与真实飞控断开连接。不要在真实飞控保持连接时启动仿真,以免混淆真实参数和模拟参数。
点击顶部“模拟”,在地图上拖动Home位置到准备练习的区域。
将Sim Speed设置为1,将固件分支选择为Stable。
在Model下拉框中选择与四旋翼对应的模型,再点击下方多旋翼/Copter图标启动。模型和车辆类型必须匹配。
等待Mission Planner下载或加载SITL文件。启动完成后软件会自动连接模拟飞行器并读取参数。
切换到“飞行数据”,确认地图上出现模拟飞机,GPS、姿态和Home数据正常。
12.11.3 模拟器中的基础飞行练习
在飞行数据页面确认当前模式为Stabilize或Loiter,并检查没有关键PreArm告警。
可连接游戏杆/遥控器进行手动操控,也可以使用Actions或Guided命令进行解锁、起飞和位置控制。
先练习解锁、上锁、起飞、悬停、模式切换和RTL。
观察HUD中的高度、速度、航向、模式和电池模拟数据,熟悉真实飞行时需要关注的位置。
练习遇到异常时切换回Loiter或Stabilize,并执行RTL或Land。
12.11.4 在SITL中验证航点任务
进入“飞行计划”,在模拟Home附近创建一个短距离任务:TAKEOFF → 3个WAYPOINT → RTL。
使用相对高度,起飞高度和航点高度保持保守,航点间距先控制在较小范围。
点击“写入航点”,再点击“读取航点”回读检查。
返回“飞行数据”,解锁并切换到Auto,观察飞机是否按顺序执行任务。
监控当前航点、航点距离、高度、速度和模式;发现路线不正确时立即切换人工模式。
任务结束后查看地图航迹和.tlog回放,确认实际轨迹与规划路线一致。
12.11.5 仿真Home与航点设置要求
仿真Home决定虚拟飞机的初始位置、相对高度基准和RTL返航位置。航点决定实际任务路线。设置错误会造成飞机出现在远处、地图出现超长连线或RTL返回错误区域。
Home设置:启动SITL前,把“Home Location - Drag Me”拖到空旷练习区域,并将地图放大到街区或场地级别。
航点范围:所有航点放在Home附近,首次仿真控制在20~50 m范围内,不要一开始规划几千米任务。
高度基准:选择Relative;TAKEOFF和WAYPOINT可先设为10~15 m。实机必须根据障碍物、场地和法规重新评估。
基础任务:Home不作为普通WP添加,使用“TAKEOFF → WAYPOINT → WAYPOINT → RTL”。
写入验证:点击Read WPs回读,确认命令顺序、坐标、高度和任务终点正确后再执行Auto。
12.11.6 在SITL中验证航点任务
推荐执行顺序:Guided解锁并起飞至安全高度 → Loiter确认悬停稳定 → 写入并回读任务 → 切换Auto执行 → 异常时切回Loiter或Stabilize接管。
进入“飞行计划”,在模拟Home附近创建一个短距离任务:TAKEOFF → 3个WAYPOINT → RTL。
使用相对高度,起飞高度和航点高度保持保守,航点间距先控制在较小范围。
点击“写入航点”,再点击“读取航点”回读检查。
返回“飞行数据”,解锁并切换到Auto,观察飞机是否按顺序执行任务。
监控当前航点、航点距离、高度、速度和模式;发现路线不正确时立即切换人工模式。
任务结束后查看地图航迹和.tlog回放,确认实际轨迹与规划路线一致。
12.11.7 参数与故障逻辑测试
SITL连接后可以像连接真实飞控一样进入“配置/调试”修改参数。模拟器还会显示SIM_开头的仿真参数,可用于设置风、传感器、位置或其他模拟条件。具体参数名称会随固件版本变化,应以当前参数说明为准。
测试返航高度和航点速度修改后,任务轨迹是否符合预期。
测试模式开关、地理围栏和任务结束行为。
测试通信中断、位置异常或电池保护逻辑时,先在SITL中确认预期动作。
修改参数前保存模拟参数文件;需要恢复干净环境时重新启动并使用Wipe。
12.11.8 常见启动问题
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 点击后启动成固定翼 | 未先选择Model或模型与车辆按钮不匹配 | 先选Quad/X模型,再点击Copter图标 |
| 无法下载或启动 | 网络、杀毒软件、文件权限或端口占用 | 检查网络,关闭占用程序,以普通用户重启Mission Planner |
| 参数与上次不同或异常 | 仿真参数被持久保存 | 勾选Wipe重新启动,或加载已保存参数 |
| 地图位置不合适 | Home未拖到目标区域 | 停止仿真后重新设置Home并启动 |
| 运行速度太快难以操作 | Sim Speed设置过高 | 恢复为1倍速度 |
| 出现开发版行为差异 | 选择了Latest(Dev) | 改选Stable重新启动 |
12.11.9 常见启动问题
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 点击后启动成固定翼 | 未先选择Model或模型与车辆按钮不匹配 | 先选Quad/X模型,再点击Copter图标 |
| 无法下载或启动 | 网络、杀毒软件、文件权限或端口占用 | 检查网络,关闭占用程序,以普通用户重启Mission Planner |
| 参数与上次不同或异常 | 仿真参数被持久保存 | 勾选Wipe重新启动,或加载已保存参数 |
| 地图位置不合适 | Home未拖到目标区域 | 停止仿真后重新设置Home并启动 |
| 运行速度太快难以操作 | Sim Speed设置过高 | 恢复为1倍速度 |
| 出现开发版行为差异 | 选择了Latest(Dev) | 改选Stable重新启动 |
12.11.10 SITL的局限性
SITL能够验证任务逻辑和软件参数,但不能完全复现真实机架的螺旋桨不平衡、电机振动、电磁干扰、GPS多路径、载荷偏心、动力不足和结构松动。因此,仿真成功只说明软件流程基本可行,不能替代拆桨测试、低空首飞和逐级实机验证。
| 推荐学习路线:先在SITL练习连接、飞行计划、模式切换和RTL;再在真实飞控无桨状态下检查传感器、电机和失控保护;最后才进行低空实飞。 |
|---|
13INAV Configurator 配置
INAV(INertial AVigation)是一款专为多旋翼和固定翼飞行器设计的开源飞控固件,在导航、自主飞行和传感器融合方面具有显著优势。INAV Configurator 是其配套的地面站配置软件,提供了直观的用户界面,允许用户对飞行控制器的各项参数进行全面配置。本章将基于 ZP-MH743 飞控板(STM32H743 处理器),讲解 INAV Configurator 配置流程。
13.1 校准加速度计
加速度计用于检测飞行器的重力方向和运动加速度,为横滚角、俯仰角以及水平姿态估计提供参考。由于传感器本身存在零点和比例误差,因此在首次安装飞控、更换飞控安装方式或姿态显示明显异常时,需要重新进行加速度计校准。 首先选择配置哪种类型的飞行器:

接收机配置向导选择CRSF。

“重置 Z 轴”:把当前无人机朝向设为三维模型的显示参考方向,让屏幕中的模型机头与你桌面上的实物机头看起来一致。

进入INAV Configurator的“校准(Calibration)”页面,选择“加速度计校准(Accelerometer Calibration)”。校准过程中,应按照界面提示依次将飞行器或飞控板放置在六个方向:水平正放;倒置; 左侧朝下; 右侧朝下; 机头朝下; 机尾朝下。最后保存并重启。

13.2 校准罗盘
校准界面对罗盘进行校准

朝向预设 (align_mag),相对于FC方向选择CW 180° fip。

13.3检查并设置电机编号、输出通道和旋转方向
启用电机输出测试后,分别轻微提高M1、M2、M3、M4的测试滑块,每次只测试一个电机,并记录实际转动的电机位置。将实际位置与INAV Mixer页面中的电机编号图进行比较,确认:M1滑块控制实际M1电机;M2滑块控制实际M2电机;M3滑块控制实际M3电机;M4滑块控制实际M4电机。

如果编号不一致,在混控界面,混控使用向导中按照实际转动的电机位置进行修改。


完成编号检查后,再检查各电机旋转方向是否符合INAV机架示意图。若某个无刷电机转向相反,可采用以下方法处理:在支持方向设置的电调配置的软件中修改电机方向https://am32.ca/configurator。
13.4 设置飞行模式
在“模式”页面中,通过遥控器辅助通道设置解锁和飞行模式。图中将 ARM解锁分配至 CH7,通道值在 1700~2100 时进入解锁状态;将 ANGLE自稳模式分配至 CH6,通道值在 900~1300 时启用;将 NAV ALTHOLD高度保持模式分配至 CH8,通道值在 1700~2100 时启用。蓝色区域表示模式的有效范围,拨动遥控器开关时应确认通道指示点进入对应区域。PREARM、HORIZON和 HEADING HOLD目前未设置。配置完成后点击右下角“保存”。

对各模式作简短说明:
| 解锁 | 模式 | 简短说明 |
|---|---|---|
| ARM | 解锁飞控,使电机进入可运行状态;关闭后上锁 | |
| PREARM | 预解锁安全开关,启用后需先激活PREARM,再激活ARM,防止误解锁。 |
| 基本飞行模式 | 模式 | 简短说明 |
|---|---|---|
| ANGLE | 自稳模式,限制最大倾角,松开横滚和俯仰摇杆后自动恢复水平。 | |
| HORIZON | 摇杆靠近中位时自动回正,摇杆大幅操作时允许翻滚等特技动作。 |
| 导航模式 | 模式 | 简短说明 |
|---|---|---|
| NAV COURSE HOLD | 保持当前GPS地面航迹方向,但不主动保持高度。 | |
| NAV CRUISE | 同时保持航迹方向和高度,相当于COURSE HOLD与ALTHOLD组合。 | |
| NAV POSHOLD | GPS定点保持,使多旋翼保持当前水平位置和高度。 | |
| NAV RTH | 自动返航,飞行器按设定高度返回解锁时记录的Home点。 | |
| NAV WP | 执行已经保存到飞控中的航点任务。 | |
| GCS NAV | 接收地面站实时发送的目标位置,用于跟随目标或动态导航。 |
| 飞行模式辅助功能 | 模式 | 简短说明 |
|---|---|---|
| NAV ALTHOLD | 高度保持;油门摇杆用于控制上升和下降速度,回到中位后保持高度。 | |
| HEADING HOLD | 保持当前机头航向,偏航摇杆可改变目标航向。 | |
| TURN ASSIST | 转弯辅助,自动协调横滚和偏航,主要用于固定翼平稳转弯。 |
| 多旋翼功能 | 模式 | 简短说明 |
|---|---|---|
| FPV ANGLE MIX | 根据FPV摄像头上仰角混合横滚与偏航控制,使画面中的转向更自然。 | |
| TURTLE | 炸机翻转模式,通过反向驱动部分电机把倒扣的飞行器翻回正面, 需要DShot电调协议。 |
|
| MC BRAKING | 多旋翼制动辅助,在松开摇杆后主动减速,减少水平滑行距离。 | |
| HEADFREE | 无头模式,摇杆方向以设定的参考方向为准,不随机头方向变化。 | |
| HEADADJ | 重新记录HEADFREE无头模式使用的参考航向。 |
| OSD显示模式 | 模式 | 简短说明 |
|---|---|---|
| OSD OFF | 暂时关闭屏幕上的OSD信息显示。 | |
| OSD ALT 1 | 切换到第1套备用OSD布局。 | |
| OSD ALT 2 | 切换到第2套备用OSD布局。 | |
| OSD ALT 3 | 切换到第3套备用OSD布局。 |
| FPV摄像头功能 | 模式 | 简短说明 |
|---|---|---|
| CAMSTAB | 启用摄像头或云台舵机姿态补偿,使画面尽量保持水平。 | |
| CAMERA CONTROL 1 | 触发摄像头控制功能1,例如录像或菜单操作,具体功能取决于摄像头配置。 | |
| CAMERA CONTROL 2 | 触发摄像头控制功能2。 | |
| CAMERA CONTROL 3 | 触发摄像头控制功能3。 |
| VTOL垂直起降功能 | 模式 | 简短说明 |
|---|---|---|
| MIXER PROFILE 2 | 切换到第2套混控配置,常用于VTOL在多旋翼与固定翼配置间切换。 | |
| MIXER TRANSITION | 启动两套混控配置之间的渐变过渡,避免电机和舵机输出突然改变。 |
| 蜂鸣器 | 模式 | 简短说明 |
|---|---|---|
| BEEPER | 主动启动蜂鸣器,用于寻找飞行器。 | |
| BEEPER MUTE | 暂时关闭或抑制蜂鸣器声音。 |
| 云台功能 | 模式 | 简短说明 |
|---|---|---|
| GIMBAL LEVEL TILT | 对云台俯仰轴进行自动水平补偿。 | |
| GIMBAL LEVEL ROLL | 对云台横滚轴进行自动水平补偿。 | |
| GIMBAL CENTER | 将云台舵机恢复到设定的中心位置。 |
| 其他功能 | 模式 | 简短说明 |
|---|---|---|
| LEDS OFF | 关闭飞行器的可编程LED灯带。 | |
| HOME RESET | 将当前GPS位置重新设为Home返航点,误操作会改变RTH目标。 | |
| WP PLANNER | 启用机载航点规划功能,可配合遥控操作记录或管理航点。 | |
| MISSION CHANGE | 在飞行过程中选择并加载飞控中保存的其他航点任务。 | |
| FAILSAFE | 人工触发失控保护程序,主要用于地面测试,不作为普通飞行模式使用。 | |
| MSP RC OVERRIDE | 允许计算机或伴随计算机通过MSP覆盖指定遥控通道。 | |
| MULTI FUNCTION | 启用多功能操作入口,配合摇杆组合执行预设的高级指令。 |
13.5 完成解锁前检查,准备起飞

14QGroundControl 配置(QGC)
QGroundControl(QGC)是开源无人机地面站软件,由 Dronecode 基金会维护,是 PX4 和 ArduPilot 生态系统的核心组件。QGC 提供了完整的飞行规划、实时监控、传感器校准和数据分析功能,支持桌面端(Windows/macOS/Linux)和移动端(Android/iOS)。本章将基于 ZP-MH743 飞控板配合 PX4 固件,全面讲解 QGroundControl 的配置与使用。
14.1 QGroundControl 安装与连接
14.1.1 软件获取与安装
QGroundControl 可从官方网站(https://qgroundcontrol.com/downloads)下载最新版本。
安装步骤(Windows):
1. 下载 Windows 版本的 .exe安装程序。
2. 双击安装程序,按照向导完成安装。
3. 安装完成后从桌面快捷方式或开始菜单启动 QGC。
4. 首次启动时,QGC 会要求选择界面语言——建议选择中文(简体)以获得最佳体验。
移动端安装:
• Android:从 Google Play 商店搜索"QGroundControl"下载安装。
• iOS:从 App Store 搜索"QGroundControl"下载安装。
• 移动端功能与桌面端基本一致,但界面布局针对触屏进行了优化。
14.1.2 连接飞控板
QGroundControl 支持多种连接方式:
| 连接方式 | 接口 | 适用场景 |
|---|---|---|
| USB 直连 | USB Type-C | 桌面端配置调试 |
| 数传电台 | MAVLink over 433/915MHz | 飞行中实时遥测 |
| WiFi 连接 | UDP/TCP over WiFi | 近距离无线配置 |
| 4G/LTE 连接 | MAVLink over Internet | 超视距远程控制 |
| 以太网连接 | UDP over Ethernet | 高速数据传输 |
USB 直连步骤:
1. 使用 USB Type-C 线缆将 ZP-MH743 飞控板连接至计算机。
2. 系统自动识别并安装驱动(如第 13 章所述 STM32 VCP 驱动)。
3. 启动 QGroundControl,软件会自动检测并连接飞控板。
4. 连接成功后,QGC 主界面左上角将显示载具图标和固件版本信息。
5. 界面顶部状态栏显示"Connected"状态和 MAVLink 心跳信号指示。
数传电台连接:
1. 将地面端数传电台通过 USB 连接至计算机。
2. 将机载端数传电台连接至飞控板的遥测 UART 端口。
3. QGC 会自动检测串口并建立 MAVLink 连接。
4. 默认波特率为 57600 bps(MAVLink 标准遥测速率)。
14.2 载具设置(Vehicle Setup)
载具设置是 QGC 的核心配置模块,位于主界面的齿轮图标"Vehicle Setup"区域。
14.2.1 Summary 概览页
进入 Vehicle Setup 后首先看到的是 Summary 概览页,以卡片形式展示飞控系统的整体健康状态:
• 固件信息:显示当前固件版本(如 PX4 v1.14.0)、Git 哈希值和编译日期。
• 传感器状态:各传感器(加速度计、陀螺仪、磁力计、气压计、GPS)的校准状态,绿色对勾表示已校准,红色叉号表示需要校准。
• 电池状态:电池电压和容量信息。
• 遥控器状态:遥控器连接状态和通道映射信息。
• 飞行时间:累计飞行时间和飞行次数统计。
14.2.2 Airframe 机架类型选择
在"Airframe"设置页面中,选择与飞行器匹配的机架类型:
| 机架类型 | 分类代码 | 说明 | ZP-MH743 支持 |
|---|---|---|---|
| 标准四旋翼(X型) | Quadrotor X | 最常见的多旋翼布局 | 是 |
| 标准四旋翼(+型) | Quadrotor + | 传统十字布局 | 是 |
| 六旋翼(X型) | Hexarotor X | 六轴 X 布局 | 是 |
| 八旋翼(X型) | Octorotor X | 八轴 X 布局 | 是 |
| 固定翼 | Standard Plane | 常规固定翼 | 是 |
| VTOL 垂直起降固定翼 | VTOL | 垂直起降+固定翼混合 | 是 |
| 涵道飞行器 | Ducted Fan | 涵道风扇推进 | 是 |
选择正确的机架类型后,PX4 固件会自动加载对应的默认参数集(混控器、PID 初始值、安全限制等),大幅简化后续配置。
14.2.3 Actuator 输出配置
在"Actuators"设置页面中配置电机和舵机的输出映射:
1. 电机通道映射:确认每个电机对应正确的 PWM/DShot 输出通道。
2. 电机方向测试:点击每个电机的"Test"按钮,确认旋转方向正确(根据机架类型,部分电机正转,部分反转)。
3. DShot 配置(如使用 DShot ESC):
• 在"Actuator Output"中选择 DShot 协议。
• 可选 DShot150 / DShot300 / DShot600 / DShot1200。
• ZP-MH743 推荐使用 DShot600,兼顾速度和稳定性。
1. PWM 频率配置(如使用 PWM ESC):
• 标准 PWM:400Hz(适用于大多数电调)。
• OneShot125:适用于支持 OneShot 的电调。
14.3 传感器校准
传感器校准是确保飞行安全和导航精度的关键步骤。QGC 提供了图形化的校准引导流程。
14.3.1 加速度计校准
加速度计校准需要用户在 QGC 引导下将飞行器置于 6 个标准姿态:
1. 点击"Accelerometer"校准按钮。
2. QGC 显示当前加速度计校准状态,点击"Start"开始校准。
3. 按照屏幕上的 3D 模型指示,依次将飞行器放置于以下 6 个姿态:
**• Level(水平):飞行器正常放置,水平朝上。
**• Left Side(左侧朝下):飞行器向左侧翻转 90°。
**• Right Side(右侧朝下):飞行器向右侧翻转 90°。
**• Nose Down(机头朝下):飞行器向前翻转 90°。
**• Nose Up(机头朝上):飞行器向后翻转 90°。
**• Back(背部朝下):飞行器翻转 180°,底部朝上。
1. 每个姿态放置稳定后,点击"Next"确认。QGC 会采集当前姿态的加速度数据。
2. 6 个姿态全部完成后,QGC 计算校准参数并写入飞控板。
3. 校准完成后,Summary 页面的加速度计状态变为绿色。

【提示】提示:校准时确保飞行器放置稳固,每个姿态之间切换时避免
剧烈晃动。ZP-MH743 搭载的 ICM-42688-P 加速度计具有出色的温度稳定性,校准后在正常工作温度范围内(-10°C ~ 50°C)不需要重新校准。
14.3.2 陀螺仪校准
陀螺仪校准相对简单:
1. 点击"Gyroscope"校准按钮。
2. 将飞行器放置在水平且稳定的平面上,确保没有任何振动源。
3. 点击"Start"开始校准。
4. 校准过程中飞行器必须保持完全静止(约 5-10 秒)。
5. QGC 自动采集陀螺仪零偏数据并计算校准参数。
6. 校准完成后显示成功提示。
【提示】注意:陀螺仪零偏会随温度变化,PX4 固件内置了温度补偿机制。建议在飞行环境温度下重新校准陀螺仪以获得最佳性能。
14.3.3 磁力计(罗盘)校准
磁力计校准需要在三维空间中旋转飞行器以采集地磁数据:
1. 点击"Compass"校准按钮。
2. 点击"Start"开始校准。
3. QGC 显示一个进度条和三维旋转引导动画。
4. 按照引导在三维空间中缓慢旋转飞行器,确保覆盖所有方向:
• 水平旋转(偏航方向)360°。
• 俯仰方向旋转 360°。
• 横滚方向旋转 360°。
1. 旋转过程中 QGC 实时显示数据采集进度,覆盖的区域以绿色显示在球面上。
2. 当进度达到 100% 时校准自动完成。
3. 校准结果会显示"Fit Quality"(拟合质量)评分,建议达到"Good"或"Excellent"。

【提示】重要:校准时远离大型金属物体、电磁设备和钢筋混凝土建筑。ZP-MH743 建议同时安装外部磁力计(如 Matek M10Q-5883 集成
的 QMC5883L),远离电机和电调的电磁干扰。
14.3.4 电机校准
⚠️安全前提:拆下螺旋桨,防止意外转动伤人
- 确认机架构型:当前为四轴 X 构型(CCW),电机编号、转向与实物保持一致。
- 电调协议统一:
MAIN1~4选择DSHOT300,不要混用 PWM/DSHOT 协议。 - 转向校验:使用
Set Spin Direction按钮,对照示意图确认旋转方向,反向电机勾选对应反转复选框。 - 单独测试:拖动 Actuator Testing 滑块,逐个验证每个电机正常响应,无卡顿、异响。
- 禁止带电触碰电机转轴,测试完成后关闭执行器滑块,再安装桨叶。
- 若电调首次使用,需提前完成电调油门行程校准。

14.4 遥控器校准与飞行模式映射
14.4.1 遥控器校准流程
1. 在 QGC 的"Radio"设置页面点击"Start"开始校准。
2. 按照引导依次操作遥控器各通道:
**• 右摇杆(副翼/横滚):左推到底 → 居中 → 右推到底。
**• 右摇杆(升降/俯仰):上推到底 → 居中 → 下拉到底。
**• 左摇杆(油门):推至最高 → 拉至最低。
**• 左摇杆(方向/偏航):左推到底 → 居中 → 右推到底。
1. QGC 自动检测各通道的最小值、中位值和最大值。
2. 校准完成后显示各通道的校准数据,确认数值合理(中位值接近 1500μs,行程范围约 1000-2000μs)。
14.4.2 飞行模式映射
PX4 使用遥控器通道映射飞行模式,与 INAV 的方式有所不同:
1. 在"Flight Modes"设置页面,选择用于模式切换的遥控器通道(通常为 AUX1/CH5 或 AUX2/CH6)。
2. PX4 支持将通道行程划分为最多 6 个档位,每个档位对应一个飞行模式:
| 档位 | 通道范围 | 多旋翼模式 | 固定翼模式 |
|---|---|---|---|
| 1 | 1000-1167 | Stabilize(自稳) | Stabilize(自稳) |
| 2 | 1167-1333 | Altitude(定高) | Altitude(定高) |
| 3 | 1333-1500 | Position(定点) | Position(定点) |
| 4 | 1500-1667 | Auto: Mission(任务) | Auto: Mission(任务) |
| 5 | 1667-1833 | Return(返航) | Return(返航) |
| 6 | 1833-2000 | Offboard(外部控制) | Offboard(外部控制) |
1. 拨动遥控器开关,确认 QGC 中显示的当前模式与预期一致。
2. 可设置额外的开关用于以下辅助功能:
**• Kill Switch(紧急停机):映射到独立开关,一旦触发立即关闭所有电机。
**• Return Switch(返航开关):映射一个专用开关用于触发 RTL。
**• Loiter Switch(悬停开关):快速切换到 Position Hold 模式。
14.5 安全设置(Failsafe / Return-to-Launch / GeoFence)
安全设置是飞行操作中最重要的配置环节,直接关系到飞行器、人员和财产的安全。
14.5.1 Failsafe(失控保护)配置
PX4 的 Failsafe 系统覆盖了多种异常场景:
| 触发条件 | 默认动作 | 可配置动作 | 建议设置 |
|---|---|---|---|
| RC 信号丢失 | Hold(悬停) | Hold / RTL / Land / Terminate | RTL(返航) |
| 数据链丢失 | Hold(悬停) | Hold / RTL / Land / Terminate | Hold(保持悬停,等待重连) |
| GPS 信号丢失 | Hold(悬停) | Hold / Land / Terminate | Land(降落,因为无法导航) |
| 低电量 Level 1 | Warning | Warning / RTL / Land | RTL(返航,保留返航电量) |
| 低电量 Level 2 | RTL | RTL / Land / Terminate | Land(立即降落) |
| 低电量 Critical | Land | Land / Terminate | Land(紧急降落) |
| Geofence 越界 | Hold | Hold / RTL / Land / Terminate | RTL(返回安全区) |
| 任务(Mission)失效 | RTL | Hold / RTL / Land | RTL |
| 导航异常 | RTL | Hold / RTL / Land | Land |
低电量阈值设置:
**• Level 1(警告级):COM_LOW_BAT_ACT = 1(RTL),阈值建议设为电池容量的 30%。
**• Level 2(紧急级):COM_LOW_BAT_ACT = 2(Land),阈值建议设为电池容量的 15%。
**• Critical(危险级):COM_LOW_BAT_ACT = 3(Terminate),阈值建议设为电池容量的 5%。
14.5.2 Return-to-Launch(RTL 返航)配置
PX4 的 RTL 系统与 INAV 的 RTH 类似,但参数命名和策略有所不同:
| 参数 | 说明 | 默认值 | 建议值 |
|---|---|---|---|
| RTL_RETURN_ALT | RTL 爬升目标高度 | 60m | 高于飞行区域最高障碍物 20m |
| RTL_DESCEND_ALT | RTL 到达后悬停高度 | 30m | 15-30m |
| RTL_LAND_DELAY | RTL 到达后延迟降落时间 | 0.5s | 3-5s(给操作者干预时间) |
| RTL_TYPE | RTL 类型 | 0 | 0=Home点,1=任务着陆点,2=安全着陆点 |
| COM_RC_OVERRIDE | 遥控器在 RTL 中是否可覆盖 | 1 | 1=允许(推荐) |
RTL 流程(多旋翼):
1. 触发 RTL 后,飞行器记录当前位置和航向。
2. 爬升至 RTL_RETURN_ALT高度(如果当前高度更高则保持)。
3. 沿直线飞向 Home 点(或指定 RTL 着陆点)。
4. 到达后下降至 RTL_DESCEND_ALT高度悬停。
5. 等待 RTL_LAND_DELAY秒后执行自动降落。
14.6 日志下载与分析
14.6.1 飞行日志管理
PX4 固件将每次飞行的完整数据记录在飞控板的 SD 卡或内部 Flash 中,格式为 .ulg(ULog 格式)。
日志下载步骤:
1. 在 QGC 中点击"Analyze"→"Log Download"。
2. QGC 列出飞控板中存储的所有日志文件,显示文件名、日期、大小和飞行时长。
3. 选择需要下载的日志文件,点击"Download"。
4. 下载完成后日志文件保存在本地指定目录。
14.6.2 日志分析工具
QGC 内置了基础的日志分析功能:
• Log Browser:在"Analyze"→"Log Browser"中加载 .ulg日志文件,以图表形式显示各通道的飞行数据。
• 可调取的数据通道:加速度、角速度、姿态角、GPS 位置、气压高度、电机输出、PID 误差、电池电压/电流、遥控输入等。
专业分析工具推荐:
| 工具 | 用途 | 平台 |
|---|---|---|
| Flight Review (PX4 官方) | 飞行数据全面分析和可视化 | Web 在线 |
| pyulog (Python 库) | 编程式日志解析和数据处理 | 跨平台 |
| PlotJuggler | 通用时序数据可视化工具 | 跨平台 |
| MAVExplorer (MAVProxy) | MAVLink 日志分析 | 跨平台 |
14.6.3 振动分析
日志分析的一个重要应用是振动诊断:
1. 下载包含 IMU 原始数据的飞行日志。
2. 在 Flight Review 中查看"Vibration"分析图表。
3. 关注以下指标:
• 加速度计振动:正常值 1.0 m/s² RMS,超过 2.0 m/s² 需要检查机架结构。
• 陀螺仪振动:正常值 0.05 rad/s RMS。
• 频谱分析:如果特定频率出现明显峰值,可能指示电机不平衡或螺旋桨损坏。
14.7 QGC 特色功能专项
14.7.1 MAVLink 实时数据流监控与自定义仪表盘
MAVLink 协议概述:
MAVLink 是 PX4/ArduPilot 与地面站之间的标准通信协议。QGC 通过 MAVLink 接收飞行器的全部遥测数据。MAVLink 2.0 支持加密和身份验证,提升了通信安全性。
MAVLink Inspector(数据流监控器):
QGC 提供了内置的 MAVLink Inspector 工具,用于实时监控 MAVLink 消息流:
1. 在"Analyze"菜单中选择"MAVLink Inspector"。
2. 界面左侧显示所有活跃的 MAVLink 消息类型及其接收频率。
3. 点击任意消息类型,右侧显示该消息的所有字段及其当前值。
4. 常见 MAVLink 消息类型:
| 消息名称 | 消息 ID | 内容 | 频率 |
|---|---|---|---|
| HEARTBEAT | 0 | 系统状态心跳 | 1Hz |
| SYS_STATUS | 1 | 系统状态总览 | 1Hz |
| ATTITUDE | 30 | 姿态角和角速度 | 30Hz |
| GLOBAL_POSITION_INT | 33 | GPS 全局位置 | 5Hz |
| VFR_HUD | 74 | 飞行速度/高度 HUD | 5Hz |
| RC_CHANNELS | 65 | 遥控器通道原始值 | 1Hz |
| BATTERY_STATUS | 147 | 电池详细信息 | 1Hz |
| NAV_CONTROLLER_OUTPUT | 62 | 导航控制器输出 | 5Hz |
自定义仪表盘(Custom Telemetry Widgets):
QGC 允许用户自定义 Fly View 中的遥测数据显示:
1. 在 Fly View 中右键点击遥测数据区域,选择"Edit"。
2. 进入仪表盘编辑模式,可添加以下类型的 Widget:
• Value Widget:显示单个数值(如电压、速度)。
• Gauge Widget:以仪表形式显示数值(带刻度和指针)。
• Bar Widget:以条形图形式显示百分比或范围值。
• Compass Widget:罗盘方位显示。
• Plot Widget:实时曲线图,显示数值的历史变化。
1. 每个 Widget 可选择绑定的 MAVLink 数据源。
2. 调整 Widget 大小和位置后保存布局。
QGC 内置了完整的视频流接收和显示功能,支持多种流媒体协议。
14.7.2 离线地图与任务预规划
离线地图功能:
QGC 支持预下载地图瓦片以供离线使用,适用于无网络连接的野外作业环境:
1. 在 QGC 设置中选择"Offline Maps"。
2. 点击"Create New Set"创建新的离线地图集。
3. 在地图上框选需要下载的区域。
4. 选择缩放级别范围(建议 Level 1-18 覆盖从全局到细节)。
5. QGC 估算需要下载的瓦片数量和磁盘空间。
6. 确认下载,等待完成。
7. 离线地图自动保存在本地缓存中,离线环境下自动加载。
支持的地图源:
| 地图源 | 类型 | 覆盖范围 | 离线支持 |
|---|---|---|---|
| Mapbox | 卫星/街道 | 全球 | 是 |
| Bing Maps | 卫星/街道 | 全球 | 是 |
| Google Maps | 卫星/街道 | 全球 | 是(需自定义) |
| OpenStreetMap | 街道 | 全球 | 是 |
| 高德地图 | 卫星/街道 | 中国 | 是(需自定义) |
| 天地图 | 卫星/街道 | 中国 | 是(需自定义) |
任务预规划工作流:
在离线环境下进行任务预规划的完整流程:
1. 在有网络的环境下,下载目标区域的离线地图。
2. 在 Plan View 中基于离线地图规划航线。
3. 设置地形跟随(Terrain Follow)模式时,需预先下载 DEM 高程数据。
4. 将任务保存为 .plan文件。
5. 到达作业现场后,连接飞控板,上传 .plan文件执行任务。
14.7.3 QGC 与 PX4 固件的深度配合(参数树 / MAVLink Shell)
参数树(Parameter Tree)管理:
PX4 固件包含数百个可调参数,QGC 提供了完整的参数管理界面:
1. 在 Vehicle Setup 中选择"Parameters"进入参数管理页面。
2. 参数按功能分组显示:
| 参数组 | 说明 | 关键参数示例 |
|---|---|---|
| MC_ | 多旋翼控制参数 | MC_ROLLRATE_P, MC_PITCHRATE_P |
| FW_ | 固定翼控制参数 | FW_R_TC, FW_P_TC |
| NAV_ | 导航参数 | NAV_ACC_RAD, NAV_FW_ALT_RAD |
| COM_ | 通用系统参数 | COM_DISARM_LAND, COM_LOW_BAT_ACT |
| SENS_ | 传感器参数 | SENS_BOARD_ROT, SENS_BARO_QNH |
| EKF2_ | EKF 状态估计参数 | EKF2_GPS_V_NOISE, EKF2_MAG_NOISE |
| MPC_ | 多旋翼位置控制 | MPC_XY_VEL_MAX, MPC_Z_VEL_MAX_UP |
| MIS_ | 任务参数 | MIS_TAKEOFF_ALT, MIS_LNDREQ |
| RTL_ | 返航参数 | RTL_RETURN_ALT, RTL_DESCEND_ALT |
1. 每个参数提供:
• 名称和描述。
• 当前值和默认值。
• 允许值范围和单位。
• 是否需要重启才能生效的提示。
1. 参数修改后点击"Save"写入飞控板,部分参数需要重启飞控板后生效。
参数批量管理:
• 导出参数文件:将所有参数导出为 .params文件,用于备份或在同型号飞行器间复制配置。
• 导入参数文件:从 .params文件批量加载参数,节省逐项配置时间。
• 参数对比:将当前参数与默认值对比,快速识别已修改的参数。
• 参数搜索:通过搜索框快速定位目标参数。
MAVLink Shell(命令行控制台):
QGC 内置了 MAVLink Shell 功能,允许操作者直接与 PX4 固件的 NSH(NuttX Shell)或系统命令行交互:
1. 在"Analyze"菜单中选择"MAVLink Console"。
2. Shell 终端连接到飞控板的命令行接口。
3. 常用 NSH 命令:
| 命令 | 说明 | 示例 |
|---|---|---|
| ver all | 显示固件版本信息 | - |
| param show * | 显示所有参数 | param show EKF2_* |
| param set | 设置参数值 | param set EKF2_GPS_V_NOISE 0.5 |
| listener | 监听 uORB 话题 | listener sensor_combined |
| top | 显示系统资源使用 | - |
| free | 显示内存使用情况 | - |
| dmesg | 显示系统启动日志 | - |
| perf | 显示性能计数器 | perf reset / perf |
| pwm info | 显示 PWM 输出信息 | - |
| esc_calib | 电调校准 | - |
| reboot | 重启飞控板 | - |
uORB 话题监听:
PX4 使用 uORB(micro Object Request Broker)作为内部进程间通信机制。通过 MAVLink Shell 可以实时监听各模块的数据交换:
# 监听传感器融合输出
listener estimator_status
# 监听 GPS 数据
listener vehicle_gps_position
# 监听电池状态
listener battery_status
# 监听遥控器输入
listener manual_control_input
14.7.4 Joystick 虚拟摇杆控制与 SITL 仿真对接
Joystick 虚拟摇杆控制:
QGC 支持通过 USB 游戏手柄或专业遥控器作为虚拟摇杆直接控制飞行器,适用于以下场景:
• 在没有物理遥控器的情况下进行测试飞行。
• 使用计算机上的飞行模拟设备进行训练。
• 通过自定义控制器实现特殊操控需求。
配置步骤:
1. 将 USB 游戏手柄(如 Xbox 手柄、PS 手柄)连接至计算机。
2. 在 QGC 设置中选择"Joystick"。
3. QGC 自动检测已连接的手柄设备。
4. 按照引导完成轴映射校准:
• 移动左摇杆的横滚轴,QGC 自动检测对应轴号。
• 移动左摇杆的俯仰轴,QGC 自动检测对应轴号。
• 移动右摇杆的油门轴,QGC 自动检测对应轴号。
• 移动右摇杆的偏航轴,QGC 自动检测对应轴号。
1. 配置按钮映射:将手柄按钮映射到 Arm、Disarm、RTL、Mode Switch 等功能。
2. 设置死区和指数曲线,使操控手感更自然。
【提示】安全提醒:虚拟摇杆控制依赖计算机与飞控板之间的数据链路。如果链路中断,飞行器将执行 Failsafe 动作。建议仅在受控环境中使用虚拟摇杆。
SITL(*Software In The Loop*)仿真对接:
QGC 可以无缝对接 PX4 的 SITL 仿真环境,无需真实硬件即可进行飞控算法验证和任务测试。
SITL 环境搭建:
1. 安装 PX4 开发环境(参考 PX4 官方文档)。
2. 在终端中启动 SITL 仿真:
# 启动四旋翼 SITL 仿真(使用 Gazebo 模拟器)
make px4_sitl gazebo-classic_iris
# 启动固定翼 SITL 仿真
make px4_sitl gazebo-classic_plane
# 仅启动 SITL(不启动 3D 可视化)
make px4_sitl none_iris
1. SITL 仿真器启动后,在本地 UDP 端口 14540 上提供 MAVLink 接口。
QGC 连接 SITL:
1. QGC 默认监听 UDP 14550 端口,SITL 默认连接 UDP 14540/14550。
2. 启动 SITL 后,QGC 会自动检测到仿真飞行器并建立连接。
3. 在 QGC 中看到的界面与连接真实飞控板完全一致。
4. 可以在 SITL 环境中进行:
• 完整的传感器校准流程(仿真数据)。
• 任务规划和执行测试。
• PID 调参验证。
• Failsafe 场景模拟。
• 飞行模式切换测试。
SITL 仿真中的故障注入:
通过 MAVLink Shell 可以在仿真中注入各种故障,测试系统的容错能力:
# 模拟 GPS 信号丢失
param set EKF2_GPS_CTRL 0
# 模拟电机故障
failure inject --type motor --id 1 --state off
# 模拟风速突变
wind set 10 5 2 # 设置风速 10m/s 北向 5m/s 东向 2m/s 上升
# 模拟电池电压下降
param set SIM_BAT_MIN 10.0
14.7.5 QGC 移动端(Android / iOS)使用指南
QGroundControl 移动端应用提供了与桌面端几乎一致的功能,是外场飞行的便携解决方案。
移动端功能对比:
| 功能 | 桌面端 | Android | iOS |
|---|---|---|---|
| 载具设置 | 完整 | 完整 | 完整 |
| 传感器校准 | 完整 | 完整 | 完整 |
| 任务规划 | 完整 | 完整 | 完整 |
| 飞行操作 | 完整 | 完整 | 完整 |
| 视频流 | 完整 | 完整 | 部分支持 |
| MAVLink Shell | 完整 | 完整 | 完整 |
| 日志下载 | 完整 | 完整 | 完整 |
| 自定义 QML | 支持 | 受限 | 受限 |
| 离线地图 | 完整 | 完整 | 完整 |
移动端连接方式:
1. USB OTG 连接:使用 USB OTG 转接线将飞控板直接连接到手机/平板的 USB 端口。Android 设备会自动识别串口设备。iOS 设备需要 Apple Camera Adapter。
2. WiFi 连接:如果飞控板通过 WiFi 模块(如 ESP8266/ESP32 WiFi 桥接)提供网络连接,手机连接同一 WiFi 后 QGC 自动发现飞行器。
3. 蓝牙连接:部分蓝牙数传模块(如 Holybro Telemetry Radio)支持与移动端蓝牙连接。
移动端界面优化:
• 移动端 QGC 针对触屏操作进行了界面优化:
• 按钮和控件更大,便于手指操作。
• 支持双指缩放地图。
• 支持长按地图弹出上下文菜单。
• 侧边栏菜单通过滑动手势展开/收起。
• 横屏模式下显示更多飞行数据。
移动端任务规划技巧:
1. 在 WiFi 环境或离线环境下,使用手指在地图上点触设置航点。
2. 双指缩放查看航线细节和地形。
3. 利用离线地图功能在无网络的野外环境预规划任务。
4. 保存的任务文件可通过手机存储或云存储备份。
移动端外场飞行建议:
• 使用平板电脑(如 iPad Pro 12.9")代替手机,更大的屏幕提供更好的地图和数据显示。
• 搭配遮阳罩使用,避免强光下屏幕反光导致看不清数据。
• 确保移动设备电量充足,建议配备充电宝。
• 开启飞行模式以节省电量并避免来电/通知干扰。
• 预先下载离线地图,避免现场网络不稳定影响使用。
• 移动端作为辅助操控工具使用,建议同时配备物理遥控器作为主操控设备。
本章小结
本章详细讲解了 QGroundControl 地面站的安装连接、载具设置、传感器校准、任务规划、飞行监控、日志分析等核心功能,并深入探讨了 MAVLink 数据流监控、视频流集成、多载具管理、QML 界面扩展、离线地图、PX4 参数管理、Joystick 控制和 SITL 仿真等特色功能。QGC 作为 PX4/ArduPilot 生态的核心地面站工具,其强大的功能和灵活的扩展性为 ZP-MH743 飞控板的调试和飞行操作提供了全面支持。掌握 QGC 的使用,是进行专业无人机飞行操作的必要技能。
15试飞前检查
【提示】警告: 试飞前检查是保障人身安全和设备安全的最重要环节。任何一项检查未通过,严禁进入试飞阶段。据统计,超过70%的首飞事故可追溯到试飞前检查不充分。请务必逐项完成所有检查项目,并建议由第二人进行复核。
15.1 硬件检查清单(螺丝、接线、焊点)
硬件检查是试飞前检查的第一道关卡。ZP-MH743 飞控板基于 STM32H743 高性能处理器,集成了大量外设接口,其硬件连接的可靠性直接决定了飞行安全。在组装完成后、通电之前,必须对整机硬件进行系统化的检查。
机架与结构检查: 首先检查机架的所有螺丝是否拧紧。碳纤维机架上使用的 M3 螺丝应使用合适的六角扳手逐一确认,力矩建议控制在 0.5~0.8 N·m 之间。特别注意电机安装座上的螺丝——电机在高速旋转时产生的振动会通过松动的螺丝传导至飞控板,导致 IMU 数据异常。检查机臂是否牢固固定在机架上,折叠机臂的锁定机构是否完全到位。对于四轴飞行器,确认四根机臂的几何角度呈标准 X 型或 H 型布局,相邻机臂夹角偏差不得超过 2°。
飞控板安装检查: ZP-MH743 飞控板应使用减震垫(如硅胶减震柱或泡沫垫)固定在机架中心板上,避免刚性连接导致的振动直接传导至 IMU 芯片。检查飞控板安装方向是否正确——板载丝印的箭头标记(FRONT)必须指向机头方向。固定螺丝不要过紧,以免减震垫被压扁失去减震效果。检查飞控板下方的焊接面是否有锡珠残留或短路风险,使用放大镜检查所有排针焊点的焊接质量。
电气连接检查: 逐项检查所有接线端子的连接情况。重点检查以下连接:
| 检查项目 | 检查要点 | 合格标准 |
|---|---|---|
| 电源模块(PDB/电源板) | 焊点饱满、无虚焊、正负极标识清晰 | 焊接面无锡珠、无短路风险 |
| 电机-电调连接线 | 三相线连接牢固、无松动 | 用手轻拉不脱落 |
| 电调-飞控信号线 | PWM/DShot信号线插入正确引脚 | 插头卡扣到位 |
| GPS模块连接线 | I2C/UART接口连接牢固 | 插头无松动、线缆有固定 |
| 遥控器接收机 | SBUS/CRSF信号线与飞控对应UART连接正确 | 信号线、电源线、地线无接反 |
| 罗盘/磁力计 | 远离强电流线路安装 | 与电调/电机线缆距离≥5cm |
| 电池插头(XT60/XT90) | 插头公母配合紧密、无烧蚀痕迹 | 插入时有明确的"咔嗒"感 |
焊点质量复查: 对飞控板上所有手工焊接的焊点进行质量复查。合格的焊点应呈现光滑的圆锥形,表面有光泽,无毛刺、无虚焊(冷焊)。虚焊的典型特征是焊点表面灰暗、粗糙,用手轻拨导线时焊点有松动感。对于 STM32H743 芯片周围的 LQFP176 封装引脚,建议使用放大镜或显微镜检查是否有桥接短路现象。所有焊接完成后,建议使用洗板水清洁残留的助焊剂,防止助焊剂腐蚀焊盘。
15.2 软件配置检查清单
在确认硬件连接无误后,进行软件配置检查。将 ZP-MH743 飞控板通过 USB-C 接口连接至电脑,打开地面站软件(如 INAV、Betaflight Configurator 或 ArduPilot Mission Planner,取决于所选固件),逐一核实以下配置项。
固件版本与基本参数确认: 首先确认已烧录的固件版本与飞控板硬件版本匹配。ZP-MH743 使用 STM32H743VIT6 处理器,对应固件中应正确识别芯片型号。在地面站的"状态"页面确认以下基本信息:CPU 型号显示为 STM32H743、陀螺仪和加速度计型号正确(如 ICM-42688-P 或 MPU6000,视具体硬件方案而定)、气压计型号正确(如 BMP388 或 MS5611)。检查固件编译日期,确认烧录的是最新稳定版本而非开发版。
关键配置参数核对: 在地面站中逐一核对以下关键参数,确保与实际硬件配置一致:
| 配置项目 | 检查内容 | 注意事项 |
|---|---|---|
| 机架类型 | 四轴 X 型 / 四轴 +型 / 六轴等 | 必须与实际机架结构一致 |
| 混控器(Mixer)配置 | 电机输出分配正确 | 与实际电机位置对应 |
| 电调协议 | PWM / DShot150 / DShot300 / DShot600 |
必须与电调支持的协议匹配 |
| 串口分配 | 各 UART 功能分配正确 | GPS、接收机、图传等各占独立串口 |
| 气压计 | 已启用且型号正确 | 确认气压计未受阳光直射干扰 |
| 磁力计 | 已启用、安装方向设置正确 | I2C 地址与硬件匹配 |
| 电池电压监测 | 分压比校准正确 | 与实际测量值偏差<5% |
| 电流监测 | 电流传感器校准正确 | 零电流偏移值已校准 |
| 失控保护(Failsafe) | 已配置且参数合理 | 返航高度高于周围障碍物 |
传感器校准状态确认: 检查加速度计是否已完成水平校准——将飞行器放置在绝对水平的台面上,在地面站中确认 Pitch 和 Roll 的角度读数接近 0°(允许 ±0.5° 偏差)。检查陀螺仪校准状态,确认在飞行器静止时陀螺仪的三轴角速度读数均为零或接近零。如果更换了固件或修改了飞控板安装位置,加速度计必须重新校准。
功能开关与模式配置: 确认遥控器通道映射正确(详见 15.3 节),飞行模式开关已分配到指定通道,各飞行模式(如自稳模式 STABILIZE、定高模式 ALT HOLD、GPS 定点模式 POSHOLD、返航模式 RTH)均已正确配置并可通过遥控器切换。确认解锁(Arm)和上锁(Disarm)操作已配置到指定的辅助通道或摇杆组合。
15.3 遥控器检查(通道映射、开关功能、舵量/行程)
遥控器是飞手与飞行器之间的唯一通信纽带,其配置正确性直接关系到飞行安全。在首次试飞前,必须完成遥控器的全面检查。
通道映射验证: 打开地面站的"接收机"页面,逐一拨动遥控器的两个摇杆,确认地面站显示的通道响应与实际物理操作一致。标准映射如下(以美国手 Mode 2 为例):
| 通道 | 功能 | 摇杆操作 | 地面站显示 |
|---|---|---|---|
| CH1 | 横滚(Roll) | 右摇杆左右 | 条状图左右移动 |
| CH2 | 俯仰(Pitch) | 右摇杆上下 | 条状图上下移动 |
| CH3 | 油门(Throttle) | 左摇杆上下 | 条状图上下移动 |
| CH4 | 偏航(Yaw) | 左摇杆左右 | 条状图左右移动 |
| CH5+ | 辅助通道 | 拨杆开关 | 显示开关状态变化 |
如果通道映射不正确,在遥控器端修改通道映射(如支持),或在飞控固件中通过 CHANNEL_MAP参数重新映射。严禁在通道映射未确认正确的情况下尝试解锁电机。
开关功能验证: 为每个拨杆开关分配功能后,逐一拨动开关,在地面站中确认功能切换正确。重点验证以下开关功能:
• 飞行模式开关(通常为三档开关):在不同档位间切换,确认地面站显示的模式名称与预期一致。例如,三档开关分别对应自稳模式(STABILIZE)、定高模式(ALT HOLD)和 GPS 定点模式(POSHOLD)。
• *解锁/上锁开关*:拨动到解锁位置,确认地面站的"ARM"状态指示变化;拨回上锁位置,确认状态恢复。
• 蜂鸣器开关(如配备):拨动后应听到蜂鸣器响起。
舵量与行程校准: 在地面站的接收机页面,检查各主通道(CH1\~CH4)的中位值和满行程值。将摇杆置于中位时,各通道读数应接近 1500μs(PPM/SBUS 标准);将摇杆推至极限位置时,读数应接近 1000μs 和 2000μs。如果中位偏差超过±10μs,需在遥控器端进行子微调(Sub-trim)。如果满行程不足(如仅达到 1100\~1900μs),需在遥控器端调整行程量(End Point/Travel Adjust)。油门通道的低油门位置尤其重要——确保油门摇杆拉到最低时,地面站显示的油门值确实为最低值,这关系到解锁和上锁操作的可靠性。
15.4 电机转向与顺序验证
电机转向和旋转顺序是多旋翼飞行器正常飞行的基础条件。ZP-MH743 飞控支持的混控器配置中,标准四轴 X 型的电机布局和转向有明确规定,任何错误都将导致飞行器无法正常起飞甚至剧烈翻滚。
电机编号与位置确认: 标准四轴 X 型布局的电机位置编号如下(从上方俯视):左前方为电机1(Motor 1),右前方为电机2(Motor 2),右后方为电机3(Motor 3),左后方为电机4(Motor 4)。在地面站的"电机测试"页面中,依次点击每个电机的测试按钮(注意:测试时务必拆除桨叶!),观察实际转动的电机是否与屏幕显示的编号对应。如果某个电机不转,检查电调信号线连接和电调供电;如果转动的电机与预期不符,检查信号线与飞控对应输出的连接。
转向验证: 在确认电机编号正确后,验证每个电机的旋转方向。四轴 X 型布局中,对角线上的两个电机旋转方向相同:电机1和电机3逆时针旋转(CCW),电机2和电机4顺时针旋转(CW)。在地面站电机测试页面,观察每个电机的旋转方向是否符合要求。如果转向错误,有两种修正方法:一是交换电调到电机的三相线中的任意两根(物理方法),二是在飞控固件中通过参数设置反转对应电机的转向(软件方法,DShot 协议支持)。推荐使用物理方法,因为软件反转在某些固件版本中可能存在兼容性问题。
【提示】安全警告: 在进行电机转向测试时,必须拆除所有螺旋桨!裸露的电机轴在旋转时虽然危险性较低,但一旦安装了螺旋桨,高速旋转的桨叶具有极高的杀伤力。即使是最小尺寸的5寸桨叶,在满油门时也能造成严重的割伤。任何涉及电机转动的测试,拆除桨叶是铁律,不可违反。
电机响应一致性检查: 在地面站中缓慢增加电机测试油门,观察四个电机是否大致同时开始旋转(启动一致性),以及在不同油门开度下四个电机的转速是否基本一致。如果某个电机明显延迟启动或转速偏低,可能的原因包括:电调配置不一致、电调固件版本不同、电机内部绕组问题、或电机轴承磨损。
15.5 GPS 搜星与罗盘校准验证
GPS 和罗盘(磁力计)是实现 GPS 定点飞行、自动航线和返航功能的核心传感器。在试飞前必须确认这两个传感器工作正常。
GPS 搜星测试: 将飞行器放置在室外开阔地带(远离高大建筑物和密集树冠),通电后等待 GPS 模块完成搜星。ZP-MH743 通常搭配 M8N 或 M10 系列 GPS 模块,在开阔环境下首次搜星(冷启动)通常需要 30~90 秒。在地面站中观察以下指标:
• 卫星数量: 锁定卫星数≥8 颗为合格,≥12 颗为良好。如果卫星数长期低于 6 颗,检查 GPS 天线是否被遮挡、GPS 模块安装位置是否合理(应安装在机架顶部、远离金属遮挡物)。
**• HDOP(水平精度因子): 该值越小越好,<1.5 为优秀,1.5~2.5 为良好,>3.0 时定位精度较差,不建议执行 GPS 依赖型任务。
• 3D Fix 状态: 地面站应显示"3D Fix"或"GPS Fix: 3D",表示已获得三维定位。如果仅显示"2D Fix"或"No Fix",需要继续等待或改善接收条件。
• GPS 更新速率: ZP-MH743 的串口应配置为 10Hz 更新速率(即每秒更新10次位置数据),在地面站的 GPS 信息页面确认更新频率。
罗盘(磁力计)校准: 罗盘校准是 GPS 定点飞行和返航功能的前提。校准不准确的罗盘会导致飞行器在 GPS 模式下缓慢旋转("马桶效应")或在返航时飞向错误方向。校准步骤如下:
1. 在地面站中进入罗盘校准页面。
2. 点击"开始校准"按钮。
3. 手持飞行器(或整机),在三维空间中缓慢旋转——前后左右各旋转360°,同时上下倾斜翻转,确保罗盘芯片感应到各个方向的磁场。整个校准过程通常持续 30~60 秒。
4. 校准完成后,地面站会显示校准结果和磁场强度。检查校准后的偏移值(Offset)是否在合理范围内——偏移量不应超过原始磁场强度的 30%。
罗盘干扰检查: 校准完成后,在地面站中观察罗盘的航向角(Heading)。将飞行器指向正北方向,航向角应接近 0°(或 360°);指向正东时应接近 90°;指向正南时应接近 180°;指向正西时应接近 270°。允许误差为 ±5°。如果偏差较大,检查罗盘安装位置是否靠近电流导线、电机或其他磁性物体。外置罗盘(如 HMC5883L 或 QMC5883L 模块)应安装在尽可能远离干扰源的位置,通常建议安装在机架顶部的 GPS 桅杆上。
15.6 电池检查与安全规范
锂电池(LiPo)是多旋翼飞行器的动力来源,同时也是最大的安全隐患之一。试飞前对电池的严格检查不容忽视。
电池外观与物理状态检查: 取出飞行用锂电池,进行以下外观检查:
| 检查项目 | 合格标准 | 不合格处理 |
|---|---|---|
| 电池外包装 | 无破损、无撕裂、无变色 | 更换热缩膜或报废 |
| 电池本体膨胀(鼓包) | 用手触摸各cell表面平整,无明显凸起 | 立即停止使用,按安全流程报废 |
| 电源插头(XT60/XT90) | 金属触点无烧蚀、无氧化、无松动 | 清洁或更换插头 |
| 平衡头(JST-XH) | 针脚无弯曲、无氧化 | 小心矫正或更换 |
| 导线 | 无断裂、无裸露铜线、硅胶外皮完好 | 重新焊接或更换导线 |
电压检查与一致性: 使用万用表或专用电池检测仪(如 ISDT BG7)测量电池各单体(Cell)电压。对于 4S 锂电池(标称 14.8V),各单体电压应在 3.7~4.2V 之间,且各单体之间的电压差不超过 0.05V。如果某个单体电压明显偏低(差值>0.1V),说明电池组的一致性已下降,不宜用于飞行测试。满电的锂电池单体电压应为 4.20V±0.02V。
放电能力与C数验证: 确认电池的最大持续放电电流满足飞行器需求。例如,如果飞行器满油门时四个电机总电流约为 80A,则 4S 5000mAh 20C 的电池理论最大持续放电电流为 5A × 20C = 100A,满足要求。如果使用C数过低的电池(如 10C),在大电流放电时电池会严重发热、鼓包甚至起火。
【提示】锂电池安全规范(必读): 1. 充电安全: 锂电池充电时必须有人看管,使用具有平衡充电功能的专用充电器,充电倍率不超过 1C(即 5000mAh 电池充电电流不超过 5A)。充电器应放置在防火袋或防爆箱中。 2. 存放安全: 长期存放时电池电压应保持在存储电压(约 3.85V/cell),存放在防爆箱或防火袋中,远离易燃物。 3. 运输安全: 运输过程中电池应做好绝缘保护,避免正负极短路。航空运输需遵守 IATA 危险品规定。 4. 使用安全: 飞行时设置低电压报警(建议 3.5V/cell)和低电压保护(建议 3.3V/cell)。电池温度超过 60°C 时立即停止使用。 5. 报废处理: 鼓包、漏液、严重过放的电池应按当地规定进行安全报废处理,不得随意丢弃。将电池放电至 0V 后送至指定的电池回收点。
16首次试飞
【提示】本章目标: 指导飞手安全地完成 ZP-MH743 飞行器的首次试飞。首飞的目标不是追求飞行性能,而是验证飞行器的基本功能正常、飞控参数合理、操控响应正确。整个过程应保持保守、有序进行。
16.1 试飞场地选择
试飞场地的选择对首飞安全至关重要。理想的试飞场地应满足以下条件:
开阔性要求: 场地应至少为 30m × 30m 的开阔空间,周围 50m 内无高大建筑物(>10m)、无密集树冠、无高压电线。开阔场地不仅能减少 GPS 信号遮挡和多径效应,还能在飞行器失控时提供足够的缓冲空间。公园草地、学校操场(非使用时段)、空旷的农田等都是理想选择。避免在居民区、停车场、道路旁等人口密集区域试飞。
地面条件: 优先选择平整的草地或土地作为起降点。水泥地面虽然平整,但飞行器起降时螺旋桨可能弹起小石子,且水泥地面对坠机时缺少缓冲。如果使用水泥地面,建议铺设一块专用的起降垫(Landing Pad)。避免在沙地、碎石地或积水地面起降——这些地面条件会损坏螺旋桨和电机。
环境条件: 首飞应在风速较低的环境下进行,地面风速不超过 5m/s(约3级风)。使用手持风速仪或观察旗帜、树枝的摆动来估计风速。避免在雨天、雾天或极端温度下试飞——湿气可能损坏电子设备,极端低温会降低锂电池性能。最佳的试飞时间是上午 9:00~11:00 或下午 15:00~17:00,此时大气较为稳定、光线充足。
空域合规性: 根据中国民用航空局(CAAC)的规定,确认试飞场地不在机场净空保护区、军事禁区或其他限制飞行区域范围内。可通过"UOM"(无人驾驶航空器一体化综合监管服务平台)查询当地空域限制。对于 250g 以上的无人机,需确保已完成实名登记并在机身粘贴登记标识。
16.2 解锁与起飞操作流程
解锁(Arm)和起飞是首飞中最关键的环节,必须严格按照标准化流程操作。
起飞前最后检查: 在解锁之前,完成以下最后检查清单:
1. 所有人员退至起飞点 5m 以外的安全区域。
2. 螺旋桨已正确安装——正向桨(CCW)安装在逆时针电机上,反向桨(CW)安装在顺时针电机上,桨叶螺母已拧紧。
3. 电池已牢固固定在机架上,电源已连接,电池固定带扣紧。
4. 遥控器已开机,信号连接正常(地面站显示 RSSI 信号强度正常)。
5. GPS 已锁定足够的卫星(≥8颗,3D Fix)。
6. 飞行模式已切换至自稳模式(STABILIZE / ANGLE),这是首飞推荐的模式。
7. 油门摇杆已拉至最低位置。
解锁操作: 执行解锁操作(通常是将偏航摇杆推至最左并保持 1~2 秒,或通过辅助通道开关触发)。解锁成功后,飞控板上的 LED 指示灯会由闪烁变为常亮(或按特定模式闪烁),电机可能会发出轻微的怠速旋转声。解锁后,保持双手握住遥控器,随时准备操控。
起飞操作: 缓慢推高油门摇杆,直到飞行器刚好离地。在离地约 0.5m 的高度保持悬停,此时重点观察以下现象:
• 飞行器是否有明显的水平漂移(前后左右缓慢移动)?轻微的漂移是正常的,但如果飞行器快速向某个方向持续漂移,需要立即降落检查加速度计校准。
• 飞行器是否有持续的偏航旋转(机头缓慢左转或右转)?如有此现象,需降落检查罗盘校准。
• 飞行器的姿态响应是否正确?轻推右摇杆前后左右,确认飞行器的前后左右倾斜方向与摇杆操作一致。
• 飞行器是否出现异常振动或异响?如有,立即降落检查。
如果上述观察一切正常,缓慢将飞行器升高到 2~3m 的高度,开始下一阶段的悬停测试。
【提示】安全提示: 如果在解锁瞬间电机出现异常行为(如某个电机突然高速旋转、电机不转、或飞行器剧烈抖动),立即执行上锁操作(偏航摇杆推至最右并保持)或切断电源。不要在异常状态下尝试"飞起来看看"。
16.3 悬停测试与基本操控
在确认飞行器能够正常起飞和保持悬停后,进行基本操控测试。这一阶段的目的是验证飞行器的操控响应正确、姿态保持稳定。
定点悬停测试: 在 GPS 定点模式(POSHOLD / LOITER)下,将飞行器悬停在约 3m 高度、距飞手 5~10m 的位置。松开所有摇杆(回到中位),观察飞行器的悬停稳定性。在 GPS 定点模式下,飞行器应能在无风条件下保持在约 ±1m 的范围内。如果飞行器持续向某个方向漂移,可能是 GPS 定位精度不足、罗盘校准偏差或加速度计水平校准有误。
基本操控响应测试: 依次测试以下操控动作,每个动作完成后回到悬停状态:
• 俯仰(Pitch): 轻推右摇杆向前,飞行器应向前飞行并低头;拉回摇杆,飞行器向后飞行并抬头。观察操控灵敏度——如果飞行器反应过激(前倾角度过大),可能需要降低 PID 的 P 值;如果反应迟钝,可能需要增加 P 值。
• 横滚(Roll): 轻推右摇杆向左/右,飞行器应向对应方向侧飞。观察操控响应是否与俯仰方向一致。
• 偏航(Yaw): 轻推左摇杆向左/右,飞行器应原地左旋/右旋。观察旋转是否平稳、是否有过冲(overshoot)。
• 油门(Throttle): 在定高模式下,推高油门飞行器上升,拉低油门飞行器下降。观察高度保持是否稳定——在定高模式下松开油门后,飞行器应保持高度不变。
自稳模式与手动模式对比: 在完成自稳模式(ANGLE / STABILIZE)下的基本操控测试后,如果飞手具备足够的操控经验,可以切换至半自稳模式(HORIZON / ACRO)进行简单的操控体验。注意,在半自稳模式下松开摇杆后飞行器不会自动回平,需要飞手手动控制姿态。首飞阶段不建议长时间使用此模式。
16.4 各飞行模式切换测试
ZP-MH743 支持多种飞行模式,每种模式对应不同的飞控逻辑和传感器使用策略。在首飞中应逐一测试各模式的切换和基本功能。
自稳模式(STABILIZE / ANGLE): 这是最基本的飞行模式,飞控使用加速度计和陀螺仪保持飞行器的姿态稳定。松开摇杆后,飞行器自动回平(Roll 和 Pitch 回到水平),但不会保持位置或高度。这是手动操控的基础模式,也是失控时的保底模式。在此模式下测试:摇杆中位回平速度是否正常(约 0.5~1 秒回到水平),最大倾斜角度是否符合设置(通常默认 35°~45°)。
定高模式(ALT HOLD): 在自稳模式基础上增加气压计高度保持功能。松开油门摇杆后,飞行器应保持当前高度。测试要点:油门中位死区是否合理(通常为 ±25~50μs),高度保持精度如何(在平静大气中应保持在 ±0.5m 以内)。如果飞行器在定高模式下持续上升或下降,检查气压计是否受到阳光直射或气流干扰。
GPS 定点模式(POSHOLD / LOITER): 在定高模式基础上增加 GPS 位置保持功能。松开所有摇杆后,飞行器应保持当前位置和高度。测试要点:位置保持精度(理想条件下 ±1~2m),进入和退出此模式时是否有明显的抖动或跳动。如果进入 GPS 定点模式时飞行器突然向某个方向快速移动,说明 GPS 定位与罗盘航向之间存在偏差,需要降落重新检查罗盘校准。
模式切换测试: 在各模式之间反复切换,观察切换过程是否平滑。特别注意:从 GPS 定点模式切换到自稳模式时,飞行器可能会因为惯性而继续移动,飞手需要立即进行操控修正。从自稳模式切换到 GPS 定点模式时,飞行器应在 2~3 秒内稳定位置。如果切换过程中出现剧烈振荡,立即切回自稳模式并降落。
16.5 降落与上锁操作
降落是飞行的最后环节,同样需要规范操作。
降落流程:
1. 将飞行器飞至飞手正前方约 3m 处,降低高度至 1m 左右。
2. 切换至自稳模式(STABILIZE),以获得最直接的操控响应。
3. 缓慢拉低油门,控制飞行器以约 0.5~1m/s 的速度匀速下降。
4. 当飞行器接近地面时(约 0.3m),保持油门不变,让飞行器自然着陆。避免在触地瞬间突然收油——这可能导致飞行器在触地后弹跳。
5. 确认飞行器完全着陆且稳定后,将油门拉至最低。
6. 执行上锁操作(通常是偏航摇杆推至最右并保持 1~2 秒)。
7. 电机完全停止旋转后,断开电池电源。
【提示】注意事项: 在 GPS 定点模式或定高模式下降落时,飞控会尝试保持高度,导致飞行器在接近地面时"不肯下降"。建议在距地面 1m 以内时切换到自稳模式进行手动降落,或者使用飞控自带的降落模式(LAND)——如果固件支持的话。
上锁后的检查: 上锁后、断开电源前,在地面站中快速检查以下信息:
• 飞行日志是否已正确记录(检查日志文件大小或条目数)。
• 飞行过程中是否有任何警告或错误信息。
• 电池剩余电压是否在安全范围内(如 4S 电池着陆电压不低于 14.0V / 3.5V per cell)。
断开电源后,用手触摸电机和电调,检查是否有异常发热。电机温度不超过 60°C 为正常(手感温热但不烫手),如果某个电机明显比其他电机更热,可能说明该电机存在机械阻力或电调配置问题。
16.6 首飞后数据分析
首飞结束后,应对飞行数据进行分析,以确认飞行器状态良好并为首飞后的调参提供依据。
飞行日志下载: 将飞控板通过 USB 连接至电脑,从地面站下载飞行日志(黑匣子日志)。ZP-MH743 的 STM32H743 处理器通常配备板载 Flash 存储(如 W25Q128 / 128Mbit),可存储大量飞行数据。在地面站中点击"下载日志"按钮,将日志文件保存到电脑。
关键数据分析: 使用日志分析工具(如 Blackbox Explorer、INAV Blackbox Tools 或 UAV Log Viewer)打开日志文件,重点分析以下数据:
• 陀螺仪原始数据: 查看悬停状态下的陀螺仪数据,确认振动水平是否在可接受范围内。如果陀螺仪数据中出现明显的高频振荡,说明存在机械振动问题,需要检查电机平衡、螺旋桨平衡和减震措施。
• PID 控制器输出: 查看 PID 控制器的 P、I、D 各项输出,评估当前 PID 参数的合理性。如果在悬停时 PID 输出持续振荡(周期性的大幅度波动),说明 P 值可能偏高;如果 PID 输出响应迟钝(大幅操控后需要很长时间恢复),说明 P 值可能偏低。
• 电池电压曲线: 查看整个飞行过程中的电池电压变化曲线。正常的电压曲线应在起飞后缓慢下降,在大油门机动时出现短暂下降后恢复。如果电压出现骤降(瞬间下降超过 1V),说明电池内阻过大或连接处存在接触不良。
• GPS 轨迹: 如果飞行中使用了 GPS 定点模式,查看 GPS 记录的飞行轨迹,评估定位精度和航向准确性。
• 电机输出一致性: 查看四个电机的 PWM 输出值,在悬停状态下四个电机的输出应基本一致(差异不超过 5%)。如果某个电机的输出明显偏高或偏低,可能说明电机效率不一致或机架重心偏移。
数据驱动的调参建议: 基于首飞数据分析结果,制定下一步的调参计划。典型的调参优先级为:首先解决振动问题(机械调整),然后优化 PID 参数(软件调整),最后测试 GPS 和自动飞行功能。详细调参方法参见第17章。
17进阶飞行测试
【提示】本章目标: 在首飞验证基本功能正常后,通过进阶飞行测试进一步优化飞行器性能,验证自动飞行功能和失效保护机制,确保飞行器在各种工况下的安全性和可靠性。
17.1 PID 调参实战(自稳/角速度环)
PID 控制器是飞控系统的核心算法,其参数直接决定了飞行器的操控手感和稳定性。ZP-MH743 的 STM32H743 处理器提供了强大的计算能力,支持高频率的 PID 运算(通常运行在 8kHz 的陀螺仪采样率和 4~8kHz 的 PID 循环频率),为精确调参提供了硬件基础。
PID 参数基础知识: PID 控制器由三个部分组成:
**• P(比例项 / Proportional): 决定了飞行器对偏差的即时响应强度。P 值越高,飞行器回正越快、操控越"硬",但过高会导致振荡(表现为飞行时的高频抖动)。P 值过低,飞行器反应迟钝、操控"软"。
**• I(积分项 / Integral): 用于消除持续性的稳态偏差(如风力造成的持续偏移)。I 值越高,飞行器抵抗持续外力的能力越强,但过高会导致"积分饱和"——飞行器在快速操控后出现延迟性的反向修正(表现为操控后的摆动)。
**• D(微分项 / Derivative): 用于抑制 P 项引起的振荡,起阻尼作用。D 值越高,对振荡的抑制越强,但过高会引入高频噪声(表现为电机发热和高频啸叫)。
调参流程(推荐方法):
调参应在自稳模式(ANGLE)和角速度模式(ACRO / RATE)下分别进行。推荐以下步骤:
步骤一:从默认参数出发。 大多数固件(INAV、Betaflight、ArduPilot)都为常见的机架类型提供了合理的默认 PID 参数。首飞时先使用默认参数,通过首飞日志分析确定需要调整的方向。
步骤二:逐步调整 P 值。选择一个轴(通常从 Roll 轴开始),每次将 P 值增加 10%\~20%,然后进行飞行测试。执行快速横滚操控后松杆,观察飞行器的恢复过程:如果飞行器快速回正且不振荡,P 值合适;如果回正后出现 2\~3 次振荡才稳定,P 值偏高,回调 10%;如果回正缓慢且有"漂移感",P 值偏低,继续增加。对 Pitch 轴重复同样的操作。
步骤三:调整 D 值。 D 值用于消除 P 值带来的振荡。如果 P 值调好后仍有轻微振荡,逐步增加 D 值(每次增加 5~10 个单位),直到振荡消失。注意 D 值不宜过高——过高的 D 值会导致电机发热和高频噪声,可以通过日志中的电机输出频谱分析来判断。
步骤四:调整 I 值。 在有风环境中飞行,观察飞行器抵抗风力的能力。如果飞行器被风吹偏后恢复缓慢,增加 I 值;如果飞行器在快速操控后出现"甩尾"(过冲后反向修正),降低 I 值。
步骤五:Yaw 轴单独调整。 偏航轴的 PID 通常与 Roll/Pitch 轴差异较大,需要单独调整。偏航轴的 P 值通常较低(避免偏航振荡),D 值通常为零或很小。
| PID 参数 | 调整方向 | 过高的症状 | 过低的症状 | 每次调整幅度 |
|---|---|---|---|---|
| P | 逐增 | 高频振荡、电机发热 | 反应迟钝、操控松软 | +10%~20% |
| I | 逐增 | 甩尾、积分饱和、延迟修正 | 抗风差、持续漂移 | +10%~15% |
| D | 逐增 | 电机高温、高频噪声 | P 值振荡无法消除 | +5~10 个单位 |
【提示】调参安全提示: 每次只修改一个参数,每次修改后立即飞行测试。如果测试中出现严重振荡无法控制,立即切回自稳模式降落,将参数回调到上一个稳定值。调参过程中建议在 GPS 定点模式和自稳模式之间切换——如果某个 PID 参数导致 GPS 模式下不稳定,说明参数过于激进。
17.2 自动航线飞行测试
自动航线飞行是 ZP-MH743 的高级功能之一,通过地面站预设航点(Waypoint),飞行器按照预设的路线自动飞行。这一功能广泛用于航拍、测绘、巡检等应用场景。
航线规划: 在地面站(如INAV Mission Control 或 QGroundControl)中规划一条简单的测试航线。首条航线建议包含3\~5 个航点,航线形状为简单的矩形或三角形,航点间距 20\~50m,飞行高度统一设置为 10\~20m(确保高于周围障碍物)。每个航点设置合理的飞行速度(建议 3\~5m/s),避免在首个测试航线中使用高速飞行。
航线上传与验证: 将规划好的航线上传至飞控板,然后在地面站中重新下载航线进行比对,确认上传的航线与规划的一致。特别检查:航点的高度值、飞行速度、在每个航点的动作(如拍照、悬停等待等)。
自动航线执行: 起飞后切换至航线飞行模式(MISSION / WP),飞行器将自动飞向第一个航点。在执行过程中,飞手应始终保持对飞行器的目视观察,手指放在模式切换开关上,随时准备切回手动模式接管。重点观察以下内容:
• 飞行器是否准确地飞越每个航点?航点偏差是否在可接受范围内(通常 ±2~3m)?
• 在航点间的转弯是否平滑?转弯半径是否合理?
• 到达最后一个航点后,飞行器是否按预期执行结束动作(如悬停等待、自动返航或降落)?
• 飞行速度是否稳定?是否出现忽快忽慢的现象?
航线精度优化: 如果航线执行精度不理想,可以从以下方面优化:增加 GPS 采样率(确认 ZP-MH743 的 GPS 串口配置为 10Hz)、优化 PID 参数(特别是位置环的 P 值)、检查航点间的距离是否过短(过短的间距会导致飞行器频繁加减速)、确认风速是否在合理范围内(强风会显著降低航线精度)。
17.3 返航(RTH/RTL)功能测试
返航功能是飞行器的安全保障机制之一,在飞手失去对飞行器的控制或主动触发时,飞行器自动返回起飞点并降落。ZP-MH743 通过 GPS 和罗盘的协同工作实现返航功能。
返航参数设置: 在地面站中配置返航相关参数,关键参数包括:
• 返航高度(RTH Altitude): 飞行器在返航过程中爬升到的安全高度,应高于飞行区域内所有障碍物。例如,如果周围最高的建筑物为 30m,返航高度应设置为 40~50m。
• 返航速度(RTH Speed): 返航过程中的水平飞行速度,建议设置为 5~8m/s。
• 降落速度(Landing Speed): 到达起飞点后的下降速度,建议设置为 0.5~1m/s,避免着陆冲击过大。
• 返航触发条件: 配置哪些情况下自动触发返航——遥控器失联(Failsafe)、GPS 信号丢失、低电压等。
手动返航测试: 在 GPS 定点模式下,将飞行器飞到距起飞点 50100m 的位置,高度 10~20m。然后通过遥控器开关触发手动返航(RTH 模式)。观察飞行器的返航过程:
1. 飞行器是否首先爬升至设定的返航高度?(如果当前高度已高于返航高度,应直接水平飞行。)
2. 飞行方向是否直接指向起飞点?如果飞行器偏离了起飞点方向飞行,说明罗盘校准存在偏差。
3. 到达起飞点上方后,飞行器是否稳定悬停片刻后开始缓慢下降?
4. 着陆过程是否平稳?着陆后是否自动上锁?
偏差分析: 返航精度受多种因素影响。GPS 定位精度(HDOP)直接影响起飞点的记录精度——如果首飞时 GPS 搜星不充分就记录了 Home 点,后续返航的精度会大幅下降。建议在每次起飞后、开始飞行任务前,等待 GPS 锁定足够多的卫星(≥10颗)后再记录 Home 点。如果返航落地点偏差超过 5m,检查 GPS 天线安装和罗盘校准。
17.4 失效保护测试(遥控器失联、GPS 丢失、低电压)
失效保护(Failsafe)是飞行器在出现异常情况时的最后一道安全防线。在受控环境下验证失效保护功能的正确性,是进阶测试的重要内容。
【提示】安全警告: 失效保护测试存在一定风险,必须在开阔、无人的场地进行,且飞手应随时准备通过重新建立信号连接来中止测试。建议有助手在场协助观察。
遥控器失联保护测试: 在 GPS 定点模式下,将飞行器悬停在 10m 高度、30m 远处。关闭遥控器电源(模拟遥控器失联),观察飞行器的行为。根据预设的失效保护策略,飞行器应执行以下操作之一:
• 自动返航(RTH): 飞行器爬升至返航高度后飞回起飞点——这是最推荐的失联保护策略。
• 原地降落(LAND): 飞行器在当前位置缓慢下降并着陆——适用于飞行区域较小、返航路线可能有障碍物的场景。
• 悬停等待(HOVER): 飞行器在当前位置悬停等待信号恢复——适用于信号可能短暂中断的场景。
在关闭遥控器后,等待 5~10 秒(这是典型的失效保护触发延迟时间),确认飞行器开始执行预设的保护动作。然后重新打开遥控器,确认信号恢复后能够重新获得控制权。
GPS 信号丢失保护测试: 在 GPS 定点模式下飞行时,用铝箔纸包裹 GPS 天线(模拟 GPS 信号被遮挡),观察飞控的行为。当 GPS 信号丢失时,飞控应自动切换到不依赖 GPS 的飞行模式(如自稳模式或定高模式),并触发警告(如蜂鸣器响起、OSD 显示警告信息)。飞手应能在手动模式下安全接管飞行器。测试完成后,移除铝箔纸,确认 GPS 信号恢复正常。
低电压保护测试: 在地面站中设置低电压警告阈值(如 3.5V/cell)和低电压保护触发阈值(如 3.3V/cell)。在飞行过程中,当电池电压降至警告阈值时,飞控应通过 OSD 显示警告信息或蜂鸣器报警。当电压继续降低至保护阈值时,飞控应自动触发返航或降落。注意:此测试会对电池造成较大压力,建议使用状态良好的电池并在电压降至保护阈值后立即着陆。
低电压保护参数设置建议:
| 参数 | 推荐值(4S电池) | 说明 |
|---|---|---|
| 电压警告阈值 | 14.0V(3.5V/cell) | 触发OSD警告和蜂鸣器 |
| 返航触发电压 | 13.6V(3.4V/cell) | 自动触发返航 |
| 强制降落电压 | 13.2V(3.3V/cell) | 忽略飞手输入,强制降落 |
| 电压监测滤波 | 10~20 | 避免因瞬时电压波动误触发 |
17.5 大机动飞行与极限测试(按需)
大机动飞行和极限测试用于验证飞行器在高负载工况下的性能和可靠性。此类测试具有一定的风险性,仅建议在完成前述所有测试且对飞行器状态有充分信心后进行。
快速机动测试: 在 GPS 定点模式下,执行快速的前飞、后飞、侧飞和旋转操作,观察飞行器的响应和恢复能力。重点检查:快速操控后飞行器是否能迅速稳定(不超过 2~3 次振荡)、电机和电调是否出现过热保护、PID 控制器是否出现积分饱和。
最大速度测试(按需): 在自稳模式下,满油门前飞测试飞行器的最大水平速度。注意:高速飞行时螺旋桨效率降低、电机负载增加,需密切监控电池电压和电机温度。建议在 GPS 定点模式下设置最大速度限制(如 15m/s),防止飞行器飞出可视范围。
抗风能力测试(按需): 在有风条件下(5~8m/s)飞行,评估飞行器在风力干扰下的姿态保持能力和航向稳定性。如果飞行器在大风中出现严重的姿态偏移或无法维持航向,可能需要增加 PID 的 I 值或降低最大倾斜角度限制。
极限载荷测试(按需): 如果飞行器设计用于携带载荷(如相机、传感器等),在安装载荷后进行飞行测试,验证飞行器在满载条件下的悬停稳定性和操控响应。注意:载荷会改变飞行器的重心位置和总质量,可能需要重新进行加速度计校准和 PID 调参。
【提示】极限测试安全提醒: 极限测试时务必保持足够的安全距离(人员距离飞行器 10m 以上),确保电池有充足的电量余量(测试结束时电池电量不低于 30%),并制定应急预案(如预设紧急降落点、准备灭火器)。如果测试中出现任何异常(电机过热、结构异响、操控响应异常),立即中止测试并降落检查。
18试飞问题诊断与排除
【提示】本章目标: 系统性地介绍 ZP-MH743 飞行器在试飞过程中可能遇到的常见问题及其诊断排除方法。掌握这些排故技能,能够显著提高试飞效率,减少因问题排查不当导致的安全事故。
18.1 振动异常分析与处理
振动是多旋翼飞行器最常见也最容易被忽视的问题之一。ZP-MH743 飞控板上搭载的 IMU(惯性测量单元)对振动非常敏感——过大的振动会导致陀螺仪和加速度计数据失真,进而引发姿态估计错误、PID 控制不稳定甚至飞行失控。
振动的识别方法:
振动问题通常有以下表现:飞行器悬停时出现肉眼可见的高频抖动(桨叶模糊);地面站中的陀螺仪数据出现大幅度的高频噪声;PID 输出中的 D 项异常偏高;电机发出异常的高频啸叫声;飞行日志中的加速度计数据显示 Z 轴振动幅值超过 2~3 m/s²(正常值应低于 1 m/s²)。
振动的来源分类:
| 振动来源 | 典型频率 | 特征表现 | 常见原因 |
|---|---|---|---|
| 螺旋桨不平衡 | 与转速同频(1x) | 低频周期性振动 | 桨叶质量不均、桨叶变形、桨叶安装不正 |
| 电机不平衡 | 与转速同频或倍频 | 中频振动,随转速增大 | 电机轴弯曲、电机轴承磨损、转子不平衡 |
| 机架共振 | 结构固有频率 | 特定转速下振动骤增 | 机架刚性不足、螺丝松动、机臂不对称 |
| 电机高频噪声 | PWM频率或其倍频 | 高频振动,电机啸叫 | 电调PWM频率设置不当、电机线圈问题 |
诊断步骤:
1. 日志分析定位: 下载飞行日志,使用 FFT(快速傅里叶变换)分析工具查看陀螺仪数据的频率谱。正常飞行器的频谱应相对平滑,主频(对应螺旋桨转速)处有一个峰值但不超过阈值。如果频谱中出现异常的尖峰,根据频率可以初步判断振动来源。例如,如果主频为 80Hz(对应电机转速约 4800RPM)处的峰值特别突出,说明是螺旋桨或电机的转速同频振动。
2. 逐一排查法: 分别更换每个螺旋桨(使用已知平衡良好的桨叶),测试振动是否改善。如果更换某个桨叶后振动明显降低,说明该桨叶存在不平衡问题。如果更换所有桨叶后振动仍无改善,问题可能在电机或机架上。
3. 电机排查: 拆下螺旋桨,用手转动每个电机,感受是否有卡涩、异响或不均匀的阻力。如果某个电机转动不顺畅,可能轴承已损坏。使用电机测试功能,逐一让每个电机在不同转速下运行,观察振动变化。
处理措施:
• 螺旋桨平衡: 使用螺旋桨平衡器(Prop Balancer)对桨叶进行平衡校正。在较轻的一侧粘贴透明胶带增加重量,直到桨叶在平衡器上可以静止在任意角度。
• 电机更换: 如果确认电机轴承磨损或轴弯曲,更换电机。安装新电机后重新进行振动测试。
• 减震改善: 检查飞控板的减震垫是否被压扁或老化,必要时更换更软的减震垫。对于严重振动的机架,可以考虑在飞控板下方使用双层减震(如硅胶垫 + 泡沫垫)。
• 软件滤波: 在飞控固件中配置陀螺仪低通滤波器(Gyro Low-Pass Filter),滤除高频振动噪声。ZP-MH743 的 STM32H743 处理器具有充足的计算资源支持多级滤波,但过度滤波会引入相位延迟,需要在滤波效果和操控响应之间取得平衡。推荐的滤波器截止频率为振动主频的 1.5~2 倍。
18.2 漂移/偏航问题分析
飞行器在悬停时出现缓慢的水平漂移或持续的偏航旋转,是试飞中常见的问题。漂移可能由多种原因引起,需要系统性地逐一排查。
水平漂移分析:
水平漂移(飞行器在 GPS 定点模式下缓慢向某个方向移动)的可能原因及处理方法:
原因一:加速度计水平校准偏差。 这是最常见的原因。如果飞控板安装不完全水平,或加速度计校准时的台面不够水平,飞控会将倾斜角度误判为"水平",导致飞行器向一个方向持续漂移。处理方法:将飞行器放置在绝对水平的台面上(使用水平仪确认),重新执行加速度计校准。校准后在地面站中确认 Roll 和 Pitch 角度读数接近 0°。
原因二:GPS 定位漂移。 GPS 定位本身存在随机误差,在卫星信号较弱(如建筑物遮挡、多云天气)时误差会增大。如果漂移方向随机变化且速度较慢(<0.5m/s),可能是正常的 GPS 定位波动。处理方法:等待 GPS 搜星条件改善后再飞行,确保 HDOP 值<2.0。
原因三:风力影响。 即使是微风(2~3m/s)也会导致飞行器在自稳模式下持续漂移。在 GPS 定点模式下,飞控会自动抵抗风力保持位置,但如果风力持续增强超出飞控的修正能力,仍可能出现漂移。处理方法:降低飞行高度(地面附近风力较小),或增加 PID 的 I 值以提高抗风能力。
原因四:重心偏移。 如果电池安装位置偏离机架中心,飞行器的重心不在几何中心,飞控需要持续输出不平衡的电机力来维持姿态,这在长时间飞行中可能导致漂移。处理方法:调整电池安装位置,使整机重心尽可能位于机架几何中心。
偏航漂移分析:
偏航漂移(飞行器在悬停时缓慢旋转,俗称"马桶效应")通常由罗盘问题引起:
原因一:罗盘校准不准确。 这是"马桶效应"的最常见原因。处理方法:在远离金属物体和电子设备的环境下重新执行罗盘校准,确保校准时进行了充分的三维旋转。
原因二:罗盘安装方向错误。 如果外置罗盘的安装方向与飞控固件中设置的方向不一致,会导致航向信息完全错误。处理方法:确认罗盘模块上的方向标记(箭头)朝向机头方向,并在地面站中正确设置罗盘安装方向参数(如 CW0、CW90、CW180、CW270)。
原因三:磁场干扰。 大电流导线(电调到电机的三相线)在通电时会产生磁场,干扰附近的罗盘传感器。处理方法:确保罗盘安装位置远离大电流线路(距离 ≥5cm),如果条件允许,使用外置罗盘并将其安装在 GPS 桅杆顶部。
18.3 电机/电调故障排查
电机和电调是飞行器的动力执行机构,其故障直接影响飞行安全。以下是常见的电机/电调问题及排查方法。
电机不转或启动困难:
可能的原因及排查步骤:
1. 电调信号问题: 在地面站的电机测试页面点击测试按钮,使用示波器或逻辑分析仪测量飞控到电调的信号线,确认是否有正确的 PWM 或 DShot 信号输出。如果无信号,检查飞控的定时器配置和引脚分配。
2. 电调供电问题: 测量电调的电源输入端电压,确认电池供电正常到达电调。如果电压为零,检查 PDB 板上的焊接和保险丝。
3. 电调配置问题: 某些电调需要在使用前进行油门行程校准(Throttle Range Calibration)。如果油门行程未校准,电调可能无法正确识别飞控发出的油门信号。按照电调说明书执行校准流程。
4. 电机内部故障: 用万用表测量电机三相绕组之间的电阻值,三相电阻应基本一致(差异<10%)。如果某相电阻明显偏大或为无穷大,说明绕组断路。如果某相电阻为零,说明绕组短路。
电机过热:
电机温度超过 80°C 为过热。常见原因:PID 的 D 值过高(导致高频振荡消耗大量能量)、螺旋桨尺寸过大导致电机过载、电机轴承磨损增加摩擦阻力、电调时序(Timing)设置不当。处理方法:首先检查 PID 参数是否合理(降低 D 值测试),然后检查螺旋桨与电机的匹配关系,最后检查电机轴承状态。
电调故障:
电调的常见故障表现:某个电机完全不响应(电调损坏)、电机间歇性停转(电调过温保护或 BEC 供电不足)、所有电机同时失去动力(主 BEC 故障或电源模块故障)。排查方法:将疑似故障的电调与正常工作的电调交换信号线和电机,如果故障跟随电调移动,则确认电调损坏;如果故障留在原位,则问题在信号端。
电调固件更新: 对于支持 BLHeli_32 或 AM32 固件的电调,建议定期检查并更新固件。新版本的固件通常包含改进的启动特性、更精确的时序控制和更好的 DShot 协议兼容性。使用 BLHeli Configurator 或 AM32 Configurator 通过飞控直通(Passthrough)功能更新电调固件,更新后重新进行油门行程校准。
18.4 GPS 定位精度问题
GPS 定位精度直接影响 GPS 定点飞行、自动航线和返航功能的可靠性。以下是常见的 GPS 精度问题及其解决方法。
搜星困难/卫星数不足:
如果 GPS 模块在开阔环境下长时间(超过 5 分钟)仍无法锁定足够的卫星(<6颗),可能的原因包括:
1. GPS 天线遮挡: 检查 GPS 模块安装位置,确保天线上方无金属遮挡物。碳纤维材料对 GPS 信号有一定衰减(约 3~6dB),如果 GPS 安装在碳纤维板下方,建议将 GPS 移至机架顶部。
2. GPS 模块故障: 将 GPS 模块连接至电脑(通过 USB-TTL 转接板),使用 u-blox 的 u-center 软件查看原始卫星信号强度。如果所有卫星的信号强度(C/N0)均低于 25dB-Hz,可能是 GPS 天线损坏或模块故障。
3. 星历过期: 如果 GPS 模块长时间未使用(超过数周),星历数据可能已过期,导致冷启动时间显著增加。解决方法:在开阔环境下保持 GPS 通电 15~30 分钟,让其重新下载星历。
定位漂移/跳动:
GPS 定位点在短时间内大幅度跳动(跳动幅度>5m),可能的原因:
1. 多径效应: GPS 信号被周围的建筑物、金属表面反射后到达天线,导致定位计算错误。典型场景:在建筑物附近飞行、在金属屋顶上方飞行。解决方法:远离反射面,选择开阔场地飞行。
2. 电磁干扰: 图传(VTX)的大功率射频信号可能干扰 GPS 接收。特别是当图传天线距离 GPS 天线过近时(<10cm),干扰尤为严重。解决方法:增加图传天线与 GPS 天线的距离,或使用 GPS 模块自带的陶瓷滤波器和 SAW 滤波器。
3. GPS 模块质量问题: 低质量的 GPS 模块(如未使用 SAW 滤波器和 LNA 低噪声放大器的模块)在复杂环境下性能急剧下降。建议使用带 SAW 滤波器和 LNA 的 M8N 或 M10 系列 GPS 模块。
返航落点偏差大:
返航落点偏离起飞点超过 5m,可能的原因:
1. Home 点记录不准确: 如果在 GPS 搜星不充分时(卫星数<8)就记录了 Home 点,该点坐标本身就有较大误差。解决方法:每次起飞后等待 GPS 锁定≥10颗卫星、HDOP<1.5 后再记录 Home 点。
2. 罗盘偏差导致航向错误: 返航方向依赖罗盘提供的航向信息,罗盘偏差会直接导致返航路径偏离。解决方法:重新进行罗盘校准,并验证航向准确性。
3. 风的影响: 返航过程中遇到侧风,飞行器需要时间修正风偏。在大风条件下,返航精度会自然降低。解决方法:适当增加返航速度以提高抗风能力,或在风力较小时进行返航测试。
18.5 日志分析方法(黑匣子/Flash 日志解读)
飞行日志(黑匣子数据)是诊断飞行问题的最有价值的工具。ZP-MH743 的 STM32H743 处理器配备了高速 SPI 接口,可以以高数据速率将飞行数据实时写入板载 Flash 芯片(如 W25Q128),记录包括陀螺仪原始数据、加速度计数据、PID 输出、电机输出、GPS 数据、电池数据等在内的完整飞行信息。
日志下载与管理:
将飞控通过 USB 连接电脑,在地面站中进入"黑匣子"/"Flash 日志"页面,可以查看存储的日志列表。每次飞行(从上锁到下次解锁之间)生成一条独立的日志记录。点击"下载"按钮将日志文件保存到电脑。建议按日期和飞行目的对日志文件进行归档管理,便于后续回溯分析。
日志分析工具选择:
• *Blackbox Explorer(INAV/Betaflight 官方工具):* 支持图形化显示所有飞行参数,内置 FFT 分析功能,是分析 PID 性能和振动问题的首选工具。
**• UAV Log Viewer(在线工具): 无需安装软件,直接在浏览器中查看日志,适合快速浏览和分享。
**• Python + pandas(自定义分析): 对于需要深度定制的分析需求(如统计特定条件下的数据分布),可以使用 Python 脚本读取 CSV 格式的日志数据进行处理。
关键日志字段解读:
| 日志字段 | 含义 | 分析要点 |
|---|---|---|
| gyroADC[0/1/2] | 陀螺仪三轴原始数据(Roll/Pitch/Yaw) | 悬停时均值应接近零,方差反映振动水平 |
| accSmooth[0/1/2] | 加速度计三轴滤波数据 | Z轴值应接近重力加速度(约9.8m/s²或1g) |
| axisP[0/1/2] | PID P项输出 | 反映控制器的即时响应强度 |
| axisI[0/1/2] | PID I项输出 | 持续增长可能表示积分饱和 |
| axisD[0/1/2] | PID D项输出 | 异常偏高可能表示振动过大或D值设置过高 |
| motor[0~3] | 四个电机的PWM/DShot输出值 | 悬停时四个值应基本一致 |
| vbatLatest | 实时电池电压 | 急剧下降可能表示电池问题或大电流负载 |
| amperageLatest | 实时电流 | 异常偏高可能表示电机过载或短路 |
| GPS_numSat | GPS锁定卫星数 | 应保持在8以上 |
| GPS_coord[lat/lon] | GPS经纬度 | 用于绘制飞行轨迹地图 |
| heading | 航向角 | 应与罗盘读数一致 |
| baroAlt | 气压计高度 | 用于评估高度保持精度 |
振动分析的 FFT 方法:
在 Blackbox Explorer 中,选择悬停阶段的陀螺仪数据,点击"FFT"按钮生成频率谱图。正常的频率谱图应呈现以下特征:
• 在电机旋转频率处(通常 50~120Hz,取决于螺旋桨尺寸和电机转速)有一个清晰的主峰。
• 主峰之外无明显的异常峰值。
• 高频段(>200Hz)的能量较低,说明机械滤波和软件滤波效果良好。
如果频谱图中出现以下异常,需要针对性处理:
• 低频段(<50Hz)出现大幅峰值:可能是机架刚性不足或机臂松动。
• 中频段(50~200Hz)出现多个尖锐峰值:可能是电机轴承问题或螺旋桨严重不平衡。
• 高频段(>200Hz)能量异常偏高:可能是 PID 参数过于激进(D 值过高)或电调 PWM 频率与结构共振。
基于日志的 PID 调参分析:
分析快速操控动作(如快速横滚后松杆)时的 PID 输出波形,可以指导 PID 参数调整:
• 如果松杆后 P 项输出呈衰减振荡(振幅逐渐减小),且衰减时间超过 0.5 秒,说明 P 值偏高或 D 值偏低。
• 如果松杆后 P 项输出呈过阻尼响应(缓慢回到零,无振荡),说明 P 值偏低。
• 如果 I 项输出在快速操控后持续偏大且缓慢恢复,说明存在积分饱和,应降低 I 值或增加积分限幅(I-term Limit)。
故障复盘案例:
案例一:飞行器在 GPS 定点模式下突然快速向右侧漂移。通过分析日志发现,在漂移发生时刻 GPS_numSat 从 12 骤降至 4,HDOP 从 1.2 升至 5.8,说明 GPS 信号突然恶化(可能是卫星经过遮挡区域)。飞控在卫星数不足时无法维持位置锁定,导致漂移。解决方案:避免在该区域的同一时间段进行 GPS 依赖型飞行。
案例二:飞行器在悬停时出现持续的偏航振荡(约 2Hz 频率的左右摆动)。日志分析显示 Yaw 轴的 axisP 和 axisD 输出同步振荡,FFT 分析在 2Hz 处有明显的峰值。降低 Yaw P 值后振荡消失,但响应变慢。最终通过将 Yaw P 值降低 30% 并适当增加 Yaw I 值来平衡响应速度和稳定性。
【提示】日志分析的黄金法则: 每次飞行后都下载并保存日志,即使飞行看起来一切正常。当问题发生时,对比正常飞行和异常飞行的日志数据,往往能快速定位问题根源。养成"飞行必记、有疑必查"的习惯,是成为成熟飞手和调试工程师的关键。
【提示】本篇小结: 试飞与调试是将理论设计和实际飞行连接起来的桥梁。从严格的试飞前检查,到谨慎的首飞验证,再到系统的进阶测试和问题诊断,每一个环节都需要耐心、细致和科学的方法。ZP-MH743 飞控基于 STM32H743 的强大性能为精确控制提供了硬件保障,但最终的飞行品质取决于调试者对系统的理解和对细节的把控。牢记安全第一,循序渐进,不断积累经验,你的飞行器将越飞越好。
19ROS2 基础与开发环境搭建
19.1 ROS2 概述
ROS2(Robot Operating System 2)是当前机器人与无人机上层应用开发中广泛使用的开源中间件平台。相比 ROS1,ROS2 在实时性、跨平台支持、通信机制和工程部署能力等方面都有明显提升。对于无人机系统而言,ROS2 主要承担高层任务规划、状态感知、数据记录、仿真验证以及与飞控之间的数据通信等功能。
本章主要完成以下内容:
- 搭建 ROS2 Jazzy 开发环境;
- 验证 ROS2 基本通信功能;
- 安装开发工具 colcon 与 rosdep;
- 创建 ROS2 工作空间;
- 创建 Python 功能包 drone_tools;
- 编写并运行 hello_drone 节点;
- 测试节点的话题发布与订阅功能。
19.2 ROS2 开发环境安装与验证
19.2.1 使用小鱼 ROS 一键安装
为提高安装效率,本实验采用小鱼 ROS 一键安装方式完成 ROS2 环境部署。通过下载安装脚本并运行,可自动完成 ROS2 软件安装及常用环境配置。
wget http://fishros.com/install -O fishros . fishros

图19-1 小鱼 ROS 一键安装脚本页面
19.2.2 ROS2 环境检查
ROS2 安装完成后,首先需要检查系统中 ROS2 是否可正常调用。通过加载 Jazzy 环境变量,并运行 ros2 --help 命令,可以查看 ROS2 命令行工具是否可用。
source /opt/ros/jazzy/setup.bash
ros2 --help
当终端能够正确显示 topic、node、service、run、launch 等 ROS2 常用命令时,说明 ROS2 基础环境安装成功。

图19-2 ROS2 命令帮助界面
19.2.3 使用 talker 与 listener 验证通信
为了进一步验证 ROS2 的发布/订阅通信功能,本实验分别运行官方示例节点 talker 和 listener。
终端1:运行发布者 talker
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker
该节点会持续向外发布字符串消息“Hello World”。

图19-3 talker 节点运行结果
终端2:运行订阅者 listener
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_py listener
该节点会接收 talker 节点发送的消息,并在终端中显示“I heard: [Hello World: x]”。

图19-4 listener 节点运行结果
如果 talker 能持续发布消息,listener 能同步接收消息,则说明 ROS2 的基本通信机制工作正常。
19.2.4 开发工具检查
ROS2 开发过程中常用的两个工具分别为 colcon 和 rosdep。colcon 用于编译 ROS2 工作空间,rosdep 用于自动安装功能包依赖。
colcon --help
rosdep --version
若终端能够正确显示 colcon 的帮助信息,并输出 rosdep 版本号,则说明相关开发工具环境正常。

图19-5 colcon 与 rosdep 工具检查结果
19.3 ROS2 工作空间创建与功能包配置
19.3.1 创建 ROS2 工作空间
在 ROS2 中,用户自定义程序通常放置在工作空间中进行统一管理。实验中创建的工作空间名称为 ros2_ws。
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
完成后,工作空间中会自动生成 build、install、log 和 src 等目录,这说明工作空间已创建成功。

图19-6 工作空间创建与初始编译结果
19.3.2 创建 Python 功能包 drone_tools
进入工作空间源码目录后,创建 Python 类型的 ROS2 功能包 drone_tools:
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python drone_tools --dependencies rclpy std_msgs geometry_msgs
创建完成后,可通过 tree 命令查看其目录结构:
tree ~/ros2_ws/src/drone_tools
功能包中包含 package.xml、setup.py、setup.cfg、resource、drone_tools 和 test 等标准目录与文件,说明 Python 功能包创建成功。

图19-7 drone_tools 功能包目录结构
19.3.3 编写 hello_drone.py 节点程序
在 drone_tools/drone_tools 目录下创建 hello_drone.py 文件,用于编写第一个 ROS2 无人机示例节点。
该节点主要实现以下功能:
- 发布无人机状态话题
/drone/status; - 发布模拟位姿话题
/drone/pose; - 订阅控制指令话题
/drone/command; - 根据接收到的文字指令输出相应提示信息。

图19-8 hello_drone.py 节点代码编写界面
程序编写完成后,需要赋予执行权限:
chmod +x hello_drone.py
19.3.4 配置 setup.py 入口文件
为了能够通过 ros2 run 直接运行 Python 节点,需要在功能包的 setup.py 中注册入口函数。在 entry_points 中加入:
'hello_drone = drone_tools.hello_drone:main',
该配置表示在终端执行 ros2 run drone_tools hello_drone 时,将自动调用 hello_drone.py 中的 main() 函数。

图19-9 setup.py 入口配置界面
19.3.5 安装依赖并编译功能包
在工作空间根目录中执行以下命令安装依赖:
cd ~/ros2_ws
rosdep install -i --from-paths src --rosdistro jazzy -y
当终端输出“All required rosdeps installed successfully”时,说明功能包依赖安装成功。

图19-10 rosdep 依赖安装成功界面
随后对功能包进行编译:
colcon build --packages-select drone_tools --symlink-install
编译成功后,终端会显示 Starting drone_tools、Finished drone_tools 和 Summary: 1 package finished。

图19-11 drone_tools 功能包编译成功界面
19.3.6 加载工作空间环境
功能包编译完成后,需要重新加载 ROS2 环境以及当前工作空间环境:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
随后使用以下命令检查功能包是否已被 ROS2 正确识别:
ros2 pkg list | grep drone_tools
若终端输出 drone_tools,则说明该功能包已成功注册到当前 ROS2 环境中。

图19-12 工作空间环境加载与功能包识别结果
19.4 Hello Drone 节点运行与通信测试
19.4.1 运行 hello_drone 节点
在终端中输入:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 run drone_tools hello_drone
运行后,节点会周期性输出 Hello Drone 节点已启动、飞控型号 ZP-MH743(模拟状态)以及发布状态等信息,说明节点已开始正常工作,并持续发布无人机状态信息。

图19-13 hello_drone 节点运行结果
19.4.2 查看 /drone/pose 话题数据
在另一个终端中输入:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 topic echo /drone/pose
终端中会持续输出位姿消息,包括坐标位置 x、y、z 和姿态四元数 x、y、z、w。当前节点持续发布的位姿信息为固定模拟值:位置为 (0.0, 0.0, 0.0),姿态为 (0.0, 0.0, 0.0, 1.0),说明 /drone/pose 话题发布功能正常。

图19-14 /drone/pose 话题查看结果
19.4.3 发送 /drone/command 指令测试
为了验证节点的订阅功能,在终端中分别向 /drone/command 话题发布三条测试命令:
ros2 topic pub --once /drone/command std_msgs/msg/String {data: 'ARM'}
ros2 topic pub --once /drone/command std_msgs/msg/String {data: 'TAKEOFF'}
ros2 topic pub --once /drone/command std_msgs/msg/String {data: 'LAND'}
实验结果表明,发送 ARM、TAKEOFF 和 LAND 后,hello_drone 节点能够分别接收指令,并输出模拟执行解锁、起飞和降落的提示信息,说明节点已经能够正常订阅并处理控制指令。

图19-15 /drone/command 指令发布与接收测试结果
19.4.4 查看节点与话题信息
为进一步验证节点的通信关系,可使用以下命令查看节点和话题信息:
ros2 node info /hello_drone_node
ros2 topic list | grep drone
ros2 topic type /drone/status
实验结果显示,节点 /hello_drone_node 已正常注册;话题列表中成功出现 /drone/command、/drone/pose 和 /drone/status;/drone/status 的消息类型为 std_msgs/msg/String。由此可见,该节点的发布、订阅以及 ROS2 注册信息均正常。

图19-16 节点与话题信息查看结果
19.5 本章小结
本章完成了 ROS2 Jazzy 基础开发环境的搭建与验证,并通过 hello_drone 节点实现了 ROS2 基本通信流程的实践。主要完成内容如下:
- 采用小鱼 ROS 一键安装方式完成 ROS2 Jazzy 环境部署;
- 使用 ros2 --help 验证 ROS2 命令行工具可正常使用;
- 使用 talker 与 listener 示例验证 ROS2 发布/订阅通信功能;
- 检查 colcon 与 rosdep 工具工作正常;
- 成功创建 ROS2 工作空间 ros2_ws;
- 成功创建 Python 功能包 drone_tools;
- 编写并运行 hello_drone 节点;
- 实现 /drone/status 和 /drone/pose 的发布;
- 实现 /drone/command 的订阅与处理;
- 完成节点信息与话题类型的检查验证。
通过本章实验,已经掌握了 ROS2 的基础开发流程,包括环境搭建、工作空间创建、功能包管理、节点编写以及话题通信测试等内容,为后续 MAVROS2、PX4 桥接和无人机上层控制节点开发打下基础。
20MAVLink 协议详解
MAVLink(Micro Air Vehicle Link)是一种轻量级无人机通信协议,主要用于飞控、地面站、机载计算机和外围设备之间的数据交换。本章采用 Ubuntu 24.04、PX4 SITL、Gazebo Sim、Python 3 和 Pymavlink 完成 MAVLink 通信实验。
Gazebo X500 → PX4 SITL → MAVLink/UDP → Pymavlink Python程序
20.1 MAVLink 协议概述
MAVLink 不是飞控算法,也不是地面站软件,而是一套通信规则。它规定消息如何封装、系统和组件如何编号、数据如何校验,以及控制命令和状态数据如何传输。
| 项目 | MAVLink v1 | MAVLink v2 |
|---|---|---|
| 帧头 | 0xFE |
0xFD |
| 消息ID | 8位 | 24位 |
| 单帧负载 | 0~255字节 | 0~255字节 |
| 扩展字段 | 不支持 | 支持 |
| 消息签名 | 不支持 | 支持13字节可选签名 |
20.2 软件安装与环境准备
20.2.1 创建虚拟环境并安装 Pymavlink
mkdir -p ~/mavlink_lab
cd ~/mavlink_lab
python3 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip
pip install pymavlink
终端前出现 (venv) 表示虚拟环境已激活。截图中 Pymavlink、lxml 和 fastcrc 均已成功安装。

图20-1 Pymavlink 安装完成
20.2.2 安装基础开发工具
sudo apt update
sudo apt install -y git wget curl gedit python3 python3-pip python3-venv build-essential cmake ninja-build
截图中各软件均显示已安装或已经是最新版本。

图20-2 基础开发工具安装与检查
20.2.3 下载或检查 PX4-Autopilot 源码
cd ~
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
# 若目录已存在
cd ~/PX4-Autopilot
git submodule update --init --recursive
ls
出现 boards、src、Tools、Makefile 和 CMakeLists.txt 等内容,说明源码目录存在。

图20-3 PX4-Autopilot 源码与目录检查
20.2.4 安装 PX4 开发环境与 Gazebo
cd ~/PX4-Autopilot
bash ./Tools/setup/ubuntu.sh
sudo reboot
安装脚本会配置 PX4 编译依赖和 Gazebo 仿真环境。截图中 Gazebo Harmonic、OpenCV 和相关开发库均已安装。

图20-4 PX4 开发环境与 Gazebo 安装完成
20.2.5 启动 PX4 SITL 与 Gazebo X500
cd ~/PX4-Autopilot
make px4_sitl gz_x500
成功时,Gazebo 中出现 X500 四旋翼,实体树中出现 x500_0,PX4 终端启动 MAVLink、日志和仿真模块。

图20-5 PX4 SITL 与 Gazebo X500 仿真启动
20.2.6 验证 Pymavlink 与 MAVLink v2 消息库
cd ~/mavlink_lab
source venv/bin/activate
python -c from pymavlink import mavutil; print('Pymavlink安装成功')
python -c from pymavlink.dialects.v20 import common; print('MAVLink v2消息库加载成功')
pip show pymavlink
实验中 Pymavlink 版本为 2.4.49,MAVLink v2 方言能够正常加载。

图20-6 Pymavlink 与 MAVLink v2 消息库验证
20.3 PX4 MAVLink 通信链路
在 PX4 的 pxh 终端中输入以下命令:
mavlink status
该命令用于查看 MAVLink 实例、模式、协议版本、UDP 端口、发送速率和丢包率。截图中可以看到 MAVLink version 2、UDP、Onboard 和 Gimbal 等链路信息。

图20-7 PX4 MAVLink 通信链路状态
20.4 HEARTBEAT 心跳消息实验
HEARTBEAT 的消息 ID 为 0,用于表明系统或组件在线,同时携带飞行器类型、自动驾驶仪类型、模式和系统状态。
cd ~/mavlink_lab
source venv/bin/activate
python heartbeat_monitor.py
实验结果显示系统ID为1、组件ID为1、飞行器类型为四旋翼、自动驾驶仪为 PX4,并能够持续接收心跳。

图20-8 Pymavlink 接收 PX4 HEARTBEAT 心跳消息
20.5 常用 MAVLink 消息接收
| 消息 | 主要内容 |
|---|---|
| ATTITUDE | 横滚角、俯仰角、偏航角 |
| LOCAL_POSITION_NED | NED位置和速度 |
| GLOBAL_POSITION_INT | 经纬度、海拔和相对高度 |
| GPS_RAW_INT | GPS定位类型和卫星数量 |
| SYS_STATUS | 系统状态和电池信息 |
| BATTERY_STATUS | 电池组电压、电流和剩余电量 |
cd ~/mavlink_lab
source venv/bin/activate
python message_monitor.py
实验成功接收到本地位置、速度、姿态、电池和系统状态。截图中电池电压为16.20 V,剩余电量为100%。

图20-9 常用 MAVLink 消息接收结果
20.6 MAVLink v2 帧结构与 CRC 校验
| 字段 | 字节数 | 说明 |
|---|---|---|
| STX | 1 | v2固定为0xFD |
| LEN | 1 | Payload长度 |
| INC/COMPAT | 各1 | 不兼容与兼容标志 |
| SEQ | 1 | 消息序列号 |
| SYS_ID/COMP_ID | 各1 | 系统和组件ID |
| MSG_ID | 3 | 24位消息ID,小端序 |
| PAYLOAD | 0~255 | 消息负载 |
| CHECKSUM | 2 | X.25 CRC与CRC_EXTRA |
| SIGNATURE | 13 | 可选签名 |
cd ~/mavlink_lab
source venv/bin/activate
python frame_parser.py
解析结果显示 STX 为0xFD、消息ID为0、帧内CRC与计算CRC均为0xFA7E,CRC一致为True。

图20-10 MAVLink v2 数据帧与 CRC 解析结果
20.7 常用消息 ID 与 MAV_CMD
MAVLink 使用消息ID区分 HEARTBEAT、姿态、位置、电池和任务消息;使用 MAV_CMD 区分航点、返航、起飞、降落和解锁等命令。
cd ~/mavlink_lab
source venv/bin/activate
python message_dictionary.py

图20-11 常用 MAVLink 消息、任务消息和 MAV_CMD 编号
20.8 心跳连接与断连检测
程序记录最近一次收到 HEARTBEAT 的时间。超过设定阈值仍未收到新心跳时,将链路判定为断开。本实验超时阈值设置为5秒。
cd ~/mavlink_lab
source venv/bin/activate
python connection_manager.py
程序首先显示 PX4 上线;停止 PX4 后,等待5秒显示心跳断连。

图20-12 MAVLink 心跳连接与断连检测
20.9 MAVLink v2 消息签名
| 字段 | 字节数 | 说明 |
|---|---|---|
| LINK_ID | 1 | 链路标识 |
| TIMESTAMP | 6 | 48位签名时间戳 |
| SIGNATURE | 6 | 签名摘要前6字节 |
cd ~/mavlink_lab
source venv/bin/activate
python signing_demo.py
实验生成了总长度34字节的签名帧,不兼容标志为0x01,签名标志为True,并成功解析13字节签名区域。

图20-13 MAVLink v2 签名数据帧测试
20.10 本章小结
- 完成基础工具、PX4、Gazebo 和 Pymavlink 环境检查;
- 成功启动 PX4 SITL 与 Gazebo X500;
- 查看了 PX4 内部 MAVLink v2 UDP 链路;
- 成功接收 HEARTBEAT、姿态、位置、GPS 和电池消息;
- 完成 MAVLink v2 原始帧解析与 CRC 校验;
- 输出常用消息 ID、任务消息 ID 和 MAV_CMD;
- 完成心跳连接与断连检测;
- 生成并解析带13字节签名区域的 MAVLink v2 数据帧。
说明:本章仅完成协议理解和仿真通信实验,没有向真实无人机发送解锁、起飞或任务控制指令。
21MAVROS2 与 MicroXRCE-DDS 桥接
21.1 MAVROS2 概述与安装
# 安装
sudo apt install -y ros-humble-mavros ros-humble-mavros-extras
sudo /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh
# 从源码安装
cd ~/ros2_ws/src
git clone https://github.com/mavlink/mavros.git -b ros2
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select mavros mavros_msgs mavros_extras
# 启动(SITL)
ros2 launch mavros px4.launch fcu_url:=udp://:14540@14557
# 启动(实际飞控串口)
ros2 launch mavros px4.launch fcu_url:=serial:///dev/ttyUSB0:57600
21.2 MAVROS2 话题与服务映射
核心话题映射表
| MAVLink 消息 | ROS2 话题 | 消息类型 | 方向 |
|---|---|---|---|
| HEARTBEAT | /mavros/state |
mavros_msgs/State |
FC-ROS2 |
| ATTITUDE | /mavros/imu/data |
sensor_msgs/Imu |
FC-ROS2 |
| GLOBAL_POSITION_INT | /mavros/global_position/global |
sensor_msgs/NavSatFix |
FC-ROS2 |
| GLOBAL_POSITION_INT | /mavros/global_position/local |
nav_msgs/Odometry |
FC-ROS2 |
| LOCAL_POSITION_NED | /mavros/local_position/pose |
geometry_msgs/PoseStamped |
FC-ROS2 |
| LOCAL_POSITION_NED | /mavros/local_position/velocity_local |
geometry_msgs/TwistStamped |
FC-ROS2 |
| BATTERY_STATUS | /mavros/battery |
sensor_msgs/BatteryState |
FC-ROS2 |
| RC_CHANNELS | /mavros/rc/in |
mavros_msgs/RCIn |
FC-ROS2 |
| VFR_HUD | /mavros/vfr_hud |
mavros_msgs/VFR_HUD |
FC-ROS2 |
| - | /mavros/setpoint_position/local |
geometry_msgs/PoseStamped |
ROS2-FC |
| - | /mavros/setpoint_velocity/cmd_vel |
geometry_msgs/TwistStamped |
ROS2-FC |
核心服务映射表
| 功能 | ROS2 服务 | 服务类型 |
|---|---|---|
| 解锁/上锁 | /mavros/cmd/arming |
mavros_msgs/CommandBool |
| 起飞 | /mavros/cmd/takeoff |
mavros_msgs/CommandTOL |
| 降落 | /mavros/cmd/land |
mavros_msgs/CommandTOL |
| 模式切换 | /mavros/set_mode |
mavros_msgs/SetMode |
| 任务上传 | /mavros/mission/push |
mavros_msgs/WaypointPush |
| 任务下载 | /mavros/mission/pull |
mavros_msgs/WaypointPull |
| 清除任务 | /mavros/mission/clear |
mavros_msgs/WaypointClear |
21.3 通过 MAVROS2 获取飞控状态
#!/usr/bin/env python3
"""drone_state_monitor.py - 无人机状态监控节点"""
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Imu, NavSatFix, BatteryState
from geometry_msgs.msg import PoseStamped, TwistStamped
from mavros_msgs.msg import State, VFR_HUD
import math
class DroneStateMonitor(Node):
def init(self):
super().init('drone_state_monitor')
self.state = State()
self.pose = PoseStamped()
self.velocity = TwistStamped()
self.gps = NavSatFix()
self.battery = BatteryState()
self.hud = VFR_HUD()
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'state', m), 10)
self.create_subscription(PoseStamped, '/mavros/local_position/pose',
lambda m: setattr(self, 'pose', m), 10)
self.create_subscription(TwistStamped, '/mavros/local_position/velocity_local',
lambda m: setattr(self, 'velocity', m), 10)
self.create_subscription(NavSatFix, '/mavros/global_position/global',
lambda m: setattr(self, 'gps', m), 10)
self.create_subscription(BatteryState, '/mavros/battery',
lambda m: setattr(self, 'battery', m), 10)
self.create_subscription(VFR_HUD, '/mavros/vfr_hud',
lambda m: setattr(self, 'hud', m), 10)
self.create_timer(1.0, self.print_summary)
self.get_logger().info('飞控状态监控节点已启动')
def quat_to_euler(self, x, y, z, w):
roll = math.degrees(math.atan2(2(wx+yz), 1-2(xx+yy)))
pitch = math.degrees(math.asin(max(-1, min(1, 2(wy-z*x)))))
yaw = math.degrees(math.atan2(2(wz+xy), 1-2(yy+zz)))
return roll, pitch, yaw
def print_summary(self):
q = self.pose.pose.orientation
r, p, y = self.quat_to_euler(q.x, q.y, q.z, q.w)
pos = self.pose.pose.position
vel = self.velocity.twist.linear
self.get_logger().info(
f'\n--- ZP-MH743 状态 ---'
f'\n 连接:{self.state.connected} 模式:{self.state.mode} 解锁:{self.state.armed}'
f'\n 位置: ({pos.x:.2f}, {pos.y:.2f}, {pos.z:.2f}) m'
f'\n 姿态: ({r:.1f}, {p:.1f}, {y:.1f}) deg'
f'\n 速度: ({vel.x:.2f}, {vel.y:.2f}, {vel.z:.2f}) m/s'
f'\n GPS: {self.gps.latitude:.7f}, {self.gps.longitude:.7f}, {self.gps.altitude:.1f}m'
f'\n 电池: {self.battery.voltage:.1f}V {self.battery.percentage*100:.0f}%')
def main(args=None):
rclpy.init(args=args)
node = DroneStateMonitor()
try:
rclpy.spin(node)
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
if name == 'main':
main()
21.4 通过 MAVROS2 发送控制指令
#!/usr/bin/env python3
"""drone_commander.py - 无人机指令控制器"""
import rclpy
from rclpy.node import Node
from mavros_msgs.srv import CommandBool, CommandTOL, SetMode, WaypointPush
from mavros_msgs.msg import State, Waypoint
from geometry_msgs.msg import PoseStamped
import time
class DroneCommander(Node):
def init(self):
super().init('drone_commander')
self.current_state = State()
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'current_state', m), 10)
self.setpoint_pub = self.create_publisher(
PoseStamped, '/mavros/setpoint_position/local', 10)
self.arm_client = self.create_client(CommandBool, '/mavros/cmd/arming')
self.takeoff_client = self.create_client(CommandTOL, '/mavros/cmd/takeoff')
self.land_client = self.create_client(CommandTOL, '/mavros/cmd/land')
self.mode_client = self.create_client(SetMode, '/mavros/set_mode')
self.mission_client = self.create_client(WaypointPush, '/mavros/mission/push')
self.get_logger().info('指令控制器已启动')
def wait_for_connection(self, timeout=10.0):
start = time.time()
while not self.current_state.connected:
if time.time() - start timeout:
return False
rclpy.spin_once(self, timeout_sec=0.5)
return True
def set_mode(self, mode):
req = SetMode.Request()
req.custom_mode = mode
future = self.mode_client.call_async(req)
rclpy.spin_until_future_complete(self, future)
ok = future.result() and future.result().mode_sent
self.get_logger().info(f'模式切换 {"成功" if ok else "失败"}: {mode}')
return ok
def arm(self):
req = CommandBool.Request()
req.value = True
future = self.arm_client.call_async(req)
rclpy.spin_until_future_complete(self, future)
ok = future.result() and future.result().success
self.get_logger().info(f'{"解锁" if ok else "解锁失败"}')
return ok
def takeoff(self, altitude):
req = CommandTOL.Request()
req.altitude = altitude
future = self.takeoff_client.call_async(req)
rclpy.spin_until_future_complete(self, future)
ok = future.result() and future.result().success
self.get_logger().info(f'起飞 {"成功" if ok else "失败"} - {altitude}m')
return ok
def land(self):
req = CommandTOL.Request()
future = self.land_client.call_async(req)
rclpy.spin_until_future_complete(self, future)
ok = future.result() and future.result().success
self.get_logger().info(f'降落指令 {"已发送" if ok else "失败"}')
return ok
def upload_mission(self, waypoints):
"""上传航点任务, waypoints: [{'lat':..,'lon':..,'alt':..,'command':16}, ...]"""
req = WaypointPush.Request()
for i, wp in enumerate(waypoints):
w = Waypoint()
w.frame = wp.get('frame', 3) # GLOBAL_REL_ALT
w.command = wp.get('command', 16)
w.is_current = (i == 0)
w.autocontinue = True
w.param1 = wp.get('param1', 0.0)
w.param4 = wp.get('param4', 0.0)
w.x_lat = wp['lat']
w.y_long = wp['lon']
w.z_alt = wp['alt']
req.waypoints.append(w)
future = self.mission_client.call_async(req)
rclpy.spin_until_future_complete(self, future)
result = future.result()
if result and result.success:
self.get_logger().info(f'任务上传成功: {result.wp_transferred} 个航点')
return True
self.get_logger().error('任务上传失败')
return False
21.5 PX4 原生 DDS 方案——MicroXRCE-DDS Agent 桥接
PX4 v1.14+ 提供基于 DDS 的原生通信方案,通过 MicroXRCE-DDS Agent 将飞控内部 uORB 消息直接映射到 ROS2 DDS 域,绕过 MAVLink 层。
机载计算机: ROS2 节点 --DDS-- MicroXRCE-DDS Agent
|
UDP/Serial
|
飞控 STM32H743: PX4 模块 --uORB-- XRCE Client
# 安装 MicroXRCE-DDS Agent
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent mkdir build cd build
cmake .. make sudo make install sudo ldconfig
# 启动 Agent(UDP 模式)
MicroXRCEAgent udp4 -p 8888
# 串口模式
MicroXRCEAgent serial --serial /dev/ttyUSB0 --baud 921600
21.6 MicroXRCE-DDS 配置与 uORB 话题直连
uORB 话题与 ROS2 映射
| uORB 话题 | ROS2 话题 | 消息类型 | 方向 |
|---|---|---|---|
| vehicle_status | /fmu/out/vehicle_status |
px4_msgs/msg/VehicleStatus |
FC-ROS2 |
| vehicle_attitude | /fmu/out/vehicle_attitude |
px4_msgs/msg/VehicleAttitude |
FC-ROS2 |
| vehicle_local_position | /fmu/out/vehicle_local_position |
px4_msgs/msg/VehicleLocalPosition |
FC-ROS2 |
| vehicle_global_position | /fmu/out/vehicle_global_position |
px4_msgs/msg/VehicleGlobalPosition |
FC-ROS2 |
| sensor_gps | /fmu/out/sensor_gps |
px4_msgs/msg/SensorGps |
FC-ROS2 |
| battery_status | /fmu/out/battery_status |
px4_msgs/msg/BatteryStatus |
FC-ROS2 |
| vehicle_command | /fmu/in/vehicle_command |
px4_msgs/msg/VehicleCommand |
ROS2-FC |
| offboard_control_mode | /fmu/in/offboard_control_mode |
px4_msgs/msg/OffboardControlMode |
ROS2-FC |
| trajectory_setpoint | /fmu/in/trajectory_setpoint |
px4_msgs/msg/TrajectorySetpoint |
ROS2-FC |
# 安装 PX4 消息包
cd ~/ros2_ws/src
git clone https://github.com/PX4/px4_msgs.git
git clone https://github.com/PX4/px4_ros_com.git
cd ~/ros2_ws colcon build --packages-select px4_msgs px4_ros_com
#!/usr/bin/env python3
"""xrce_drone_monitor.py - 通过 XRCE-DDS 获取飞控数据"""
import rclpy
from rclpy.node import Node
from px4_msgs.msg import VehicleAttitude, VehicleLocalPosition, VehicleStatus
class XRCEDroneMonitor(Node):
def init(self):
super().init('xrce_drone_monitor')
self.attitude = None
self.position = None
self.create_subscription(VehicleAttitude, '/fmu/out/vehicle_attitude',
lambda m: setattr(self, 'attitude', m), 10)
self.create_subscription(VehicleLocalPosition, '/fmu/out/vehicle_local_position',
lambda m: setattr(self, 'position', m), 10)
self.create_timer(1.0, self.print_status)
self.get_logger().info('XRCE-DDS 监控节点已启动')
def print_status(self):
if self.attitude and self.position:
q = self.attitude.q
self.get_logger().info(
f'\n--- XRCE-DDS 状态 ---'
f'\n 四元数: [{q[0]:.4f}, {q[1]:.4f}, {q[2]:.4f}, {q[3]:.4f}]'
f'\n 位置: ({self.position.x:.2f}, {self.position.y:.2f}, {self.position.z:.2f})'
f'\n 高度有效: {self.position.z_valid}')
def main(args=None):
rclpy.init(args=args)
rclpy.spin(XRCEDroneMonitor())
rclpy.shutdown()
if name == 'main':
main()
21.7 MAVROS2 vs MicroXRCE-DDS 方案对比
| 对比维度 | MAVROS2 | MicroXRCE-DDS |
|---|---|---|
| 协议层 | MAVLink(应用层) | DDS(中间件层) |
| 延迟 | 中等 | 低 |
| CPU 开销 | 较高 | 较低 |
| 消息丰富度 | 标准 MAVLink 集 | 完整 uORB 集 |
| 固件兼容性 | PX4 / ArduPilot | 仅 PX4 v1.14+ |
| 社区成熟度 | 成熟 | 增长中 |
| 远程通信 | 原生支持 | 受限 |
| 配置复杂度 | 低 | 中等 |
选型建议:生产稳定环境选 MAVROS2;追求最低延迟且使用 PX4 v1.14+ 选 XRCE-DDS;需要两者优势可混合方案(MAVROS2 远程 + XRCE 本地高频数据)。
22ROS2 无人机应用开发实战
22.1 Offboard 模式控制
PX4 进入 Offboard 模式前必须满足:至少以 2 Hz(推荐 20Hz+)持续发送设定点,切换前至少发送 2 秒,中断超过 0.5 秒将自动退出。
22.1.1 位置控制
#!/usr/bin/env python3
"""offboard_position.py - Offboard 位置控制"""
import rclpy, math, time
from rclpy.node import Node
from geometry_msgs.msg import PoseStamped
from mavros_msgs.srv import CommandBool, SetMode
from mavros_msgs.msg import State
class OffboardPositionControl(Node):
def init(self):
super().init('offboard_position_control')
self.current_state = State()
self.current_pose = PoseStamped()
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'current_state', m), 10)
self.create_subscription(PoseStamped, '/mavros/local_position/pose',
lambda m: setattr(self, 'current_pose', m), 10)
self.setpoint_pub = self.create_publisher(
PoseStamped, '/mavros/setpoint_position/local', 10)
self.arm_client = self.create_client(CommandBool, '/mavros/cmd/arming')
self.mode_client = self.create_client(SetMode, '/mavros/set_mode')
self.target = [0.0, 0.0, 0.0, 0.0] # x,y,z,yaw_rad
self.create_timer(0.05, self.send_setpoint)
self.get_logger().info('Offboard 位置控制器已启动')
def send_setpoint(self):
msg = PoseStamped()
msg.header.stamp = self.get_clock().now().to_msg()
msg.header.frame_id = 'map'
msg.pose.position.x = self.target[0]
msg.pose.position.y = self.target[1]
msg.pose.position.z = self.target[2]
msg.pose.orientation.z = math.sin(self.target[3] / 2.0)
msg.pose.orientation.w = math.cos(self.target[3] / 2.0)
self.setpoint_pub.publish(msg)
def set_target(self, x, y, z, yaw_deg=0.0):
self.target = [x, y, z, math.radians(yaw_deg)]
def is_at_target(self, threshold=0.3):
pos = self.current_pose.pose.position
d = math.sqrt((pos.x-self.target[0])2 + (pos.y-self.target[1])2 +
(pos.z-self.target[2])**2)
return d threshold
def arm_and_offboard(self):
for _ in range(40):
rclpy.spin_once(self, timeout_sec=0.05)
req = SetMode.Request(); req.custom_mode = 'OFFBOARD'
f = self.mode_client.call_async(req)
rclpy.spin_until_future_complete(self, f)
req = CommandBool.Request(); req.value = True
f = self.arm_client.call_async(req)
rclpy.spin_until_future_complete(self, f)
return f.result() and f.result().success
def main(args=None):
rclpy.init(args=args)
ctrl = OffboardPositionControl()
while not ctrl.current_state.connected:
rclpy.spin_once(ctrl, timeout_sec=0.5)
ctrl.arm_client.wait_for_service()
ctrl.mode_client.wait_for_service()
if not ctrl.arm_and_offboard():
return
waypoints = [(0,0,5,0), (5,0,5,0), (5,5,5,90), (0,5,5,180), (0,0,5,270)]
try:
for i, (x,y,z,yaw) in enumerate(waypoints):
ctrl.get_logger().info(f'航点 {i+1}: ({x},{y},{z}) yaw={yaw}')
ctrl.set_target(x, y, z, yaw)
for _ in range(300):
rclpy.spin_once(ctrl, timeout_sec=0.1)
if ctrl.is_at_target():
break
except KeyboardInterrupt:
pass
finally:
ctrl.destroy_node()
rclpy.shutdown()
if name == 'main':
main()
22.1.2 速度控制
#!/usr/bin/env python3
"""offboard_velocity.py - Offboard 速度控制"""
import rclpy, time
from rclpy.node import Node
from geometry_msgs.msg import TwistStamped
from mavros_msgs.srv import CommandBool, SetMode
from mavros_msgs.msg import State
class OffboardVelocityControl(Node):
def init(self):
super().init('offboard_velocity_control')
self.state = State()
self.vx = self.vy = self.vz = self.vyaw = 0.0
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'state', m), 10)
self.vel_pub = self.create_publisher(
TwistStamped, '/mavros/setpoint_velocity/cmd_vel', 10)
self.arm_client = self.create_client(CommandBool, '/mavros/cmd/arming')
self.mode_client = self.create_client(SetMode, '/mavros/set_mode')
self.create_timer(0.05, self.publish_vel)
def publish_vel(self):
msg = TwistStamped()
msg.header.stamp = self.get_clock().now().to_msg()
msg.twist.linear.x, msg.twist.linear.y, msg.twist.linear.z = self.vx, self.vy, self.vz
msg.twist.angular.z = self.vyaw
self.vel_pub.publish(msg)
def set_velocity(self, vx, vy, vz, vyaw=0.0):
self.vx, self.vy, self.vz, self.vyaw = vx, vy, vz, vyaw
def main(args=None):
rclpy.init(args=args)
ctrl = OffboardVelocityControl()
while not ctrl.state.connected:
rclpy.spin_once(ctrl, timeout_sec=0.5)
ctrl.set_velocity(0, 0, 0)
for _ in range(40): rclpy.spin_once(ctrl, timeout_sec=0.05)
req = SetMode.Request(); req.custom_mode = 'OFFBOARD'
f = ctrl.mode_client.call_async(req)
rclpy.spin_until_future_complete(ctrl, f)
req = CommandBool.Request(); req.value = True
f = ctrl.arm_client.call_async(req)
rclpy.spin_until_future_complete(ctrl, f)
try:
ctrl.set_velocity(0, 0, 1.0); time.sleep(5) # 上升
ctrl.set_velocity(1.0, 0, 0); time.sleep(5) # 前进
ctrl.set_velocity(0, 0, 0); time.sleep(3) # 悬停
ctrl.set_velocity(0, 0, -0.5); time.sleep(10) # 下降
except KeyboardInterrupt:
pass
finally:
ctrl.destroy_node(); rclpy.shutdown()
if name == 'main':
main()
22.2 自主起飞-巡航-降落完整流程
#!/usr/bin/env python3
"""auto_flight_mission.py - 完整自主飞行流程"""
import rclpy, math, time
from rclpy.node import Node
from geometry_msgs.msg import PoseStamped
from mavros_msgs.srv import CommandBool, SetMode, CommandTOL
from mavros_msgs.msg import State
class AutoFlightMission(Node):
def init(self):
super().init('auto_flight_mission')
self.state = State()
self.pose = PoseStamped()
self.target = [0.0, 0.0, 0.0, 0.0]
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'state', m), 10)
self.create_subscription(PoseStamped, '/mavros/local_position/pose',
lambda m: setattr(self, 'pose', m), 10)
self.pub = self.create_publisher(PoseStamped, '/mavros/setpoint_position/local', 10)
self.arm_client = self.create_client(CommandBool, '/mavros/cmd/arming')
self.mode_client = self.create_client(SetMode, '/mavros/set_mode')
self.land_client = self.create_client(CommandTOL, '/mavros/cmd/land')
self.create_timer(0.05, self._send_sp)
def _send_sp(self):
msg = PoseStamped()
msg.header.stamp = self.get_clock().now().to_msg()
msg.header.frame_id = 'map'
msg.pose.position.x, msg.pose.position.y, msg.pose.position.z = \
self.target[0], self.target[1], self.target[2]
msg.pose.orientation.z = math.sin(self.target[3] / 2.0)
msg.pose.orientation.w = math.cos(self.target[3] / 2.0)
self.pub.publish(msg)
def dist(self, x, y, z):
p = self.pose.pose.position
return math.sqrt((p.x-x)2 + (p.y-y)2 + (p.z-z)**2)
def goto(self, x, y, z, yaw_deg=0, timeout=30):
self.target = [x, y, z, math.radians(yaw_deg)]
start = time.time()
while rclpy.ok():
if self.dist(x, y, z) 0.5:
return True
if time.time() - start timeout:
return False
rclpy.spin_once(self, timeout_sec=0.1)
def run(self, alt, waypoints):
while not self.state.connected: rclpy.spin_once(self, timeout_sec=0.5)
self.arm_client.wait_for_service()
self.mode_client.wait_for_service()
# 预发送设定点 3 秒
self.target = [0, 0, alt, 0]
for _ in range(60): rclpy.spin_once(self, timeout_sec=0.05)
# Offboard + 解锁
req = SetMode.Request(); req.custom_mode = 'OFFBOARD'
rclpy.spin_until_future_complete(self, self.mode_client.call_async(req))
req = CommandBool.Request(); req.value = True
rclpy.spin_until_future_complete(self, self.arm_client.call_async(req))
# 起飞
self.get_logger().info(f'起飞到 {alt}m...')
self.goto(0, 0, alt, timeout=20)
time.sleep(2)
# 巡航
for i, (x,y,z,yaw) in enumerate(waypoints):
self.get_logger().info(f'航点 {i+1}/{len(waypoints)}')
self.goto(x, y, z, yaw, timeout=60)
time.sleep(1)
# 返回 + 降落
self.goto(0, 0, alt, timeout=60)
req = CommandTOL.Request()
rclpy.spin_until_future_complete(self, self.land_client.call_async(req))
self.get_logger().info('任务完成!')
def main(args=None):
rclpy.init(args=args)
m = AutoFlightMission()
try:
m.run(alt=5.0, waypoints=[
(10,0,8,0), (10,10,8,90), (0,10,10,180), (0,0,8,270)])
except KeyboardInterrupt:
pass
finally:
m.destroy_node(); rclpy.shutdown()
if name == 'main':
main()
22.3 航点任务编程(Mission Protocol)
#!/usr/bin/env python3
"""mission_planner.py - 航点任务规划与上传"""
import rclpy, time
from rclpy.node import Node
from mavros_msgs.srv import WaypointPush, WaypointClear, SetMode
from mavros_msgs.msg import Waypoint, State
class MissionPlanner(Node):
def init(self):
super().init('mission_planner')
self.state = State()
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'state', m), 10)
self.push_client = self.create_client(WaypointPush, '/mavros/mission/push')
self.clear_client = self.create_client(WaypointClear, '/mavros/mission/clear')
self.mode_client = self.create_client(SetMode, '/mavros/set_mode')
@staticmethod
def make_wp(lat, lon, alt, cmd=16, frame=3, current=False):
w = Waypoint()
w.frame = frame; w.command = cmd; w.is_current = current
w.autocontinue = True; w.x_lat = lat; w.y_long = lon; w.z_alt = alt
return w
def upload(self, waypoints):
req = WaypointPush.Request(); req.waypoints = waypoints
f = self.push_client.call_async(req)
rclpy.spin_until_future_complete(self, f)
r = f.result()
ok = r and r.success
self.get_logger().info(f'上传 {"成功 "+str(r.wp_transferred)+" 航点" if ok else "失败"}')
return ok
def start(self):
req = SetMode.Request(); req.custom_mode = 'AUTO.MISSION'
f = self.mode_client.call_async(req)
rclpy.spin_until_future_complete(self, f)
return f.result() and f.result().mode_sent
def main(args=None):
rclpy.init(args=args)
p = MissionPlanner()
while not p.state.connected: rclpy.spin_once(p, timeout_sec=0.5)
p.push_client.wait_for_service()
# 矩形航线(北京测试场坐标示例)
lat, lon, alt = 39.9042, 116.4074, 30.0
wps = [
p.make_wp(lat, lon, alt, cmd=22, current=True), # 起飞
p.make_wp(lat, lon+0.0009, alt), # 东 100m
p.make_wp(lat+0.0009, lon+0.0009, alt), # 东北
p.make_wp(lat+0.0009, lon, alt), # 北
p.make_wp(lat, lon, alt), # 返回
p.make_wp(lat, lon, 0, cmd=21), # 降落
]
rclpy.spin_until_future_complete(p, p.clear_client.call_async(
import('mavros_msgs.srv', fromlist=['WaypointClear']).WaypointClear.Request()))
time.sleep(1)
if p.upload(wps):
time.sleep(1)
p.start()
p.destroy_node(); rclpy.shutdown()
if name == 'main':
main()
22.4 视觉辅助功能
AprilTag 精准降落
#!/usr/bin/env python3
"""apriltag_landing.py - AprilTag 精准降落"""
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from geometry_msgs.msg import TwistStamped
from cv_bridge import CvBridge
import numpy as np
class AprilTagLanding(Node):
def init(self):
super().init('apriltag_landing')
self.bridge = CvBridge()
self.tag_detected = False
self.tag_info = None
self.tag_size = 0.15 # 米
self.kp_xy = 0.5
self.land_speed = 0.3
self.create_subscription(Image, '/camera/image_raw', self.image_cb, 10)
self.cmd_pub = self.create_publisher(
TwistStamped, '/mavros/setpoint_velocity/cmd_vel', 10)
self.create_timer(0.05, self.control_cb)
def image_cb(self, msg):
try:
import apriltag, cv2
img = self.bridge.imgmsg_to_cv2(msg, 'mono8')
detector = apriltag.Detector(apriltag.DetectorOptions(families='tag36h11'))
results = detector.detect(img)
if results:
tag = max(results, key=lambda t: t.decision_margin)
self.tag_detected = True
h, w = img.shape[:2]
cx, cy = tag.center
px_size = max(np.linalg.norm(tag.corners[0]-tag.corners[1]),
np.linalg.norm(tag.corners[1]-tag.corners[2]))
dist = (self.tag_size * 600.0) / px_size # 近似距离
self.tag_info = {
'dx': (cx - w/2) / (w/2) * dist * 0.5,
'dy': (cy - h/2) / (h/2) * dist * 0.5,
'dist': dist
}
else:
self.tag_detected = False
self.tag_info = None
except ImportError:
pass
def control_cb(self):
cmd = TwistStamped()
cmd.header.stamp = self.get_clock().now().to_msg()
if self.tag_detected and self.tag_info:
cmd.twist.linear.x = -self.kp_xy * self.tag_info['dx']
cmd.twist.linear.y = -self.kp_xy * self.tag_info['dy']
cmd.twist.linear.z = -self.land_speed * (0.3 if self.tag_info['dist'] 0.1 else 0.5)
self.cmd_pub.publish(cmd)
def main(args=None):
rclpy.init(args=args)
rclpy.spin(AprilTagLanding())
rclpy.shutdown()
if name == 'main':
main()
22.5 避障与路径规划集成
#!/usr/bin/env python3
"""obstacle_avoidance.py - 基于点云的 3D 避障"""
import rclpy, struct
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2
from geometry_msgs.msg import TwistStamped
import numpy as np
class ObstacleAvoidance(Node):
def init(self):
super().init('obstacle_avoidance')
self.min_dist = 2.0
self.slow_dist = 5.0
self.max_speed = 2.0
self.create_subscription(PointCloud2, '/camera/depth/points', self.cloud_cb, 10)
self.cmd_pub = self.create_publisher(TwistStamped, '/avoidance/cmd_vel', 10)
def cloud_cb(self, msg):
pts = self._parse(msg)
if pts is None or len(pts) == 0: return
fwd = pts[(pts[:,0]0) (pts[:,0]self.slow_dist)
(np.abs(pts[:,1])2.0) (np.abs(pts[:,2])1.5)]
cmd = TwistStamped()
cmd.header.stamp = self.get_clock().now().to_msg()
if len(fwd) 0:
md = np.min(fwd[:,0])
if md self.min_dist:
left = np.sum(fwd[:,1]0); right = np.sum(fwd[:,1]0)
cmd.twist.linear.y = 0.5 if left right else -0.5
cmd.twist.linear.z = 0.15
self.get_logger().warn(f'障碍物 {md:.1f}m, 避障')
else:
cmd.twist.linear.x = self.max_speed * (md-self.min_dist)/(self.slow_dist-self.min_dist)
else:
cmd.twist.linear.x = self.max_speed
self.cmd_pub.publish(cmd)
def _parse(self, msg):
try:
off = {f.name: f.offset for f in msg.fields if f.name in 'xyz'}
if len(off) 3: return None
n = msg.width * msg.height
pts = np.zeros((n, 3))
for i in range(n):
s = i * msg.point_step
for j, k in enumerate('xyz'):
pts[i,j] = struct.unpack_from('f', msg.data, s+off[k])[0]
return pts
except: return None
def main(args=None):
rclpy.init(args=args); rclpy.spin(ObstacleAvoidance()); rclpy.shutdown()
if name == 'main':
main()
Nav2 适配配置 nav2_drone_params.yaml:
controller_server:
ros__parameters:
controller_frequency: 20.0
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
max_vel_x: 3.0 # 最大前进速度 m/s
max_vel_y: 2.0 # 最大横向速度
acc_lim_x: 1.5
acc_lim_y: 1.0
planner_server:
ros__parameters:
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 1.0
22.6 多机协同编队通信架构
#!/usr/bin/env python3
"""formation_commander.py - 多机编队指挥节点"""
import rclpy, math, json, time
from rclpy.node import Node
from std_msgs.msg import String, Float64MultiArray
from geometry_msgs.msg import PoseStamped
class FormationCommander(Node):
def init(self, num_drones=3):
super().init('formation_commander')
self.num = num_drones
self.states = {}
self.cmd_pub = self.create_publisher(String, '/formation/command', 10)
self.tgt_pub = self.create_publisher(Float64MultiArray, '/formation/targets', 10)
for i in range(1, num_drones+1):
self.create_subscription(PoseStamped, f'/drone{i}/mavros/local_position/pose',
self._mk_cb(i), 10)
def _mk_cb(self, did):
return lambda m: self.states.update({did: (m.pose.position.x, m.pose.position.y, m.pose.position.z)})
def _line(self, c, sp=3.0):
return [(c[0]+(i-self.num/2)*sp, c[1], c[2]) for i in range(self.num)]
def _triangle(self, c, sp=3.0):
pts = [(c[0], c[1]+sp, c[2]), (c[0]-sp, c[1]-sp, c[2]), (c[0]+sp, c[1]-sp, c[2])]
return pts[:self.num]
def _circle(self, c, r=5.0):
return [(c[0]+rmath.cos(2math.pi*i/self.num),
c[1]+rmath.sin(2math.pi*i/self.num), c[2]) for i in range(self.num)]
def set_formation(self, name, center, **kw):
fn = {'line': self._line, 'triangle': self._triangle, 'circle': self._circle}.get(name)
if not fn: return
targets = fn(center, **kw)
self.cmd_pub.publish(String(data=json.dumps({'formation': name, 'targets': targets})))
msg = Float64MultiArray(); [msg.data.extend(t) for t in targets]
self.tgt_pub.publish(msg)
self.get_logger().info(f'编队: {name} - {targets}')
def main(args=None):
rclpy.init(args=args)
cmd = FormationCommander(3)
try:
time.sleep(2)
cmd.set_formation('triangle', (10,0,5))
time.sleep(10)
cmd.set_formation('line', (20,0,5))
time.sleep(10)
cmd.set_formation('circle', (30,0,8), r=4.0)
rclpy.spin(cmd)
except KeyboardInterrupt:
pass
finally:
cmd.destroy_node(); rclpy.shutdown()
if name == 'main':
main()
22.7 飞行数据记录与 ROS2 Bag 回放分析
# 录制飞行数据
ros2 bag record -o flight_data \
/mavros/state /mavros/local_position/pose \
/mavros/local_position/velocity_local /mavros/global_position/global \
/mavros/imu/data /mavros/battery /mavros/vfr_hud
# 压缩录制
ros2 bag record -o compressed_data --compression-format zstd -a
# 回放
ros2 bag play flight_data --rate 0.5
ros2 bag info flight_data
#!/usr/bin/env python3
"""flight_data_analyzer.py - 飞行数据分析"""
from rclpy.serialization import deserialize_message
from geometry_msgs.msg import PoseStamped, TwistStamped
from sensor_msgs.msg import NavSatFix, BatteryState
from rosbag2_py import SequentialReader, StorageOptions, ConverterOptions
import numpy as np, math, csv
class FlightAnalyzer:
def init(self, bag_path):
self.bag_path = bag_path
self.ts, self.px, self.py, self.pz = [], [], [], []
self.vx, self.vy, self.vz = [], [], []
self.roll, self.pitch, self.yaw = [], [], []
self.volt, self.lat, self.lon, self.alt = [], [], [], []
def read(self):
reader = SequentialReader()
reader.open(StorageOptions(uri=self.bag_path, storage_id='sqlite3'),
ConverterOptions('cdr', 'cdr'))
while reader.has_next():
topic, data, t = reader.read_next()
ts = t / 1e9
if topic == '/mavros/local_position/pose':
m = deserialize_message(data, PoseStamped)
self.ts.append(ts)
self.px.append(m.pose.position.x)
self.py.append(m.pose.position.y)
self.pz.append(m.pose.position.z)
q = m.pose.orientation
self.roll.append(math.degrees(math.atan2(2(q.wq.x+q.yq.z), 1-2(q.x2+q.y2))))
self.pitch.append(math.degrees(math.asin(max(-1,min(1,2(q.wq.y-q.z*q.x))))))
self.yaw.append(math.degrees(math.atan2(2(q.wq.z+q.xq.y), 1-2(q.y2+q.z2))))
elif topic == '/mavros/battery':
m = deserialize_message(data, BatteryState)
self.volt.append(m.voltage)
def stats(self):
print("\n=== 飞行统计 ===")
if self.pz: print(f" 最大高度: {max(self.pz):.2f} m")
if self.vx:
spd = np.sqrt(np.array(self.vx)2+np.array(self.vy)2+np.array(self.vz)**2)
print(f" 最大速度: {np.max(spd):.2f} m/s, 平均: {np.mean(spd):.2f} m/s")
if self.ts: print(f" 飞行时长: {self.ts[-1]-self.ts[0]:.1f} s")
if self.volt: print(f" 电压范围: {min(self.volt):.1f}V ~ {max(self.volt):.1f}V")
def export_csv(self, path='report.csv'):
with open(path, 'w', newline='') as f:
w = csv.writer(f)
w.writerow(['ts','x','y','z','roll','pitch','yaw'])
for i in range(len(self.ts)):
w.writerow([self.ts[i],self.px[i],self.py[i],self.pz[i],
self.roll[i],self.pitch[i],self.yaw[i]])
print(f"CSV: {path}")
if name == 'main':
import sys
a = FlightAnalyzer(sys.argv[1] if len(sys.argv)1 else 'flight_data')
a.read(); a.stats(); a.export_csv()
23SITL/HITL 仿真与调试
23.1 SITL 仿真概述
SITL(Software In The Loop)是无需硬件的纯软件仿真,飞控固件作为进程运行在计算机上,与物理仿真引擎交互。
| 仿真器 | 特点 | 适用场景 | PX4 支持 |
|---|---|---|---|
| Gazebo Classic | 开源、物理精确、社区活跃 | 通用仿真、多机编队 | 原生 |
| Gazebo (Ignition) | 新一代仿真器 | 高级场景、传感器仿真 | 原生 |
| AirSim | 微软开发、视觉逼真 | 计算机视觉、深度学习 | 支持 |
| jMAVSim | 轻量级、启动快 | 快速测试、教学 | 原生 |
| FlightGear | 专业飞行模拟 | 固定翼 | 支持 |
23.2 Gazebo + PX4 SITL 环境搭建
# 安装 Gazebo(Ubuntu 22.04 + ROS2 Humble)
sudo apt install -y gazebo ros-humble-gazebo-ros-pkgs ros-humble-gazebo-ros2-control
# 克隆 PX4 源码
cd ~
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
pip3 install -r Tools/setup/requirements.txt
# 启动 SITL
make px4_sitl gazebo-classic # 默认四旋翼
make px4_sitl gazebo-classic_iris # Iris 机型
make px4_sitl gazebo-classic_typhoon_h480 # 六旋翼
make px4_sitl jmavsim # jMAVSim 轻量仿真
make px4_sitl gazebo-classic_iris__baylands # 指定场景
# 多机仿真(3 架)
Tools/simulation/gazebo-classic/sitl_multiple_run.sh 3
# 无人机1: UDP 14540/14580, 无人机2: 14541/14581, 无人机3: 14542/14582
23.3 SITL 与 QGC / MAVROS2 联合仿真
#!/bin/bash
# sitl_full_env.sh - 一键启动完整仿真环境
echo "=== 启动 SITL 联合仿真 ==="
# 1. PX4 SITL + Gazebo
cd ~/PX4-Autopilot
HEADLESS=1 make px4_sitl gazebo-classic_iris
sleep 5
# 2. MAVROS2
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 launch mavros px4.launch fcu_url:=udp://:14540@14557 gcs_url:=udp://@14550
sleep 3
echo "=== 就绪 ==="
wait
#!/usr/bin/env python3
"""sitl_test_flight.py - SITL 测试飞行"""
import rclpy, math, time
from rclpy.node import Node
from geometry_msgs.msg import PoseStamped
from mavros_msgs.srv import CommandBool, SetMode, CommandTOL
from mavros_msgs.msg import State
class SITLTest(Node):
def init(self):
super().init('sitl_test')
self.state = State()
self.pose = PoseStamped()
self.target = [0.0, 0.0, 5.0, 0.0]
self.create_subscription(State, '/mavros/state',
lambda m: setattr(self, 'state', m), 10)
self.create_subscription(PoseStamped, '/mavros/local_position/pose',
lambda m: setattr(self, 'pose', m), 10)
self.pub = self.create_publisher(PoseStamped, '/mavros/setpoint_position/local', 10)
self.arm_c = self.create_client(CommandBool, '/mavros/cmd/arming')
self.mode_c = self.create_client(SetMode, '/mavros/set_mode')
self.land_c = self.create_client(CommandTOL, '/mavros/cmd/land')
self.create_timer(0.05, self._sp)
def _sp(self):
msg = PoseStamped(); msg.header.stamp = self.get_clock().now().to_msg()
msg.pose.position.x, msg.pose.position.y, msg.pose.position.z = self.target[:3]
msg.pose.orientation.z = math.sin(self.target[3]/2)
msg.pose.orientation.w = math.cos(self.target[3]/2)
self.pub.publish(msg)
def goto(self, x, y, z, yaw=0, timeout=30):
self.target = [x, y, z, math.radians(yaw)]
t0 = time.time()
while rclpy.ok():
p = self.pose.pose.position
if math.sqrt((p.x-x)2+(p.y-y)2+(p.z-z)**2) 0.5: return True
if time.time()-t0 timeout: return False
rclpy.spin_once(self, timeout_sec=0.1)
def run(self):
while not self.state.connected: rclpy.spin_once(self, timeout_sec=0.5)
self.arm_c.wait_for_service(); self.mode_c.wait_for_service()
for _ in range(60): rclpy.spin_once(self, timeout_sec=0.05)
# Offboard + ARM
f = self.mode_c.call_async(SetMode.Request(custom_mode='OFFBOARD'))
rclpy.spin_until_future_complete(self, f)
f = self.arm_c.call_async(CommandBool.Request(value=True))
rclpy.spin_until_future_complete(self, f)
# 航点
for wp in [(0,0,5,0),(5,0,5,0),(5,5,5,90),(0,0,5,0)]:
self.goto(*wp); time.sleep(1)
# 降落
rclpy.spin_until_future_complete(self, self.land_c.call_async(CommandTOL.Request()))
self.get_logger().info('SITL 测试完成!')
def main(args=None):
rclpy.init(args=args); n = SITLTest()
try: n.run()
except KeyboardInterrupt: pass
finally: n.destroy_node(); rclpy.shutdown()
if name == 'main':
main()
23.4 HITL(硬件在环)仿真配置
HITL(Hardware In The Loop)仿真将真实飞控硬件接入仿真环境,飞控固件运行在 STM32H743 实际芯片上,传感器数据由计算机生成并通过串口注入。
23.4.1 HITL 硬件连接
┌─────────────┐ USB 串口 ┌──────────────────┐
│ 开发电脑 │───────────────| ZP-MH743 飞控 │
│ Gazebo SITL │ UART 921600 │ STM32H743 实机 │
│ 生成传感器数据│ │ 运行真实 PX4 固件 │
└─────────────┘ └──────────────────┘
23.4.2 PX4 HITL 配置
# 1. 在 QGC 或 MAVLink Shell 中启用 HITL 模式
# 设置参数 SYS_HITL = 1
param set SYS_HITL 1
param save
# 重启飞控
# 2. 编译 PX4 HITL 固件
cd ~/PX4-Autopilot
make px4_fmu-v5_default # 编译适用于 ZP-MH743 的固件
# 3. 烧录固件
# 使用 QGC 或命令行
make px4_fmu-v5_default upload
# 4. 启动 Gazebo HITL 仿真
make px4_sitl gazebo-classic_iris_hitl
23.4.3 HITL 参数配置
| 参数 | 值 | 说明 |
|---|---|---|
| SYS_HITL | 1 | 启用 HITL 模式 |
| MAV_0_CONFIG | TELEM1 |
HITL 通信端口 |
| MAV_0_MODE | Normal | 正常模式 |
| MAV_0_RATE | 0 | 自动波特率 |
| SER_TEL1_BAUD | 921600 | TELEM1 波特率 |
| CBRK_BUZZER | 782097 | 禁用蜂鸣器(HITL 下) |
23.4.4 HITL 与 MAVROS2 联合测试
# 启动 HITL 仿真(飞控已通过 USB 连接)
# 终端1:Gazebo HITL
cd ~/PX4-Autopilot
make px4_sitl gazebo-classic_iris_hitl
# 终端2:MAVROS2 连接真实飞控
ros2 launch mavros px4.launch fcu_url:=serial:///dev/ttyACM0:921600
# 终端3:运行测试节点
ros2 run drone_tools sitl_test_flight
23.5 仿真到实机的迁移与参数一致性校验
23.5.1 迁移检查清单
从 SITL 仿真迁移到实机飞行时,需要逐项校验以下参数和配置:
| 检查项 | SITL 默认值 | 实机建议值 | 校验方法 |
|---|---|---|---|
| MPC_XY_VEL_MAX | 12.0 m/s | 5.0-8.0 m/s | 参数对比 |
| MPC_Z_VEL_MAX_UP | 3.0 m/s | 2.0-3.0 m/s | 参数对比 |
| MPC_Z_VEL_MAX_DN | 1.0 m/s | 1.0-2.0 m/s | 参数对比 |
| MPC_ACC_HOR_MAX | 5.0 m/s^2 | 3.0-5.0 m/s^2 | 参数对比 |
| COM_DISARM_LAND | 2.0 s | 2.0-5.0 s | 实机测试 |
| OFFB_ACC_LT | 秒 | 根据实际调整 | 实机测试 |
| GPS 配置 | 默认 | 根据 GPS 模块型号配置 | GPS 锁定测试 |
| IMU 校准 | 自动 | 需要手动校准 | 地面站校准 |
| 遥控器通道映射 | 默认 | 根据遥控器配置 | 通道检查 |
| 故障安全参数 | 宽松 | 严格 | 实机验证 |
23.5.2 参数导出与对比脚本
#!/usr/bin/env python3
"""
param_compare.py - SITL 与实机参数对比工具
"""
from pymavlink import mavutil
import json
def dump_params(connection_string, output_file):
"""导出飞控参数"""
conn = mavutil.mavlink_connection(connection_string)
conn.wait_heartbeat()
params = {}
print("正在读取参数...")
# 请求所有参数
conn.mav.param_request_list_send(
conn.target_system, conn.target_component)
while True:
msg = conn.recv_match(type='PARAM_VALUE', blocking=True, timeout=10)
if msg is None:
break
params[msg.param_id] = msg.param_value
if len(params) % 100 == 0:
print(f" 已读取 {len(params)} 个参数...")
with open(output_file, 'w') as f:
json.dump(params, f, indent=2)
print(f"参数导出完成: {len(params)} 个 - {output_file}")
return params
def compare_params(sitl_file, real_file):
"""对比 SITL 和实机参数差异"""
with open(sitl_file) as f:
sitl = json.load(f)
with open(real_file) as f:
real = json.load(f)
# 关键参数列表
critical_params = [
'MPC_XY_VEL_MAX', 'MPC_Z_VEL_MAX_UP', 'MPC_Z_VEL_MAX_DN',
'MPC_ACC_HOR_MAX', 'MPC_ACC_UP_MAX', 'MPC_ACC_DOWN_MAX',
'MPC_XY_P', 'MPC_XY_VEL_P_ACC', 'MPC_Z_P', 'MPC_Z_VEL_P_ACC',
'COM_DISARM_LAND', 'NAV_RCL_ACT', 'NAV_DLL_ACT',
'MPC_TKO_SPEED', 'MPC_LAND_SPEED',
]
print("\n=== 关键参数对比 ===")
print(f"{'参数名':30} {'SITL':12} {'实机':12} {'差异':12}")
print("-" * 70)
diffs = []
for param in critical_params:
s_val = sitl.get(param, 'N/A')
r_val = real.get(param, 'N/A')
diff = ''
if isinstance(s_val, (int, float)) and isinstance(r_val, (int, float)):
d = r_val - s_val
diff = f"{d:+.4f}" if d != 0 else "相同"
if abs(d) 0.01:
diffs.append(param)
print(f"{param:30} {str(s_val):12} {str(r_val):12} {diff:12}")
if diffs:
print(f"\n需要关注的差异参数: {diffs}")
else:
print("\n所有关键参数一致")
# 使用示例
# dump_params('udp:127.0.0.1:14540', 'sitl_params.json') # SITL
# dump_params('/dev/ttyUSB0:57600', 'real_params.json') # 实机
# compare_params('sitl_params.json', 'real_params.json')
23.5.3 迁移步骤
1. 参数同步:将 SITL 调试好的参数导出,与实机参数逐项对比
2. 安全检查:确认故障安全参数(NAV_RCL_ACT, NAV_DLL_ACT)已正确设置
3. 地面测试:不解锁状态下测试所有控制指令响应
4. 低空测试:在 1-2 米高度验证基本飞行控制
5. 逐步提升:逐步增加飞行高度和速度
6. 完整验证:执行完整任务流程验证
23.6 常见仿真问题排查
23.6.1 问题速查表
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| Gazebo 启动失败 | GPU 驱动不兼容 | export SVGA_VGPU10=0或使用 --render-engine ogre |
| MAVROS2 无法连接 | 端口冲突或参数错误 | 检查 fcu_url参数,确认端口未被占用 |
| 飞控不响应心跳 | SITL 进程未启动 | 确认 PX4 SITL 进程正在运行 |
| Offboard 模式切换失败 | 设定点频率不足 | 确保以 20Hz+ 频率发送设定点至少 2 秒 |
| GPS 无锁定(SITL) | Gazebo GPS 插件延迟 | 等待 1-2 分钟,或检查 world 文件 GPS 配置 |
| 无人机不动 | 未解锁或模式不对 | 检查 ARM 状态和飞行模式 |
| 姿态数据异常 | 坐标系不匹配 | 确认 NED/ENU 坐标系一致 |
| 仿真速度慢 | 物理步长过大 | 调整 real_time_update_rate |
| 多机仿真端口冲突 | 端口分配错误 | 检查每架无人机的 MAVLink 端口分配 |
| ROS2 话题无数据 | DDS 域不匹配 | 确认 ROS_DOMAIN_ID一致 |
23.6.2 诊断命令
# 检查 PX4 SITL 进程
ps aux | grep px4
# 检查端口占用
sudo lsof -i :14540
sudo lsof -i :14557
# 检查 ROS2 话题
ros2 topic list
ros2 topic hz /mavros/imu/data # 检查 IMU 发布频率
ros2 topic echo /mavros/state # 检查飞控连接状态
# 检查 MAVROS2 节点
ros2 node list
ros2 node info /mavros
# Gazebo 调试
gzserver --verbose
gzclient --verbose
# 查看 PX4 SITL 日志
cat ~/PX4-Autopilot/build/px4_sitl_default/tmp/rootfs/log/*.log
# 检查系统资源
htop # CPU/内存
nvidia-smi # GPU(如果适用)
23.6.3 常见错误修复
问题:make px4_sitl gazebo-classic 编译失败
# 解决方案:清理并重新编译
cd ~/PX4-Autopilot
make distclean
make px4_sitl gazebo-classic
问题:MAVROS2 启动后 /mavros/state 显示 connected: False
# 检查 SITL 是否在运行
ps aux | grep px4
# 检查端口
netstat -tulnp | grep 14540
# 尝试直接连接测试
python3 -c "
from pymavlink import mavutil
conn = mavutil.mavlink_connection('udp:127.0.0.1:14540')
hb = conn.wait_heartbeat(timeout=5)
print('Connected!' if hb else 'Failed!')
"
问题:Offboard 模式切换后立刻退出
# 确保在切换模式前持续发送设定点至少 2 秒
# 并且切换后不中断设定点流
for _ in range(100): # 5 秒 @ 20Hz
send_setpoint()
time.sleep(0.05)
# 切换 Offboard
set_mode('OFFBOARD')
# 继续发送设定点(不要停止!)
# 中断超过 0.5 秒会自动退出 Offboard
问题:Gazebo *仿真中 GPS *长时间无锁定
# 检查 Gazebo 世界文件中的 GPS 配置
# 确保 world 文件中包含 GPS 插件
# 编辑 world 文件添加:
#
#
#
# 或等待更长时间(首次 GPS 锁定可能需要 1-2 分钟)
# 在 PX4 shell 中检查 GPS 状态:
# gps status
问题:Docker *中 DDS 通信失败*
# Docker 需要使用 host 网络模式
docker run --network host ...
# 或者配置 DDS 发现
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export CYCLONEDDS_URI='
'
【提示】本章小结:本章系统介绍了 ROS2 无人机开发中的仿真与调试方法。SITL 仿真可以在零风险环境下验证飞行逻辑,是开发流程中不可或缺的一环。建议读者在实际飞行前,务必在 SITL 环境中完成充分测试,并按照迁移检查清单逐项校验参数,确保安全从仿真过渡到实机。HITL 仿真则提供了更接近真实的验证手段,适合在关键任务开发中使用。
AZP_H743 完整引脚定义表
ZP-MH743 飞控基于 STM32H743VIH6 微控制器,采用TFBGA-100 封装,拥有丰富的外设接口。以下为完整的引脚定义表,涵盖所有主要功能模块。
A.1 IMU引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| IMU | BMI270 |
SPI3 |
MOSI | PD6 |
| IMU | BMI270 |
SPI3 |
MISO | PB4 |
| IMU | BMI270 |
SPI3 |
SCLK | PB3 |
| IMU | BMI270 |
SPI3 |
BMI270_CS |
PA15 |
| IMU | BMI270 |
GPIO | BMI270_DR |
PB7 |
| IMU | BMI088 |
SPI2 |
MOSI | PC3 |
| IMU | BMI088 |
SPI2 |
MISO | PC2 |
| IMU | BMI088 |
SPI2 |
SCLK | PD3 |
| IMU | BMI088 |
SPI2 |
BMI088_GYRO_CS |
PD5 |
| IMU | BMI088 |
SPI2 |
BMI088_ACCEL_CS |
PD4 |
| IMU | BMI088 |
GPIO | BMI088_GYRO_DR |
PC15 |
| IMU | BMI088 |
GPIO | BMI088_ACCEL_DR |
PC14 |
| 气压计 | SPL06 |
I2C2 |
SCL | PB10 |
| 气压计 | SPL06 |
I2C2 |
SDA | PB11 |
| 气压计 | SPL06 |
GPIO | SPL06_DR |
PD0 |
| 磁力计 | QMC5883L |
I2C2 |
SCL | PB10 |
| 磁力计 | QMC5883L |
I2C2 |
SDA | PB11 |
A.2 UART引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| UART | — | UART1 |
TX | PA9 |
| UART | — | UART1 |
RX | PA10 |
| UART | VTX-HD | UART2 |
TX | PA2 |
| UART | VTX-HD | UART2 |
RX | PA3 |
| UART | GPS | UART3 |
TX | PD8 |
| UART | GPS | UART3 |
RX | PD9 |
| UART | — | UART4 |
TX | PA0 |
| UART | — | UART4 |
RX | PA1 |
| UART | — | UART5 |
TX | PB6 |
| UART | — | UART5 |
RX | PB5 |
| UART | RCIN | UART6 |
TX | PC6 |
| UART | RCIN | UART6 |
RX | PC7 |
| UART | ESC_Telemetry | UART7 |
RX | PE7 |
| UART | Bluetooth Telemetry | UART8 |
TX | PE1 |
| UART | Bluetooth Telemetry | UART8 |
RX | PE0 |
A.3 I2C 引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| I2C | — | I2C1 |
SDA | PB9 |
| I2C | — | I2C1 |
SCL | PB8 |
A.4 PWM引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| 电机输出 | PWM | TIM1/CH4 |
M1 | PE14 |
| 电机输出 | PWM | TIM1/CH3 |
M2 | PE13 |
| 电机输出 | PWM | TIM1/CH2 |
M3 | PE11 |
| 电机输出 | PWM | TIM1/CH1 |
M4 | PE9 |
| 电机输出 | PWM | TIM3/CH4 |
M5 | PB1 |
| 电机输出 | PWM | TIM3/CH3 |
M6 | PB0 |
| 电机输出 | PWM | TIM4/CH1 |
M7 | PD12 |
| 电机输出 | PWM | TIM4/CH2 |
M8 | PD13 |
| 电机输出 | PWM | TIM15/CH1 |
M9 | PE5 |
| 电机输出 | PWM | TIM15/CH2 |
M10 | PE6 |
| LED 灯带 | PWM | TIM4/CH3 |
— | PD14 |
【提示】DShot 兼容性说明:TIM3 和 TIM4 支持 DShot150/300/600 协议输出。使用 DShot 时建议使用带双向遥测(BDshot)的 ESC 固件(如 BLHeli_32 或 AM32)。
A.5 LED 指示灯引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| 状态灯 | GPIO_OUTPUT |
RED | — | PE3 |
| 状态灯 | GPIO_OUTPUT |
BLUE | — | PE4 |
| 状态灯 | GPIO_OUTPUT |
GREEN | — | PE2 |
| LED_STRIP | RGB | PD3 |
— | WS2812B LED 灯带数据引脚 |
A.6 MicroSD引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| MicroSD卡 | — | SDMMC1 |
D0 | PC8 |
| MicroSD卡 | — | SDMMC1 |
D1 | PC9 |
| MicroSD卡 | — | SDMMC1 |
D2 | PC10 |
| MicroSD卡 | — | SDMMC1 |
D3 | PC11 |
| MicroSD卡 | — | SDMMC1 |
CLK | PC12 |
| MicroSD卡 | — | SDMMC1 |
CMD | PD2 |
A.7 ADC(模数转换)引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| 电池检测 | 分压比 1:21 | ADC | Voltage | PC0 |
| 电池检测 | — | ADC | Current | PC1 |
| ADC_AIRS | 接收信号强度 | ADC | Voltage | PC4 |
| ADC_RSSI | 空速计模拟信号输入 | ADC | Voltage | PC5 |
A.8 USB 引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| USB | — | USB | USB_DM | PA11 |
| USB | — | USB | USB_DP | PA12 |
| USB_VBUS | — | USB OTG FS | VBUS 检测引脚 | PA8 |
【提示】USB 接口规格:支持 USB 2.0 Full-Speed(12 Mbps),通过 USB Type-C 接口连接,内置 USB VCP 虚拟串口,用于地面站配置与固件刷写。
A.9 CAN 总线引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| CAN | SIT1051AQTK/3 |
TX | CAN 总线数据发送 | PD1 |
| CAN | SIT1051AQTK/3 |
RX | CAN 总线数据接收 | PD0 |
| CAN | SIT1051AQTK/3 |
S | CAN 总线静默模式与高速模式选择 | PE15 |
A.10 OSD引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| OSD | AT7456E |
SPI1 |
MOSI | PA7 |
| OSD | AT7456E |
SPI1 |
MISO | PA6 |
| OSD | AT7456E |
SPI1 |
SCLK | PA5 |
| OSD | AT7456E |
SPI1 |
OSD_CS | PB12 |
A.11 通用 GPIO引脚定义
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| IO1 | — | 通用数字 IO | — | PD10 |
| IO2 | — | 通用数字 IO | — | PD11 |
| IO3 | — | 通用数字 IO | — | PB14 |
| IO4 | — | 通用数字 IO | — | PB15 |
通用 GPIO引脚的复用功能需自行查询STM32H743VIH6的DateSheet手册。
A.12 其他引脚
| 功能分类 | 器件/用途 | 总线/外设 | 信号 | MCU 引脚 |
|---|---|---|---|---|
| 蜂鸣器 | GPIO | — | — | PD15 |
| 外部晶振 | External | 8 MHz | OSC_IN | PH0 |
| 外部晶振 | External | 8 MHz | OSC_OUT | PH1 |
| 按键 | — | BOOT | — | BOOT0 |
| 调试接口 | — | SWD | SWDIO | PA13 |
| 调试接口 | — | SWD | SWCLK | PA14 |
B常用 CLI 命令速查表(Betaflight / INAV)
B.1 Betaflight CLI 命令
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| help | help | 显示所有可用命令列表 | help |
| dump | dump [all] | 导出当前全部配置 | dump all config.txt |
| diff | diff [all] | 仅导出与默认值不同的配置项 | diff all |
| save | save | 保存当前配置并重启飞控 | save |
| set | set 参数名 = 值 | 修改指定参数值 | set gyro_lpf1_static_hz = 250 |
| get | get 参数名 | 查询指定参数当前值 | get dshot*(支持通配符) |
| motor | motor 编号 值 | 手动测试指定电机转速 | motor 0 1200 |
| mixer | mixer | 显示当前混控器配置 | mixer |
| resource | resource 功能 编号 引脚 | 查看或修改资源映射 | resource MOTOR 1 B01 |
| serial | serial 端口号 功能位掩码 |
配置串口功能 | serial 0 64 115200 57600 0 115200 |
| feature | feature [+-]功能名 | 启用或禁用系统功能 | feature OSD、feature -SOFTSERIAL |
| beeper | beeper [+-]类型 | 配置蜂鸣器触发条件 | beeper RX_LOST |
| rx | rx | 显示接收机配置 | rx |
| map | map 通道映射 | 设置遥控器通道映射顺序 | map AETR1234 |
| tasks | tasks | 显示系统任务列表及 CPU 占用 | tasks |
| status | status | 显示系统运行状态概览 | status |
| version | version | 显示固件版本信息 | version |
| vtx | vtx 频段 频道 功率 | 配置图传参数 | vtx 5 8 3 |
| led | led 编号 配置字符串 | 配置 LED 灯带效果 | led 0 0,0::C:0 |
| bl | bl | 进入 Bootloader(DFU 模式) | bl |
| defaults | defaults [norelease] | 恢复出厂默认设置 | defaults |
| profile | profile 0-2 | 切换 PID 配置文件 | profile 1 |
| rateprofile | rateprofile 0-5 | 切换速率配置文件 | rateprofile 2 |
| adjrange | adjrange 索引 ... | 配置辅助通道调整范围 | adjrange 0 0 3 900 2100 26 0 |
| aux | aux 索引 模式ID 辅助通道 范围起始 范围结束 | 配置飞行模式开关 | aux 0 0 0 1700 2100 |
| serialpassthrough | serialpassthrough 端口 | 串口透传模式 | serialpassthrough 0 |
| dma | dma | 显示 DMA 通道分配情况 | dma |
| timer | timer | 显示定时器分配情况 | timer |
| mcu_id | mcu_id | 显示 MCU 唯一标识符 | mcu_id |
| blackbox | blackbox erase | 擦除黑匣子日志数据 | blackbox erase |
B.2 INAV 特有 CLI 命令(在 Betaflight 基础上新增)
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| nav | nav | 显示导航相关参数 | nav |
| wp | wp 编号 动作 纬度 经度 高度 ... | 编辑航点任务 | wp 1 1 312345678 1214567890 5000 0 0 0 |
| wp_load | wp_load | 从闪存加载航点任务 | wp_load |
| wp_save | wp_save | 保存航点任务至闪存 | wp_save |
| poshold | set nav_position = 模式 | 设置定点悬停模式参数 | set nav_user_control_mode = 1 |
| rth | set nav_rth_altitude = 厘米 | 设置返航高度参数 | set nav_rth_altitude = 5000 |
| osd_layout | osd_layout 编号 元素 |
配置 OSD 布局 | osd_layout 0 1 1 1 V |
| logic | logic 规则编号 操作 ... | 配置逻辑条件规则 | logic 0 1 0 0 0 0 |
| safehome | safehome 编号 启用 纬度 经度 | 设置安全归航点 | safehome 0 1 312345678 1214567890 |
| mixer | mixer 类型 | 设置飞行器混控类型 | mixer QUADX |
| bat | bat | 显示电池配置参数 | bat |
| fw | fw | 显示固定翼相关参数 | fw |
CArduPilot 重要参数速查表
C.1 飞行模式参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| FLTMODE1 | 遥控器通道5位置1对应飞行模式 | 0 (Stabilize) | 0-17 | 0=自稳, 1=特技, 2=定高, 3=自动, 4=引导, 5=悬停, 6=返航, 7=圈飞, 9=降落, 11=漂移, 13=运动, 14=避障, 15=定速, 16=定位, 17=刹车 |
| FLTMODE2 | 遥控器通道5位置2对应飞行模式 | 0 (Stabilize) | 0-17 | 同上 |
| FLTMODE3 | 遥控器通道5位置3对应飞行模式 | 5 (Loiter) | 0-17 | 同上 |
| FLTMODE4 | 遥控器通道5位置4对应飞行模式 | 6 (RTL) | 0-17 | 同上 |
| FLTMODE5 | 遥控器通道5位置5对应飞行模式 | 3 (Auto) | 0-17 | 同上 |
| FLTMODE6 | 遥控器通道5位置6对应飞行模式 | 0 (Stabilize) | 0-17 | 同上 |
| FLIGHT_OPTIONS | 飞行模式选项位掩码 | 0 | 0-65535 | 位掩码启用额外飞行模式特性 |
| MODES_FLTR | 飞行模式滤波器 | 0 | 0-1 | 0=禁用, 1=启用模式切换滤波 |
C.2 PID 调参参数(姿态控制器)
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| ATC_RAT_RLL_P | 横滚角速率P增益 | 0.135 | 0.01-0.5 | 横滚响应的主要增益 |
| ATC_RAT_RLL_I | 横滚角速率I增益 | 0.135 | 0.01-0.5 | 消除稳态误差 |
| ATC_RAT_RLL_D | 横滚角速率D增益 | 0.0036 | 0.0-0.02 | 抑制高频振荡 |
| ATC_RAT_RLL_IMAX | 横滚角速率积分限幅 | 0.444 | 0.1-1.0 | 防止积分饱和 |
| ATC_RAT_RLL_FILT | 横滚角速率滤波器频率 | 20.0 | 5-100 | 单位 Hz |
| ATC_RAT_PIT_P | 俯仰角速率P增益 | 0.135 | 0.01-0.5 | 俯仰响应的主要增益 |
| ATC_RAT_PIT_I | 俯仰角速率I增益 | 0.135 | 0.01-0.5 | 消除稳态误差 |
| ATC_RAT_PIT_D | 俯仰角速率D增益 | 0.0036 | 0.0-0.02 | 抑制高频振荡 |
| ATC_RAT_PIT_IMAX | 俯仰角速率积分限幅 | 0.444 | 0.1-1.0 | 防止积分饱和 |
| ATC_RAT_PIT_FILT | 俯仰角速率滤波器频率 | 20.0 | 5-100 | 单位 Hz |
| ATC_RAT_YAW_P | 偏航角速率P增益 | 0.180 | 0.01-0.5 | 偏航响应增益 |
| ATC_RAT_YAW_I | 偏航角速率I增益 | 0.018 | 0.005-0.1 | 偏航积分增益 |
| ATC_RAT_YAW_D | 偏航角速率D增益 | 0.000 | 0.0-0.02 | 通常设为0 |
| ATC_RAT_YAW_IMAX | 偏航角速率积分限幅 | 0.444 | 0.1-1.0 | 防止偏航积分饱和 |
| ATC_RAT_YAW_FILT | 偏航角速率滤波器频率 | 2.5 | 1-20 | 单位 Hz |
| ATC_ANG_RLL_P | 横滚角度环P增益 | 4.5 | 1.0-12.0 | 外环控制器增益 |
| ATC_ANG_PIT_P | 俯仰角度环P增益 | 4.5 | 1.0-12.0 | 外环控制器增益 |
| ATC_ANG_YAW_P | 偏航角度环P增益 | 4.5 | 1.0-12.0 | 外环控制器增益 |
| ATC_THR_MIX_MAN | 手动油门混控比例 | 0.5 | 0.1-1.0 | 手动模式下油门与姿态的混合比 |
| ATC_ACCEL_R_MAX | 最大横滚角加速度 | 110000 | 0-200000 | 单位 度/秒²,0=不限 |
| ATC_ACCEL_P_MAX | 最大俯仰角加速度 | 110000 | 0-200000 | 单位 度/秒²,0=不限 |
| ATC_ACCEL_Y_MAX | 最大偏航角加速度 | 27000 | 0-100000 | 单位 度/秒²,0=不限 |
C.3 导航参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| WPNAV_SPEED | 航点飞行水平速度 | 500 | 50-2000 | 单位 cm/s |
| WPNAV_SPEED_UP | 航点飞行爬升速度 | 250 | 50-500 | 单位 cm/s |
| WPNAV_SPEED_DN | 航点飞行下降速度 | 150 | 50-500 | 单位 cm/s |
| WPNAV_ACCEL | 航点飞行水平加速度 | 100 | 50-500 | 单位 cm/s² |
| WPNAV_RADIUS | 航点到达判定半径 | 200 | 10-1000 | 单位 cm |
| RTL_ALT | 返航高度 | 1500 | 0-8000 | 单位 cm(15米) |
| RTL_SPEED | 返航水平速度 | 0 | 0-2000 | 单位 cm/s,0=使用 WPNAV_SPEED |
| RTL_LOIT_TIME | 返航到达后悬停时间 | 60000 | 0-600000 | 单位 毫秒 |
| RTL_CONE_SLOPE | 返航锥体斜率 | 3.0 | 0.5-10.0 | 返航锥体定义 |
| LOIT_SPEED | 悬停模式最大速度 | 1250 | 20-3500 | 单位 cm/s |
| LOIT_ACC_MAX | 悬停模式最大加速度 | 500 | 100-1000 | 单位 cm/s² |
| LOIT_BRK_ACCEL | 悬停模式刹车加速度 | 750 | 25-1500 | 单位 cm/s² |
| LOIT_BRK_DELAY | 悬停模式刹车延迟 | 1.0 | 0.1-5.0 | 单位 秒 |
C.4 失控保护参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| FS_GCS_ENABL | 地面站失联保护 | 0 | 0-7 | 0=禁用, 1=启用RTL, 2=继续任务, 5=降落 |
| FS_THR_ENABLE | 油门失控保护 | 1 | 0-4 | 0=禁用, 1=RTL, 2=继续, 3=降落, 4=悬停 |
| FS_THR_VALUE | 油门失控保护阈值 | 975 | 910-1100 | PWM 值 |
| FS_BATT_ENABLE | 电池失控保护 | 0 | 0-2 | 0=禁用, 1=降落, 2=RTL |
| FS_BATT_VOLTAGE | 电池电压失控保护阈值 | 0.0 | 0-100 | 单位 伏特,0=禁用 |
| FS_BATT_MAH | 电池容量失控保护阈值 | 0 | 0-100000 | 单位 mAh,0=禁用 |
| FS_EKF_ACTION | EKF异常保护动作 | 1 | 1-3 | 1=降落, 2=定高模式, 3=降落+限制 |
| FS_EKF_THRESH | EKF异常保护阈值 | 0.8 | 0.2-1.0 | EKF 方差阈值 |
| FS_GPS_ENABL | GPS 失控保护 | 1 | 0-1 | GPS 丢失时的处理方式 |
| FS_CRASH_CHECK | 坠机检测 | 1 | 0-3 | 0=禁用, 1=启用 |
| FS_OPTIONS | 失控保护选项位掩码 | 0 | 0-65535 | 位掩码配置额外保护行为 |
C.5 传感器参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| AHRS_ORIENTATION | 飞控安装方向 | 0 | 0-43 | 0=默认, 4=旋转90度, 8=旋转180度等 |
| COMPASS_USE | 是否使用磁力计偏航 | 1 | 0-1 | 0=禁用, 1=启用 |
| COMPASS_USE2 | 是否使用第二磁力计 | 1 | 0-1 | 0=禁用, 1=启用 |
| COMPASS_USE3 | 是否使用第三磁力计 | 1 | 0-1 | 0=禁用, 1=启用 |
| COMPASS_ORIENT | 磁力计安装方向 | 0 | 0-43 | 与飞控安装方向一致 |
| BARO_PRIMARY | 主气压计选择 | 0 | 0-2 | 0=第一个检测到的气压计 |
| INS_GYRO_FILTER | 陀螺仪低通滤波器 | 20 | 5-256 | 单位 Hz |
| INS_ACCEL_FILTER | 加速度计低通滤波器 | 20 | 5-256 | 单位 Hz |
| INS_GYRO_CAL | 陀螺仪校准阈值 | 3.0 | 0-10 | 单位 度/秒 |
| EK3_SRC1_POSXY | EKF3 水平位置源 | 3 | 0-6 | 0=无, 3=GPS, 6=外部导航 |
| EK3_SRC1_POSZ | EKF3 垂直位置源 | 1 | 0-3 | 0=无, 1=气压计 |
| EK3_SRC1_VELXY | EKF3 水平速度源 | 3 | 0-6 | 0=无, 3=GPS, 5=光流 |
| EK3_SRC1_VELZ | EKF3 垂直速度源 | 3 | 0-6 | 0=无, 3=GPS |
| EK3_SRC1_YAW | EKF3 偏航源 | 1 | 0-2 | 0=无, 1=磁力计, 2=GPS |
C.6 电机 / 电调参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| MOT_SPIN_ARM | 解锁时电机旋转速度 | 0.10 | 0.0-1.0 | 油门通道的比例值 |
| MOT_SPIN_MIN | 电机最低转速 | 0.15 | 0.0-1.0 | 油门通道的比例值 |
| MOT_SPIN_MAX | 电机最高转速 | 0.95 | 0.0-1.0 | 油门通道的比例值 |
| MOT_PWM_TYPE | 电调 PWM 协议类型 | 0 | 0-8 | 0=Normal, 1=OneShot, 4=DShot150, 5=DShot300, 6=DShot600, 7=DShot1200 |
| MOT_PWM_MIN | PWM 输出最小值 | 1000 | 1000-1300 | 单位 微秒 |
| MOT_PWM_MAX | PWM 输出最大值 | 2000 | 1700-2000 | 单位 微秒 |
| MOT_BAT_VOLT_MAX | 电池最大电压 | 0.0 | 6-100 | 单位 伏特,0=不限 |
| MOT_BAT_VOLT_MIN | 电池最小电压 | 0.0 | 6-100 | 单位 伏特,0=不限 |
| MOT_THST_EXPO | 推力曲线指数 | 0.65 | -1.0-1.0 | 正值使推力曲线更线性 |
| MOT_THST_HOVER | 悬停油门 | 0.25 | 0.0-0.6875 | 估算值,系统会自动学习 |
| MOT_HOVER_LEARN | 悬停油门学习 | 2 | 0-2 | 0=禁用, 1=仅学习, 2=学习并保存 |
DPX4 重要参数速查表
D.1 机体参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| SYS_AUTOSTART | 机体自动启动 ID | 0 | 0-99999 | 4001=四轴X, 4010=四轴+, 4015=S500, 4041=Holybro X500 |
| SYS_AUTOCONFIG | 自动配置标志 | 0 | 0-1 | 1=自动配置传感器 |
| SYS_USE_IO | 使用 IO 处理器 | 1 | 0-1 | 仅适用于带有 IO 板的飞控 |
| SYS_HITL | 硬件在环仿真 | 0 | 0-1 | 1=启用 HITL 模式 |
| SYS_HAS_MAG | 是否有磁力计 | 1 | 0-1 | 0=禁用磁力计检查 |
| SYS_HAS_BARO | 是否有气压计 | 1 | 0-1 | 0=禁用气压计检查 |
| SYS_HAS_GPS | 是否有 GPS | 1 | 0-1 | 0=禁用 GPS 检查 |
| SENS_BOARD_X_OFF | 板载传感器 X 偏移 | 0.0 | -180-180 | 单位 度 |
| SENS_BOARD_Y_OFF | 板载传感器 Y 偏移 | 0.0 | -180-180 | 单位 度 |
| SENS_BOARD_Z_OFF | 板载传感器 Z 偏移 | 0.0 | -180-180 | 单位 度 |
| SENS_BOARD_ROT | 板载传感器旋转 | 0 | 0-8 | 0=无旋转, 4=旋转90度等 |
D.2 遥控器参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| RC_MAP_ROLL | 横滚通道映射 | 1 | 1-18 | 遥控器通道编号 |
| RC_MAP_PITCH | 俯仰通道映射 | 2 | 1-18 | 遥控器通道编号 |
| RC_MAP_THROTTLE | 油门通道映射 | 3 | 1-18 | 遥控器通道编号 |
| RC_MAP_YAW | 偏航通道映射 | 4 | 1-18 | 遥控器通道编号 |
| RC_MAP_MODE_SW | 模式开关通道映射 | 0 | 0-18 | 0=禁用 |
| RC_MAP_RETURN_SW | 返航开关通道映射 | 0 | 0-18 | 0=禁用 |
| RC_MAP_POSCTL_SW | 定位控制开关映射 | 0 | 0-18 | 0=禁用 |
| RC_MAP_LOITER_SW | 悬停开关通道映射 | 0 | 0-18 | 0=禁用 |
| RC_MAP_ARM_SW | 解锁开关通道映射 | 0 | 0-18 | 0=禁用 |
| COM_RC_IN_MODE | 遥控器输入模式 | 0 | 0-4 | 0=遥控器, 1=摇杆, 3=遥控器+摇杆 |
| COM_RC_LOSS_T | 遥控器信号丢失超时 | 0.5 | 0.1-2.0 | 单位 秒 |
| RC_FAILS_THR | 遥控器失控保护阈值 | 0 | 0-100 | PWM 值偏移量 |
D.3 飞行模式参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| COM_FLTMODE1 | 模式开关位置1对应飞行模式 | 0 (Manual) | 0-8 | 0=手动, 1=特技, 2=定点, 3=任务, 4=悬停, 5=返航, 6=定高, 7=Offboard, 8=起飞 |
| COM_FLTMODE2 | 模式开关位置2对应飞行模式 | 6 (Altitude) | 0-8 | 同上 |
| COM_FLTMODE3 | 模式开关位置3对应飞行模式 | 2 (Position) | 0-8 | 同上 |
| COM_FLTMODE4 | 模式开关位置4对应飞行模式 | 4 (Hold) | 0-8 | 同上 |
| COM_FLTMODE5 | 模式开关位置5对应飞行模式 | 5 (Return) | 0-8 | 同上 |
| COM_FLTMODE6 | 模式开关位置6对应飞行模式 | 3 (Mission) | 0-8 | 同上 |
D.4 多旋翼导航与控制参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| MPC_XY_VEL_MAX | 最大水平速度 | 12.0 | 0-20.0 | 单位 m/s |
| MPC_Z_VEL_MAX_UP | 最大爬升速度 | 3.0 | 0-8.0 | 单位 m/s |
| MPC_Z_VEL_MAX_DN | 最大下降速度 | 1.0 | 0-4.0 | 单位 m/s |
| MPC_XY_CRUISE | 巡航速度 | 5.0 | 1-12.0 | 单位 m/s |
| MPC_ACC_HOR_MAX | 最大水平加速度 | 5.0 | 2-15.0 | 单位 m/s² |
| MPC_ACC_UP_MAX | 最大垂直上升加速度 | 4.0 | 2-10.0 | 单位 m/s² |
| MPC_ACC_DOWN_MAX | 最大垂直下降加速度 | 3.0 | 2-10.0 | 单位 m/s² |
| MPC_LAND_SPEED | 降落速度 | 0.7 | 0.2-2.0 | 单位 m/s |
| MPC_TKO_SPEED | 起飞爬升速度 | 1.5 | 0.5-5.0 | 单位 m/s |
| MPC_MAN_Y_MAX | 手动偏航最大角速率 | 150.0 | 45-360 | 单位 度/秒 |
| MPC_MAN_TILT_MAX | 手动最大倾斜角 | 35.0 | 15-60 | 单位 度 |
| NAV_RTL_RETURN_ALT | 返航高度 | 60.0 | 10-300 | 单位 米 |
| NAV_ACC_RAD | 航点到达半径 | 0.8 | 0.1-10.0 | 单位 米 |
| NAV_FW_CRUISE_SPD | 固定翼巡航速度 | 15.0 | 5-40 | 单位 m/s |
D.5 安全参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| COM_DISARM_LAND | 着陆后自动解锁时间 | 0.5 | 0-60 | 单位 秒,0=禁用 |
| COM_DISARM_PRFLT | 起飞前解锁超时 | 10.0 | 0-60 | 单位 秒 |
| COM_ARM_EKF_AB | EKF 加速度偏置解锁阈值 | 0.5 | 0.05-1.0 | 单位 m/s² |
| COM_ARM_EKF_GB | EKF 陀螺仪偏置解锁阈值 | 0.08 | 0.01-0.2 | 单位 rad/s |
| COM_ARM_WO_GPS | 无 GPS 时允许解锁 | 1 | 0-1 | 0=禁止, 1=允许 |
| CBRK_SUPPLY_CHK | 电源检查断路器 | 0 | 0-896543 | 896543=跳过电源检查 |
| CBRK_USB_CHK | USB 检查断路器 | 0 | 0-197848 | 197848=跳过 USB 检查 |
| CBRK_AIRSPD_CHK | 空速管检查断路器 | 0 | 0-162128 | 162128=跳过空速管检查 |
| COM_HLDL_LOSS_T | 数据链路丢失超时 | 120 | 0-600 | 单位 秒 |
| COM_HLDL_REG_T | 数据链路恢复时间 | 0 | 0-600 | 单位 秒 |
D.6 MAVLink 参数
| 参数名 | 说明 | 默认值 | 有效范围 | 备注 |
|---|---|---|---|---|
| MAV_0_CONFIG | MAVLink 实例0配置 | 101 | 0-201 | 串口配置编号 |
| MAV_0_MODE | MAVLink 实例0消息模式 | 0 | 0-2 | 0=Normal, 1=Custom, 2=Onboard |
| MAV_0_RATE | MAVLink 实例0最大发送速率 | 1200 | 10-100000 | 单位 字节/秒 |
| MAV_1_CONFIG | MAVLink 实例1配置 | 0 | 0-201 | 0=禁用 |
| MAV_1_MODE | MAVLink 实例1消息模式 | 2 | 0-2 | 同上 |
| MAV_1_RATE | MAVLink 实例1最大发送速率 | 1200 | 10-100000 | 单位 字节/秒 |
| MAV_PROTO_VER | MAVLink 协议版本 | 0 | 0-2 | 0=自动, 1=V1, 2=V2 |
| MAV_SYS_ID | MAVLink 系统 ID | 1 | 1-255 | 飞行器 ID |
| MAV_COMP_ID | MAVLink 组件 ID | 1 | 1-255 | 组件 ID |
E遥控器对频与通道映射速查(Futaba / FrSky / ELRS / TBS)
E.1 Futaba FASST / FHSS 对频流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 遥控器进入对频模式 | 按住遥控器 LINK 按钮 3 秒,LED 闪烁 |
| 2 | 接收机上电 | 接通接收机电源,LED 快速闪烁 |
| 3 | 按下接收机对频按钮 | 按住 BIND 按钮约 2 秒 |
| 4 | 等待连接建立 | 接收机 LED 常亮表示对频成功 |
| 5 | 验证通道 | 活动摇杆确认所有通道响应正常 |
Futaba FASST 信号规格:
| 参数 | 规格 |
|---|---|
| 频率范围 | 2.4 GHz (2402-2480 MHz) |
| 调制方式 | FHSS / FASSTest |
| 通道数 | 最多 18 通道 |
| 数据协议 | S.BUS2 / FASST |
| 信号延迟 | 约 7-14 ms |
| 有效距离 | 约 2 km(开阔环境) |
E.2 FrSky ACCST / ACCESS 对频流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 遥控器选择对频选项 | 进入 MODEL SETUP → BIND 页面 |
| 2 | 选择对频模式 | D16 (ACCST) 或 ACCESS 模式 |
| 3 | 接收机上电并进入对频模式 | 按住接收机 F/S 按钮同时上电 |
| 4 | 遥控器点击 BIND | 点击遥控器屏幕上的 BIND 按钮 |
| 5 | 确认连接 | 接收机 LED 由闪烁变为常亮 |
FrSky 接收机信号规格:
| 参数 | ACCST (D16) | ACCESS |
|---|---|---|
| 频率范围 | 2.4 GHz | 2.4 GHz |
| 通道数 | 16 通道 | 24 通道 |
| 跳频方式 | FHSS | FHSS (改进型) |
| 延迟 | 约 9 ms | 约 3 ms |
| 遥测 | S.Port | S.Port 2.0 |
| 有效距离 | 约 1.5 km | 约 2 km |
| SBUS 帧率 | 9 ms / 18 ms | 9 ms |
E.3 ExpressLRS (ELRS) 对频流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 配置绑定短语 | 在发射机 LUA 脚本中设置 Bind Phrase |
| 2 | 接收机进入对频模式 | 上电三次(每次 2 秒内断电)进入对频 |
| 3 | 发射机进入对频模式 | 在 LUA 脚本中选择 BIND 或预设相同 Phrase |
| 4 | 自动连接 | 接收机 LED 变为常亮表示连接成功 |
| 5 | 保存配置 | 断开再上电验证自动连接 |
ExpressLRS 参数配置:
| 参数 | 可选值 | 说明 |
|---|---|---|
| Packet Rate | 50/100/150/200/250/333/500 Hz / F1000 / F500 / F250 | 数据包发送频率 |
| Telemetry Ratio | Off / 1:2 / 1:4 / 1:8 / 1:16 / 1:32 / 1:64 / 1:128 | 遥测回传比率 |
| Switch Mode | Wide / Hybrid | 开关数据传输模式 |
| Model Match | On / Off | 模型匹配功能 |
| TX Power | 10/25/50/100/250/500/1000/2000 mW | 发射功率 |
| RF Band | 915 MHz / 2.4 GHz | 射频频段 |
E.4 TBS Crossfire 对频流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 发射机进入对频模式 | 通过 Agent M / Agent X 选择 BIND |
| 2 | 接收机进入对频模式 | 双击接收机 BIND 按钮(或三次上电) |
| 3 | 等待自动连接 | 接收机 LED 由慢闪变为常亮 |
| 4 | 确认连接 | LED 常亮且遥测数据正常显示 |
TBS Crossfire / Nano RX 规格:
| 参数 | Crossfire Micro TX | Crossfire Nano RX |
|---|---|---|
| 频率 | 868/915 MHz | 868/915 MHz |
| 通道数 | 12 通道 | 12 通道 |
| 刷新率 | 4-150 Hz | 4-150 Hz |
| 发射功率 | 最高 1000 mW | — |
| 协议 | CRSF | CRSF |
| 延迟 | 约 4-20 ms | — |
| 有效距离 | 40+ km | — |
E.5 通道映射对照表
| 协议 | 默认顺序 | SBUS 通道顺序 | CRSF 通道顺序 | 备注 |
|---|---|---|---|---|
| Futaba (AETR) | AETR | CH1=A, CH2=E, CH3=T, CH4=R |
— | 日本手(Mode 1) |
| Futaba (TAER) | TAER | CH1=T, CH2=A, CH3=E, CH4=R |
— | 美国手(Mode 2) |
| FrSky (AETR) | AETR | CH1=A, CH2=E, CH3=T, CH4=R |
— | 默认 AETR |
| FrSky (TAER) | TAER | CH1=T, CH2=A, CH3=E, CH4=R |
— | 美国手 |
| ELRS (AETR) | AETR | CH1=A, CH2=E, CH3=T, CH4=R |
CH1=A, CH2=E, CH3=T, CH4=R |
默认 AETR |
| ELRS (TAER) | TAER | CH1=T, CH2=A, CH3=E, CH4=R |
CH1=T, CH2=A, CH3=E, CH4=R |
美国手 |
| TBS (AETR) | AETR | — | CH1=A, CH2=E, CH3=T, CH4=R |
CRSF 协议 |
| TBS (TAER) | TAER | — | CH1=T, CH2=A, CH3=E, CH4=R |
CRSF 协议 |
E.6 信号协议规格对照
| 协议 | 信号类型 | 帧率 | 通道数 | 电压电平 | 极性 |
|---|---|---|---|---|---|
| SBUS | 串行 UART | 100 kbps | 16 + 2 数字 | 3.3V(反转UART) | 反转 |
| CRSF | 串行 UART | 420 kbps | 16 | 3.3V | 正常 |
| PPM | 模拟脉冲 | 50 Hz (20ms帧) | 8-16 | 3.3V / 5V | 上升沿触发 |
| IBUS | 串行 UART | 115.2 kbps | 14 | 3.3V | 正常 |
| DSM2/X | 串行 UART | 115.2 kbps | 12 | 3.3V | 正常 |
| SUMD | 串行 UART | 115.2 kbps | 16 | 3.3V | 正常 |
F常见故障代码与排除对照表
F.1 Betaflight LED 错误码
| LED 闪烁模式 | 含义 | 可能原因 | 排除方法 |
|---|---|---|---|
| 短闪 1 次(循环) | 陀螺仪初始化失败 | IMU 芯片损坏 / SPI 通信故障 | 检查 SPI 连接,重新刷写固件 |
| 短闪 2 次(循环) | 加速度计初始化失败 | IMU 芯片损坏 / 供电异常 | 检查 3.3V 供电,更换 IMU |
| 短闪 3 次(循环) | 磁力计初始化失败 | I2C 通信异常 / 磁力计损坏 | 检查 I2C 线路,禁用磁力计功能 |
| 短闪 4 次(循环) | 气压计初始化失败 | I2C 通信异常 / 气压计损坏 | 检查 I2C 线路,检查气压计焊接 |
| 短闪 5 次(循环) | GPS 初始化失败 | 串口配置错误 / GPS 模块损坏 | 检查串口配置和接线 |
| 短闪 6 次(循环) | 闪存初始化失败 | SPI 通信故障 / 闪存芯片损坏 | 检查 SPI3 连接,检查闪存焊接 |
| 持续快速闪烁 | 未校准 / 传感器异常 | 飞控未完成初始化 | 检查供电,等待初始化完成 |
| 慢闪 | 已解锁(DISARMED) | 正常状态 | — |
| 快闪 | 已上锁(ARMED) | 正常状态 | — |
| 呼吸灯效果 | 正在接收 MSP 数据 | USB 连接或蓝牙连接中 | 正常状态 |
F.2 ArduPilot LED 与声音错误码
| 指示灯状态 | 蜂鸣器模式 | 含义 | 排除方法 |
|---|---|---|---|
| 红蓝交替闪烁 | 无 | 系统初始化中 | 等待初始化完成 |
| 黄色慢闪 | 无 | 已解锁但未锁定 GPS | 等待 GPS 定位或切换模式 |
| 绿色慢闪 | 无 | GPS 已锁定,可飞行 | 正常状态 |
| 绿色快闪 | 无 | GPS 锁定 + 已解锁 | 正常状态 |
| 蓝色慢闪 | 无 | 手动/自稳模式 | 正常状态 |
| 蓝色快闪 | 无 | 定高/定点模式 | 正常状态 |
| 红色快闪 | 连续急促 | 电池电压过低报警 | 立即降落,检查电池 |
| 红绿交替 | 长鸣 | EKF 故障 | 检查传感器,重启飞控 |
| 全灭 | 无 | 系统断电 / 飞控故障 | 检查供电和连接 |
F.3 电调 (ESC) 常见故障码
| 故障现象 | 蜂鸣器音调 | 含义 | 排除方法 |
|---|---|---|---|
| 开机后无反应 | 无声音 | 电调未供电 / 信号线断开 | 检查电源和信号线连接 |
| 开机后单声短响 | ♪ | 正常启动,等待油门信号 | 正常状态 |
| 重复短促双响 | ♪♪ ♪♪ | 油门信号丢失 | 检查 PWM/DShot 信号线 |
| 重复三声短响 | ♪♪♪ ♪♪♪ | 油门行程未校准 | 执行油门行程校准 |
| 长声连续响 | ———— | 过热保护 | 让电调冷却,检查电机负载 |
| 间歇性断响 | 不规则 | 电源不稳定 / 电容失效 | 检查电源连接,更换电容 |
| 电机抖动不转 | 间歇性 | 电机线序错误 / 缺相 | 检查电机三相连接 |
| DShot 遥测错误 | — | DShot 校验和失败 | 降低 DShot 速率,检查信号完整性 |
F.4 GPS 模块故障指示
| 故障现象 | LED 状态 | 含义 | 排除方法 |
|---|---|---|---|
| 无法获取卫星 | LED 不亮/慢闪 | GPS 未锁定 | 移至开阔地带,等待 5-10 分钟 |
| 卫星数不足 | LED 快闪 | 信号弱,卫星数 6 | 检查天线朝向,远离遮挡物 |
| 定位精度差 | LED 正常但 HDOP 2.0 | 信号质量不佳 | 检查天线,远离电磁干扰源 |
| 无串口输出 | LED 正常 | 波特率/协议不匹配 | 检查串口配置(9600/38400/115200) |
| 时间不同步 | — | GPS 时间未锁定 | 等待更多卫星锁定 |
| 冷启动慢 | — | 首次启动需下载星历 | 等待 30 秒至 5 分钟 |
F.5 传感器校准失败原因
| 传感器类型 | 校准失败原因 | 解决方案 |
|---|---|---|
| 加速度计 | 飞控未水平放置 | 使用水平仪辅助,确保飞控完全水平 |
| 加速度计 | 校准过程中有振动/移动 | 确保校准时飞控完全静止 |
| 加速度计 | 温度漂移过大 | 等待飞控温度稳定后再校准 |
| 陀螺仪 | 开机时存在持续振动 | 检查电机安装和螺旋桨平衡 |
| 陀螺仪 | 飞控安装松动 | 确保飞控固定牢固 |
| 磁力计 | 附近存在铁磁性物质 | 远离金属物体和电源线 |
| 磁力计 | 电流产生磁场干扰 | 确保大电流线路远离磁力计 |
| 磁力计 | 安装方向未设置 | 在参数中设置正确的安装方向 |
| 气压计 | 强风吹拂气压计孔 | 遮挡气压计开口或使用海绵保护 |
| 气压计 | 阳光直射加热传感器 | 避免阳光直接照射气压计 |
GMAVLink 常用消息 ID 速查表
G.1 核心状态消息
| 消息 ID | 消息名称 | 说明 | 默认频率 | 数据载荷大小 |
|---|---|---|---|---|
| 0 | HEARTBEAT | 心跳包,表示系统在线 | 1 Hz | 9 字节 |
| 1 | SYS_STATUS |
系统状态概览(传感器、电池、通信状态) | 1 Hz | 31 字节 |
| 2 | SYSTEM_TIME |
系统时间(启动时间与 Unix 时间) | 1 Hz | 12 字节 |
| 4 | PING | 网络延迟测试 | 按需 | 14 字节 |
| 253 | STATUSTEXT | 系统状态文本消息(告警、信息) | 事件触发 | 50 字节 |
G.2 姿态与位置消息
| 消息 ID | 消息名称 | 说明 | 默认频率 | 数据载荷大小 |
|---|---|---|---|---|
| 30 | ATTITUDE | 姿态角(横滚、俯仰、偏航)与角速率 | 10-25 Hz | 28 字节 |
| 31 | ATTITUDE_QUATERNION |
四元数姿态表示 | 10 Hz | 32 字节 |
| 33 | GLOBAL_POSITION_INT |
全球位置(经纬高)与速度 | 5-10 Hz | 28 字节 |
| 32 | LOCAL_POSITION_NED |
本地 NED 坐标系位置 | 10 Hz | 28 字节 |
| 74 | VFR_HUD |
平视显示器数据(空速、地速、高度等) | 4-10 Hz | 20 字节 |
| 105 | HIGHRES_IMU |
高分辨率 IMU 数据 | 10-50 Hz | 62 字节 |
| 109 | RADIO_STATUS |
无线电台状态 | 1 Hz | 9 字节 |
G.3 GPS 与导航消息
| 消息 ID | 消息名称 | 说明 | 默认频率 | 数据载荷大小 |
|---|---|---|---|---|
| 24 | GPS_RAW_INT |
GPS 原始数据(经纬高、速度、航向) | 5 Hz | 52 字节 |
| 25 | GPS_STATUS |
GPS 卫星状态详细信息 | 1 Hz | 101 字节 |
| 27 | GPS2_RAW |
第二 GPS 原始数据 | 5 Hz | 52 字节 |
| 26 | SCALED_IMU |
缩放后的 IMU 数据 | 10 Hz | 22 字节 |
| 36 | SERVO_OUTPUT_RAW |
舵机原始输出值 | 10 Hz | 42 字节 |
| 42 | MISSION_CURRENT |
当前任务航点索引 | 1 Hz | 2 字节 |
| 62 | NAV_CONTROLLER_OUTPUT |
导航控制器输出 | 5 Hz | 26 字节 |
| 63 | GLOBAL_POSITION_INT_COV |
全球位置(含协方差) | 5 Hz | 185 字节 |
G.4 遥控器与电机消息
| 消息 ID | 消息名称 | 说明 | 默认频率 | 数据载荷大小 |
|---|---|---|---|---|
| 65 | RC_CHANNELS |
遥控器通道数据(18通道) | 5-10 Hz | 42 字节 |
| 35 | RC_CHANNELS_RAW |
遥控器原始通道数据 | 5 Hz | 22 字节 |
| 37 | MISSION_REQUEST |
任务项请求 | 事件触发 | 4 字节 |
| 39 | MISSION_ITEM |
任务航点定义 | 事件触发 | 37 字节 |
| 40 | MISSION_ITEM_REACHED |
航点到达通知 | 事件触发 | 2 字节 |
| 41 | MISSION_ACK |
任务确认应答 | 事件触发 | 3 字节 |
| 89 | VFR_HUD |
视觉飞行规则 HUD 数据 | 5 Hz | 20 字节 |
G.5 命令与参数消息
| 消息 ID | 消息名称 | 说明 | 默认频率 | 数据载荷大小 |
|---|---|---|---|---|
| 76 | COMMAND_LONG |
长命令(通用命令接口) | 按需 | 33 字节 |
| 77 | COMMAND_ACK |
命令确认应答 | 事件触发 | 3 字节 |
| 20 | PARAM_REQUEST_READ |
请求读取单个参数 | 按需 | 20 字节 |
| 21 | PARAM_REQUEST_LIST |
请求读取全部参数列表 | 按需 | 2 字节 |
| 22 | PARAM_VALUE |
参数值响应 | 事件触发 | 25 字节 |
| 23 | PARAM_SET |
设置参数值 | 按需 | 23 字节 |
| 11 | SET_MODE |
设置飞行模式 | 按需 | 6 字节 |
| 400 | COMMAND_INT |
整数命令接口 | 按需 | 35 字节 |
G.6 电池与传感器消息
| 消息 ID | 消息名称 | 说明 | 默认频率 | 数据载荷大小 |
|---|---|---|---|---|
| 147 | BATTERY_STATUS |
电池状态(电压、电流、剩余容量) | 1 Hz | 42 字节 |
| 148 | AUTOPILOT_VERSION |
飞控固件版本信息 | 按需 | 78 字节 |
| 111 | TIMESYNC | 时间同步消息 | 1 Hz | 16 字节 |
| 116 | SCALED_IMU2 |
第二组 IMU 缩放数据 | 10 Hz | 22 字节 |
| 129 | SCALED_IMU3 |
第三组 IMU 缩放数据 | 10 Hz | 22 字节 |
| 245 | ESTIMATOR_STATUS |
状态估计器(EKF)状态 | 1 Hz | 57 字节 |
| 246 | WIND_COV |
风速估计值与协方差 | 1 Hz | 40 字节 |
G.7 常用 MAVLink 命令 (MAV_CMD)
| 命令 ID | 命令名称 | 说明 |
|---|---|---|
| 16 | NAV_WAYPOINT |
导航至航点 |
| 17 | NAV_LOITER_UNLIM |
无限期悬停 |
| 18 | NAV_LOITER_TURNS |
盘旋指定圈数 |
| 19 | NAV_LOITER_TIME |
悬停指定时间 |
| 20 | NAV_RETURN_TO_LAUNCH |
返航至起飞点 |
| 21 | NAV_LAND |
降落至指定坐标 |
| 22 | NAV_TAKEOFF |
起飞至指定高度 |
| 176 | DO_SET_MODE |
设置飞行模式 |
| 179 | DO_CHANGE_SPEED |
改变飞行速度 |
| 183 | DO_SET_HOME |
设置返航点 |
| 201 | DO_SET_ROI |
设置兴趣点(朝向目标) |
| 207 | DO_FENCE_ENABLE |
启用/禁用围栏 |
| 400 | PREFLIGHT_CALIBRATION |
执行飞行前校准 |
| 401 | PREFLIGHT_SET_SENSOR_OFFSETS |
设置传感器偏移 |
| 410 | PREFLIGHT_STORAGE |
保存参数至永久存储 |
| 519 | REQUEST_MESSAGE |
请求特定消息 |
| 520 | REQUEST_DATA_STREAM |
请求数据流 |
HROS2 常用命令行速查表
H.1 ROS2 节点与话题管理
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ros2 node list | ros2 node list |
列出所有活动节点 | ros2 node list |
| ros2 node info | ros2 node info 节点名 |
显示节点详细信息 | ros2 node info /mavros_node |
| ros2 topic list | ros2 topic list [-t] |
列出所有话题 | ros2 topic list -t |
| ros2 topic echo | ros2 topic echo 话题名 |
实时显示话题消息内容 | ros2 topic echo /mavros/state |
| ros2 topic info | ros2 topic info 话题名 |
显示话题详细信息 | ros2 topic info /mavros/imu/data |
| ros2 topic hz | ros2 topic hz 话题名 |
显示话题发布频率 | ros2 topic hz /mavros/imu/data |
| ros2 topic bw | ros2 topic bw 话题名 |
显示话题带宽占用 | ros2 topic bw /mavros/global_position/global |
| ros2 topic pub | ros2 topic pub 话题 类型 数据 |
手动发布消息到话题 | ros2 topic pub /cmd_vel geometry_msgs/Twist "{linear: {x: 1.0}}" |
H.2 ROS2 服务与参数管理
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ros2 service list | ros2 service list [-t] |
列出所有服务 | ros2 service list -t |
| ros2 service call | ros2 service call 服务名 类型 数据 |
调用服务 | ros2 service call /mavros/set_mode mavros_msgs/SetMode "{custom_mode: 'AUTO.TAKEOFF'}" |
| ros2 service info | ros2 service info 服务名 |
显示服务详细信息 | ros2 service info /mavros/cmd/arming |
| ros2 service type | ros2 service type 服务名 |
显示服务类型 | ros2 service type /mavros/cmd/command |
| ros2 param list | ros2 param list 节点名 |
列出节点参数 | ros2 param list /mavros_node |
| ros2 param get | ros2 param get 节点名 参数名 |
获取参数值 | ros2 param get /mavros_node fcu_url |
| ros2 param set | ros2 param set 节点名 参数名 值 |
设置参数值 | ros2 param set /mavros_node fcu_url "serial:///dev/ttyACM0:57600" |
| ros2 param dump | ros2 param dump 节点名 |
导出所有参数 | ros2 param dump /mavros_node |
H.3 ROS2 Launch 与包管理
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ros2 launch | ros2 launch 包名 启动文件 [参数] |
启动 Launch 文件 | ros2 launch mavros apm.launch fcu_url:=serial:///dev/ttyACM0 |
| ros2 run | ros2 run 包名 可执行文件 |
运行单个节点 | ros2 run mavros mavros_node |
| ros2 pkg list | ros2 pkg list |
列出所有已安装包 | ros2 pkg list |
| ros2 pkg prefix | ros2 pkg prefix 包名 |
显示包安装路径 | ros2 pkg prefix mavros |
| ros2 pkg executables | ros2 pkg executables 包名 |
列出包中的可执行文件 | ros2 pkg executables mavros |
H.4 colcon 构建命令
| 命令 | 语法 | 说明 |
|---|---|---|
| colcon build | colcon build |
构建所有包 |
| colcon build --packages-select | colcon build --packages-select 包名 |
仅构建指定包 |
| colcon build --packages-up-to | colcon build --packages-up-to 包名 |
构建指定包及其依赖 |
| colcon build --symlink-install | colcon build --symlink-install |
使用符号链接安装(开发模式) |
| colcon build --cmake-args | colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release |
传递 CMake 参数 |
| colcon build --parallel-workers | colcon build --parallel-workers 4 |
限制并行构建工作线程数 |
| colcon test | colcon test |
运行所有测试 |
| colcon test-result | colcon test-result --verbose |
查看测试结果 |
| colcon clean | colcon clean workspace |
清理构建目录 |
H.5 ROS2 Bag 与日志工具
| 命令 | 语法 | 说明 |
|---|---|---|
| ros2 bag record | ros2 bag record -a |
录制所有话题 |
| ros2 bag record | ros2 bag record /topic1 /topic2 |
录制指定话题 |
| ros2 bag record | ros2 bag record -o my_flight /mavros/imu/data /mavros/state |
指定输出目录和话题 |
| ros2 bag play | ros2 bag play |
回放录制数据 |
| ros2 bag play | ros2 bag play |
以2倍速回放 |
| ros2 bag info | ros2 bag info |
显示 bag 文件信息 |
| ros2 bag convert | ros2 bag convert -i 输入 -o 输出 -s 格式 |
转换 bag 格式 |
H.6 rviz2 与 rqt 工具命令
| 命令 | 说明 | 备注 |
|---|---|---|
| rviz2 | 启动 RViz2 三维可视化工具 | 可视化点云、TF、机器人模型 |
| rviz2 -d 配置文件 | 加载指定配置文件启动 RViz2 | rviz2 -d ~/drone.rviz |
| rqt_console | 查看 ROS2 日志控制台 | 过滤和查看节点日志消息 |
| rqt_graph | 显示节点与话题关系图 | 可视化通信拓扑结构 |
| rqt_tf_tree | 显示 TF 坐标变换树 | 可视化坐标变换关系 |
| rqt_plot | 绘制话题数据曲线图 | 实时监控数值变化 |
| rqt_reconfigure | 动态参数调整工具 | 在线修改节点参数 |
| rqt_image_view | 图像查看工具 | 查看摄像头或图传图像 |
| rqt_bag | Bag 文件查看工具 | 浏览和回放 bag 数据 |
I推荐配件清单(电调、电机、GPS、遥控器等)
I.1 电子调速器(ESC)推荐
| 品牌型号 | 电流额定值 | 固件协议 | 适用场景 |
|---|---|---|---|
| Hobbywing XRotor Micro 40A 4in1 | 40A (Burst 50A) | BLHeli_32 |
5寸竞速机 / 花飞 |
| Diatone MAMBA F55 55A 4in1 | 55A (Burst 65A) | BLHeli_32 |
5-7寸自由式 |
| T-Motor F55A Pro II 4in1 | 55A (Burst 70A) | BLHeli_32 |
7寸远航 / 竞速 |
| Flycolor X-Cross 60A 4in1 | 60A (Burst 75A) | AM32 / BLHeli_S |
5-7寸通用 |
| SpeedyBee BLS 50A 4in1 | 50A (Burst 60A) | BLHeli_S (可刷BLHeli32) |
入门5寸机 |
| Hobbywing XRotor 80A HV 4in1 | 80A (Burst 100A) | BLHeli_32 |
10寸大型多旋翼 |
| APD 80F3 | 80A (Burst 120A) | 开源固件 | 高性能竞速 |
| Aikon AK32 35A 4in1 | 35A (Burst 45A) | BLHeli_32 |
3-4寸微型机 |
I.2 电机推荐(按机架尺寸)
| 机架尺寸 | 品牌型号 | KV 值 | 推荐桨叶 | 适用电压 |
|---|---|---|---|---|
| 5 寸 | T-Motor Velox V2 2207 | 1750 KV / 2450 KV | 5043 / 5045 | 4S-6S |
| 5 寸 | Emax ECO II 2207 | 1700 KV / 2400 KV | 5043 / 5143 | 4S-6S |
| 5 寸 | iFlight Xing2 2207 | 1755 KV / 2455 KV | 5040 / 5043 | 4S-6S |
| 7 寸 | T-Motor Velox V2 2806.5 | 1300 KV / 1500 KV | 7035 / 7040 | 6S |
| 7 寸 | iFlight Xing2 2806.5 | 1300 KV / 1700 KV | 7035 / 7040 | 4S-6S |
| 10 寸 | T-Motor U15 II KV100 | 100 KV | 30寸碳纤桨 | 12S |
| 10 寸 | iFlight Xing 3106 | 480 KV | 1045 / 1050 | 6S-8S |
| 10 寸 | Gartt ML5010 | 340 KV | 26寸 / 28寸桨 | 12S |
I.3 GPS 模块推荐
| 品牌型号 | GNSS 芯片 | 定位精度 | 通道数 | 更新率 | 备注 |
|---|---|---|---|---|---|
| Matek M8Q-5883 | u-blox M8N |
2.5m CEP | 72ch | 10 Hz | 内置 HMC5883L 磁力计,性价比之选 |
| Holybro M9N GPS | u-blox M9N |
1.5m CEP | 92ch | 25 Hz | 四系统并发,定位更快更准 |
| Holybro M10Q GPS | u-blox M10 | 1.5m CEP | 92ch | 25 Hz | 最新 M10 芯片,低功耗 |
| CUAV C-RTK 9Ps | u-blox F9P |
0.01m+1ppm (RTK) | 184ch | 20 Hz | RTK 厘米级定位,测绘级精度 |
| Holybro H-RTK F9P | u-blox F9P |
0.01m+1ppm (RTK) | 184ch | 20 Hz | RTK 方案,配合基站使用 |
| Beitian BN-220 | u-blox M8N |
2.5m CEP | 72ch | 10 Hz | 超小体积,适合微型机 |
I.4 遥控系统推荐
| 品牌型号 | 协议 | 通道数 | 延迟 | 备注 |
|---|---|---|---|---|
| RadioMaster TX16S MKII | ELRS / 4in1 | 16 | 5ms (ELRS) | OpenTX/EdgeTX,彩色触摸屏 |
| RadioMaster Boxer | ELRS / 4in1 | 16 | 5ms (ELRS) | 紧凑设计,内置 ELRS |
| Jumper T-Pro V2 | ELRS | 16 | 5ms | 游戏手柄式,性价比高 |
| TBS Mambo | Crossfire | 12 | 10ms | TBS 旗舰,工业级品质 |
| Futaba 16IZ | FASSTest | 16 | 14ms | 传统航模遥控器,做工精良 |
| FrSky Horus X12S | ACCESS | 24 | 9ms | FrSky 旗舰,彩色触屏 |
I.5 电池推荐(按应用场景)
| 应用场景 | 规格 | 品牌推荐 | 容量 | 放电倍率 |
|---|---|---|---|---|
| 5寸竞速 4S | 4S 1550mAh | Tattu R-Line V5 | 1550 mAh | 150C |
| 5寸花飞 6S | 6S 1100mAh | Tattu R-Line V5 | 1100 mAh | 150C |
| 7寸远航 6S | 6S 4000mAh | CNHL Black Series | 4000 mAh | 100C |
| 7寸长航时 6S | 6S 5000mAh | Tattu Plus V2 | 5000 mAh | 75C |
| 10寸航拍 6S | 6S 10000mAh | Gens ace Bashing | 10000 mAh | 60C |
| 10寸工业 12S | 12S 16000mAh | Tattu Pro V2 | 16000 mAh | 25C |
| 微型机 2S | 2S 450mAh | BetaFPV | 450 mAh | 80C |
| 微型机 3S | 3S 650mAh | Gaoneng | 650 mAh | 95C |
I.6 螺旋桨推荐
| 机架尺寸 | 品牌型号 | 规格 | 材质 | 备注 |
|---|---|---|---|---|
| 5 寸 | Gemfan 51433 | 5.1×4.3×3 | PC 聚碳酸酯 | 竞速常用,耐用 |
| 5 寸 | HQProp Ethix S5 | 5.0×4.3×3 | PC | 花飞手感好,效率高 |
| 5 寸 | DAL Cyclone T5046C | 5.0×4.6×3 | PC 玻璃纤维 | 抓空力强 |
| 7 寸 | Gemfan 7040 | 7.0×4.0×2 | PC | 远航效率高 |
| 7 寸 | HQProp 7X4X3 | 7.0×4.0×3 | PC | 三叶桨,推力大 |
| 10 寸 | APC 10×4.5 MR | 10×4.5 | 玻璃纤维尼龙 | 经典航拍桨 |
| 10 寸 | T-Motor 1045 | 10×4.5 | 碳纤 | 碳纤桨,刚性强 |
I.7 FPV 图传设备推荐
| 设备类型 | 品牌型号 | 规格参数 | 备注 |
|---|---|---|---|
| 数字图传 | DJI O3 Air Unit | 1080p/100fps, 4K录制 | 目前最清晰的数字图传 |
| 数字图传 | Walksnail Avatar HD | 1080p/100fps | DJI替代方案,性价比高 |
| 数字图传 | HDZero Race V3 | 1080p/60fps | 零延迟数字图传 |
| 模拟图传 | Rush Tank Mini | 25-800mW, 5.8GHz | 经典模拟图传 |
| 模拟图传 | TBS Unify Pro32 | 25-1600mW, 5.8GHz | 高端模拟图传 |
| FPV 摄像头 | Caddx Ratel 2 | 1200TVL, 1.8mm | 模拟摄像头,低延迟 |
| FPV 摄像头 | DJI O3 Camera | 4K, 155° FOV | 数字图传配套 |
| FPV 眼镜 | DJI Goggles 2 | 1080p, OLED | 配合 DJI O3 使用 |
| FPV 眼镜 | FatShark Dominator HD | 1080p | 支持多协议 |
| FPV 眼镜 | Skyzone SKY04X | 1280×960, OLED | 模拟/数字双模 |
J安全飞行规范与法规提示
J.1 中国民航局(CAAC)无人机法规概要
根据《无人驾驶航空器飞行管理暂行条例》(2024年1月1日起施行),中国对无人机实行分类管理:
| 无人机类别 | 空机重量 | 最大起飞重量 | 最大飞行速度 | 管理要求 |
|---|---|---|---|---|
| 微型 | ≤ 0.25 kg | ≤ 0.25 kg | ≤ 40 km/h | 免登记,限高50米 |
| 轻型 | ≤ 4 kg | ≤ 7 kg | ≤ 100 km/h | 需实名登记,限高120米 |
| 小型 | ≤ 15 kg | ≤ 25 kg | ≤ 120 km/h | 需实名登记+适飞空域 |
| 中型 | ≤ 50 kg | ≤ 150 kg | — | 需适航证+驾驶执照 |
| 大型 | 50 kg | 150 kg | — | 需适航证+驾驶执照+审批 |
J.2 实名登记要求
| 项目 | 要求说明 |
|---|---|
| 登记平台 | 中国民用航空局无人驾驶航空器一体化综合监管服务平台(UOM) |
| 登记网址 | https://uom.caac.gov.cn |
| 适用对象 | 轻型、小型、中型、大型民用无人机 |
| 登记信息 | 所有人姓名/名称、证件号码、联系方式、无人机型号及序列号 |
| 登记标志 | 系统生成登记编号,需粘贴于机身明显位置 |
| 登记费用 | 免费 |
| 有效期 | 登记信息变更时需及时更新 |
| 处罚规定 | 未登记飞行可处 200 元以下罚款 |
J.3 禁飞区与限飞区
| 区域类型 | 范围说明 | 限制内容 |
|---|---|---|
| 机场净空保护区 | 机场跑道中心线两侧各 10 km、跑道端外 20 km | 完全禁飞 |
| 军事禁区 | 军事管理区、国防设施周边 | 完全禁飞 |
| 核设施 | 核电站等设施周边 30 km | 完全禁飞 |
| 政府机关 | 省级以上政府机关、外国驻华使领馆上空 | 完全禁飞 |
| 重要目标 | 发电厂、变电站、加油站、铁路枢纽等 | 完全禁飞或限飞 |
| 人口密集区 | 大型活动现场、学校、医院等 | 轻型/微型限飞 |
| 临时禁飞区 | 重大活动、赛事期间临时划定 | 按通告执行 |
| 边境地区 | 国境线两侧一定范围 | 完全禁飞 |
J.4 飞行高度与距离限制
| 无人机类别 | 最大真高 | 视距内飞行距离 | 夜间飞行 | 备注 |
|---|---|---|---|---|
| 微型 | 50 米 | 50 米 | 允许 | 无需审批 |
| 轻型 | 120 米 | 500 米 | 需具备夜间识别灯 | 适飞空域内无需审批 |
| 小型 | 120 米 | 视距内 | 需申请 | 需在适飞空域内 |
| 中型/大型 | 按审批 | 按审批 | 按审批 | 需飞行计划审批 |
J.5 电池安全指南
| 安全事项 | 具体要求 | 说明 |
|---|---|---|
| 存储电压 | 单节 3.80-3.85V | 长期存放时应充至存储电压 |
| 存储温度 | 15-25°C | 避免高温和极低温环境 |
| 存储容器 | 防火袋或防爆箱 | 防止意外起火造成损失 |
| 充电环境 | 通风、远离易燃物 | 充电时须有人看管 |
| 充电器要求 | 使用专用平衡充电器 | 严禁使用不匹配的充电器 |
| 充电倍率 | ≤ 1C(推荐) | 快充会显著缩短电池寿命 |
| 放电截止电压 | 单节 ≥ 3.3V | 过放会造成不可逆损伤 |
| 运输要求 | 单节 ≤ 30% 电量 | 航空运输需符合 IATA 规定 |
| 报废处理 | 完全放电后回收 | 严禁直接丢弃,需送至专业回收点 |
| 鼓包处理 | 立即停止使用 | 鼓包电池有起火风险,需安全处置 |
| 短路防护 | 电极绝缘保护 | 存放和运输时电极需绝缘 |
| 串并联注意 | 不可混用不同品牌/容量/新旧电池 | 内阻不一致会导致危险 |
J.6 飞行前检查清单
| 检查项目 | 检查内容 | 状态 |
|---|---|---|
| 机架结构 | 机架无裂纹,螺丝无松动,机臂锁紧 | □ |
| 螺旋桨 | 桨叶无裂纹/缺口,安装方向正确,锁紧牢固 | □ |
| 电机 | 转动顺畅无异响,轴承无松动 | □ |
| 电调 | 连接牢固,电容完好,信号线正确 | □ |
| 电池 | 电压正常(满电),接口牢固,无鼓包 | □ |
| 电池固定 | 电池绑带/魔术贴固定可靠 | □ |
| 飞控 | 固件版本正确,传感器校准完成 | □ |
| GPS | 卫星数 ≥ 8 颗,HDOP 1.5 | □ |
| 指南针 | 校准完成,无磁干扰告警 | □ |
| 遥控器 | 电量充足,固件版本正确,天线展开 | □ |
| 通道检查 | 所有通道方向正确,行程校准完成 | □ |
| 失控保护 | 已配置 RTL / 降落等失控保护策略 | □ |
| 图传系统 | 图传画面清晰,频率/功率设置正确 | □ |
| FPV 眼镜 | 电量充足,画面清晰,频道匹配 | □ |
| 返航点 | Home 点已记录,返航高度设置合理 | □ |
| 地理围栏 | 围栏参数设置正确(如启用) | □ |
| 飞行模式 | 各飞行模式切换正常 | □ |
| 天气预报 | 风速 10 m/s,无降雨,能见度良好 | □ |
| 空域确认 | 确认飞行区域非禁飞区/限飞区 | □ |
| 周围人员 | 告知周围人员即将起飞,保持安全距离 | □ |
| 应急准备 | 灭火器/水桶备便,紧急联系人确认 | □ |
J.7 紧急情况处置流程
| 紧急情况 | 处置步骤 | 注意事项 |
|---|---|---|
| 遥控器信号丢失 | 1. 保持冷静 2. 等待失控保护自动触发(RTL) 3. 如未触发,尝试移动至信号恢复区域 4. 目视跟踪飞行器 | 预先确认失控保护设置正确 |
| 电池电压过低 | 1. 立即降低飞行高度 2. 以最短路径返回 3. 尽快降落 4. 降落后立即断电 | 不要尝试继续飞行 |
| GPS 信号丢失 | 1. 切换至手动/自稳模式 2. 依靠目视飞行 3. 尽快降落 4. 检查 GPS 天线和接线 | 起飞前确认 GPS 锁定良好 |
| 电机失效(单电机) | 1. 保持冷静 2. 尝试降低油门缓慢降落 3. 四轴单电机失效通常无法维持飞行 4. 六轴/八轴可继续飞行并缓慢降落 | 多轴飞行器有多余电机可补偿 |
| 图传信号丢失 | 1. 不要慌张 2. 飞行器仍可正常操控 3. 依赖目视飞行或仪表飞行 4. 尽快返回并降落 | 图传丢失不影响飞控 |
| 飞行器失控(姿态异常) | 1. 尝试切换至自稳模式 2. 降低油门 3. 执行紧急解锁(如有安全条件) 4. 远离人群 | 确保周围人员安全 |
| 飞行器飞入禁飞区 | 1. 立即操控返航 2. 记录飞行轨迹 3. 降落后检查原因 4. 必要时向管理部门报告 | 预先设置地理围栏 |
| 人员受伤 | 1. 立即降落并锁定电机 2. 对伤者进行急救 3. 拨打急救电话 120 4. 保护现场 5. 记录事故详情 | 人员安全永远是第一位 |
| 第三方财产损失 | 1. 立即降落并锁定 2. 保护现场 3. 拍照取证 4. 联系财产所有人 5. 报告保险公司 | 建议购买第三方责任险 |
J.8 飞行安全黄金法则
1. 永远将安全放在第一位:任何不确定的情况下,不要起飞。
2. 飞行前必须完成检查清单:不跳过任何一项检查。
3. 保持目视飞行:始终确保能够看到飞行器(VLOS)。
4. 远离人群和财产:选择开阔、人少的场地飞行。
5. 了解并遵守法规:在合法空域内飞行,不超高度限制。
6. 电池管理不可忽视:不过放、不过充、不存储满电电池。
7. 恶劣天气不飞行:大风、降雨、雷电天气严禁飞行。
8. 保持安全冗余:始终保留足够的电量用于返航和降落。
9. 持续学习与训练:新手应在模拟器中充分练习后再实飞。
10. 购买保险:建议购买无人机第三方责任保险,降低风险。
【提示】免责声明:本附录中的引脚定义、参数数值、法规信息均为编写时的参考数据,可能随固件版本更新或法规修订而变化。请以官方最新文档为准。飞行前请务必查阅最新的当地法规要求。

