1. 任务规划基础回顾:QGC地面站与PX4的通信架构、航点任务与任务队列
各位同学,咱们今天先不急着上高深技巧。做任务规划,地基得打牢。我见过不少开发者,一上来就写复杂航线,结果飞机在天上乱飘,最后发现是通信架构没搞懂。嗯,咱们先把基础捋一遍。
1.1 QGC与PX4的通信架构:谁在跟谁说话?
说白了,QGC(QGroundControl)是地面上的指挥官,PX4是飞机上的执行者。它们之间怎么沟通?靠的是MAVLink协议。你可以把MAVLink想象成一套标准军用手语——每个手势(消息)都有固定含义,双方一看就懂。
核心通信链路:
- QGC → PX4: 发送任务上传、起飞指令、参数修改等命令
- PX4 → QGC: 回传位置、姿态、电池电压、任务进度等状态
- 中间层: 串口(UART)、UDP、TCP,取决于你是用数传电台还是WiFi
我个人习惯把通信架构分成三层来看:
- 物理层: 硬件连接。USB线、数传模块、4G模块。别小看这层,我遇到过因为USB线太长导致信号衰减,任务上传一半断连的坑。
- 传输层: MAVLink协议封装。每个消息都有消息ID,比如
COMMAND_INT用于航点指令,MISSION_ITEM_INT用于单个航点数据。 - 应用层: QGC的界面操作和PX4的任务管理器。你点一下“上传航线”,QGC就把一堆航点打包成MAVLink消息队列,挨个发过去。
小技巧: 调试时打开QGC的MAVLink Inspector(分析器),你能看到每条消息的原始数据。我曾经靠这个抓到一个航点高度值被截断的bug——因为某个数传模块的波特率设错了,高位数据丢了。
1.2 航点任务:从A到B,没那么简单
航点任务(Waypoint Mission)是任务规划里最基础也最常用的模式。你在地图上点几个点,飞机就按顺序飞过去。但你真的理解每个航点背后发生了什么吗?
一个标准的航点任务,包含以下关键信息:
| 参数 | 含义 | 常见坑点 |
|---|---|---|
| 经纬度 | 航点的地理位置 | 坐标系搞混(WGS84 vs 本地坐标) |
| 相对高度 | 相对于起飞点或地面的高度 | 我见过有人设成绝对海拔,飞机直接往地下钻 |
| 航点类型 | 普通航点、起飞、降落、悬停等 | 类型设错,飞机可能不执行动作 |
| 停留时间 | 到达后悬停的秒数 | 设0秒就是飞过不停,设太短可能任务不稳定 |
| 偏航角 | 机头朝向 | 默认是朝向下一航点,但你可以手动指定 |
避坑指南: 我曾经在项目里遇到一个诡异问题——飞机飞到第三个航点后突然掉头往回飞。排查了半天,发现是第二个航点的“停留时间”设成了-1。PX4把负数解释为“无限等待”,任务队列卡住了。从那以后,我每次上传任务前都会用QGC的“检查列表”功能扫一遍参数。
1.3 任务队列:飞机是怎么记住路线的?
你想想看,QGC上传了10个航点,PX4怎么保证按顺序执行?靠的就是任务队列(Mission Queue)。
任务队列本质上是一个先进先出(FIFO)的列表。PX4飞控内部维护着这个队列,每完成一个航点,就把它从队列头部移除,然后指向下一个。
任务队列的状态机大致是这样的:
- 空闲状态: 队列为空,飞机待命
- 加载状态: QGC上传任务,PX4逐条校验并存入队列
- 执行状态: 飞机起飞后,按顺序取出航点执行
- 跳转/循环: 支持跳转到指定航点(DO_JUMP),或者循环执行
- 完成/中断: 所有航点执行完毕,或者收到RTL(返航)指令
关键点: 任务队列不是死板的。你可以通过MAVLink的MISSION_SET_CURRENT指令,在飞行中动态切换当前目标航点。我曾在测绘项目中用过这个功能——发现某个区域漏拍了,直接让飞机跳回那个航点重新飞一遍,不用全部重来。
这里有个容易忽略的细节:任务队列的索引从0开始。航点0通常是起飞点或起始点。如果你在QGC里看到“航点1”,它在代码里其实是索引0。别搞混了,否则跳转指令会指向错误的位置。
1.4 任务规划前的检查清单
每次做任务规划前,我都会在心里过一遍这个清单。你可以把它当成一个习惯:
- 通信确认: QGC是否显示“已连接”?心跳包是否正常?
- 坐标系检查: 航点高度是相对高度还是绝对高度?GPS星数够不够?
- 任务完整性: 有没有遗漏起飞点或降落点?航点之间距离是否合理?
- 安全冗余: 有没有设置地理围栏?失控保护(Failsafe)是否启用?
- 模拟验证: 先用SITL(软件在环仿真)跑一遍,别直接上真机。
我的习惯: 每次上传任务后,我会在QGC的“任务”面板里手动拖动时间轴,预览飞机飞行轨迹。如果轨迹出现奇怪的折线或高度突变,那肯定有问题。别偷懒,这一步能省下不少炸机的钱。