120、地面站通信:QGroundControl与Mission Planner
飞控算法从入门到精通 · 120 · 地面站通信:QGroundControl与Mission Planner
一、一次深夜调试的教训
凌晨两点,四轴在试飞场悬停三分钟后突然失控,日志显示心跳包丢失,地面站曲线在断连前最后一秒跳出一个诡异的“MAVLink CRC mismatch”。我盯着Mission Planner的终端窗口,发现串口缓冲区溢出计数已经飙到47。这不是第一次被地面站通信坑了——那次之后我花了整整一周,把QGC和MP的通信协议栈从应用层扒到物理层,才真正搞明白这两个地面站到底在怎么跟飞控“说话”。
如果你也遇到过:飞控日志里明明有数据,地面站却显示“No Heartbeat”;或者Mission Planner能连上但QGC死活认不出;又或者同样的串口波特率,换一根USB线就断连——那这篇笔记就是为你写的。
二、两个地面站的“脾气”完全不同
先说结论:QGroundControl和Mission Planner虽然都走MAVLink协议,但它们在链路层、应用层乃至UI线程的处理逻辑上,差异大到能让你怀疑人生。
Mission Planner(MP)是Michael Oborne的经典作品,底层用C#写的,串口通信依赖System.IO.Ports。它的特点是“宽容”——哪怕你飞控发的MAVLink报文格式有点歪,它也会尽量解析,甚至自动补全一些缺失字段。但宽容的代价是:当链路质量差时,MP会疯狂重试,导致CPU占用飙升,在老旧笔记本上直接卡死UI线
