3. ArduPilot 基础知识:MAVLink 协议、参数系统、RC 输入与输出、日志系统

好,我们正式开始啃 ArduPilot 的四大基础模块。这四块东西,说白了就是飞控的「神经系统」和「记忆系统」。你搞懂了它们,后面写航点任务、调参、排错,心里就有底了。

我个人习惯把这四个模块串起来理解:MAVLink 是飞控跟外界对话的语言,参数系统是飞控的性格设定,RC 输入是遥控器给飞控下指令的通道,日志系统则是飞控的「黑匣子」。缺一个,你都玩不转。

ArduPilot 四大基础模块关系图 ArduPilot 飞控核心 MAVLink 协议 参数系统 RC 输入与输出 日志系统 四大模块协同工作,缺一不可

3.1 MAVLink 协议:飞控的「通用语言」

MAVLink 是什么?简单说,它就是飞控跟地面站、机载电脑、甚至另一架无人机之间通信的「普通话」。没有它,你的 Mission Planner 就收不到飞控的状态数据,也发不出指令。

目前主流版本是 MAVLink 1.0 和 MAVLink 2.0。ArduPilot 默认用 2.0,因为它支持签名加密和更大的消息负载。嗯,这里要注意:如果你在跟一些老设备通信,可能需要降级到 1.0。

核心消息类型(你一定会用到的)

  • HEARTBEAT:心跳包,每秒 1 次,告诉你飞控还活着,以及当前模式(比如 GUIDED、AUTO)。
  • GLOBAL_POSITION_INT:经纬度、海拔、地速。航点任务全靠它。
  • ATTITUDE:横滚、俯仰、偏航角度。调 PID 时盯这个。
  • MISSION_ITEM / MISSION_ACK:上传/下载航点时,地面站和飞控用这俩消息来回确认。

我曾经在项目里遇到过一个问题:地面站上传航点任务,飞控总是报错。查了半天,发现是 MAVLink 消息的 seq(序列号)没对齐。你想想看,飞控收到一个序列号错乱的消息,它根本不知道这是新任务还是旧数据。所以,写地面站程序时,序列号管理一定要严谨。

我的调试小技巧

用 Mission Planner 的「MAVLink Inspector」窗口,可以实时看到所有收发的消息。排查通信问题时,先看 HEARTBEAT 有没有,再看目标系统 ID 对不对。80% 的通信问题都出在这两个地方。

3.2 参数系统:飞控的「性格设定」

ArduPilot 有上千个参数。从飞控的 PID 增益,到航点任务的转弯半径,再到传感器的校准值,全存在参数里。说白了,调参就是给飞控「做性格测试」。

参数存储在飞控的 EEPROM 中,掉电不丢失。你可以通过地面站、MAVLink 指令、甚至直接在 SD 卡里改 .param 文件来修改它们。

参数类别 示例参数 说明
系统参数 SYSID_THISMAV 飞控的 MAVLink 系统 ID,多机协同必设
任务参数 MIS_TOTAL 当前加载的航点总数,只读
PID 参数 ATC_RAT_RLL_P 横滚角速率 PID 的 P 增益
传感器参数 COMPASS_OFFS_X 磁力计 X 轴偏移量,校准后自动生成

我个人习惯,每次调参前先 用 Mission Planner 的「全部参数表」导出当前参数为 .param 文件。这样万一调崩了,一键恢复。我曾经有一次调 PID 调得太激进,飞控直接震荡炸机。还好有备份参数,换台飞控刷进去,继续干活。

避坑指南

千万不要在飞行中通过 MAVLink 修改参数!飞控在飞行时写 EEPROM 会占用 CPU 时间,可能导致控制循环卡顿。我见过有人在空中改 MOT_SPIN_ARM,结果电机瞬间停转……嗯,后果你懂的。

3.3 RC 输入与输出:遥控器与电机的桥梁

RC 输入,就是接收机把遥控器的摇杆信号传给飞控。RC 输出,是飞控把计算好的控制信号发给电调或舵机。这俩合起来,就是飞控的「手脚」。

ArduPilot 用 PWM 信号 来传递指令。标准范围是 1000~2000 微秒,中位值 1500。比如油门摇杆推到顶,飞控收到 2000;拉到底,收到 1000。

这里有个关键概念:RC 映射。飞控默认把接收机的第 1 通道映射为横滚,第 2 通道为俯仰,第 3 通道为油门,第 4 通道为偏航。但你可以通过 RC1_MIN、RC1_MAX、RC1_TRIM 等参数来调整每个通道的范围和中位值。

RC 输入与输出的典型流程

  1. 遥控器摇杆动作 → 接收机输出 PWM 信号
  2. 飞控读取 RC 输入通道值(如 RC1 = 1500)
  3. 飞控根据飞行模式(如 Stabilize)计算期望姿态
  4. 飞控通过 PID 控制器计算电机输出值
  5. 飞控将输出值映射为 PWM 信号,发送给电调
  6. 电机转速变化 → 无人机姿态改变

我记得刚入门时,总搞不清为什么遥控器推油门,电机没反应。后来发现是 RC3_MIN 设得太高,飞控认为摇杆在低位时油门还没到最低点。说白了,校准遥控器是第一步,千万别跳过。

检查 RC 输入的小技巧

在地面站的「遥控器校准」界面,拨动每个摇杆,看对应的通道值是否在 1000~2000 之间平滑变化。如果出现跳变或卡在某个值,大概率是接收机信号线接触不良,或者飞控的 RC 输入引脚虚焊。

3.4 日志系统:飞控的「黑匣子」

日志系统,是 ArduPilot 最强大的调试工具,没有之一。飞控会把所有传感器数据、控制输出、模式切换、错误事件,全部记录到 SD 卡上的 .bin 或 .log 文件里。

你想想看,飞机飞在天上,你只能通过数传看到有限的数据。一旦炸机,或者出现奇怪的抖动,日志就是你唯一的破案线索。

日志文件默认存储在 SD 卡的 APM/LOGS/ 目录下,文件名是 00000001.bin、00000002.bin 这样的递增编号。你可以通过 LOG_BACKEND_TYPE 参数选择存储方式(SD 卡、内部闪存、或 MAVLink 流)。

日志消息类型 消息名 记录内容
姿态数据 ATT 横滚、俯仰、偏航角度及角速度
GPS 数据 GPS 经纬度、海拔、地速、卫星颗数
RC 输入 RCIN 所有 RC 通道的原始 PWM 值
RC 输出 RCOU 所有电机/舵机的实际 PWM 输出值
模式切换 MODE 飞行模式变化的时间戳
错误事件 ERR 错误代码及子代码,如 EKF 故障、GPS 丢失

我曾经处理过一个案例:一架四轴在 AUTO 模式下执行航点任务,飞到第三个航点时突然侧翻炸机。从日志的 ERR 消息里,我看到一条 EKF 方差过大 的错误。再查 GPS 消息,发现那个时刻卫星颗数从 12 骤降到 3。原因找到了——GPS 信号被机身上的碳纤维结构遮挡了。后来我建议用户把 GPS 天线移到机臂末端,问题解决。

日志分析避坑

不要只看一个消息类型。比如炸机前 ATT 显示姿态异常,但原因可能是 GPS 数据跳变,也可能是 RCIN 信号干扰。交叉对比多个消息,才能还原真相。

嗯,这四个基础模块,就像飞控的「四根柱子」。MAVLink 负责沟通,参数系统负责配置,RC 负责操控,日志负责记录。你把这四块吃透了,后面学航点任务、调参优化,就会顺畅很多。