3. 航点数据结构:定义、动作与属性
航点,说白了就是无人机在三维空间里的一个「打卡点」。你告诉它去哪、怎么去、到了干什么。我刚开始做航线规划时,总觉得航点不就是经纬度加高度嘛,后来踩了不少坑才明白——一个完整的航点数据结构,远比想象中复杂。
今天咱们就把航点拆开来看。它主要由三部分组成:航点定义(位置与速度)、航点动作(到了之后干什么)、航点属性(怎么飞过去)。
核心观点:航点不是孤立的位置点,而是一个「位置 + 行为 + 飞行策略」的复合数据包。理解这一点,你才能写出稳定可靠的航线任务。
3.1 航点定义:位置与速度
航点定义是基础中的基础。说白了,就是告诉无人机「你要去哪个点」。我见过不少新手,只填了经纬度就飞,结果无人机在天上乱飘——高度和速度没设对。
3.1.1 经纬度
这个不用多说,WGS-84坐标系,单位是度。精度一般保留到小数点后6位,大约0.1米的误差。嗯,这里要注意:经纬度必须合法,纬度范围[-90, 90],经度范围[-180, 180]。我曾经遇到过有人把经度写成181度,飞控直接报错。
3.1.2 高度
高度是个容易出问题的地方。主要有两种模式:
- 相对高度:相对于起飞点的高度。比如起飞点海拔50米,你设相对高度100米,无人机实际飞在海拔150米。我建议测绘类任务用相对高度,方便统一管理。
- 绝对高度:基于海拔的高度。比如你直接设海拔200米,不管起飞点在哪。山区飞行时绝对高度更安全,能避免撞山。
注意:切换高度模式时一定要确认当前设置。我有个同事在高原地区用了相对高度,结果无人机贴着山脊飞,差点炸机。高度模式最好在航线文件头部统一声明,不要混用。
3.1.3 速度
速度定义的是无人机飞往这个航点时的巡航速度。单位一般是m/s。我个人习惯:
- 转弯前减速到3-5 m/s
- 直线段用8-12 m/s
- 拍照航点用2-3 m/s
你想想看,如果拍照点还用10 m/s冲过去,照片肯定糊成一片。
3.2 航点动作:到了之后干什么
航点动作是航点的「灵魂」。没有动作的航点,就是个路过点。我早期做植保航线时,就靠动作来控制喷洒开关。
3.2.1 悬停
无人机到达航点后保持位置悬停,持续指定时间。单位是秒。悬停常用于:
- 等待指令
- 稳定姿态后再拍照
- 多机协同时的同步点
我曾经在电力巡检中设了5秒悬停,就是为了让云台稳定下来再拍绝缘子。效果很好。
3.2.2 拍照
触发相机快门。这里有个细节:拍照动作通常和悬停配合使用。先悬停1-2秒,再拍照,能有效减少运动模糊。
拍照参数一般包括:
| 参数 | 说明 | 建议值 |
|---|---|---|
| 拍照模式 | 单拍 / 连拍 / 定时拍 | 测绘用定时拍 |
| 悬停时间 | 拍照前稳定时间 | 1-3秒 |
| 照片格式 | JPEG / RAW / JPEG+RAW | 测绘用RAW |
3.2.3 舵机/云台控制
这个动作比较高级。你可以控制:
- 云台俯仰:调整相机角度
- 舵机角度:比如投掷器、喷洒阀门
- 负载开关:打开或关闭挂载设备
经验之谈:舵机动作最好在悬停状态下执行。我曾经在飞行中直接触发舵机,结果无人机姿态突变,差点失控。先悬停,再动作,这是铁律。
3.3 航点属性:怎么飞过去
航点属性决定了无人机如何到达这个航点。很多人只关注位置和动作,忽略了属性,结果航线飞得又抖又费电。
3.3.1 转弯半径
无人机从一个航点飞向下一个航点时,不会走直角。它会提前转弯。转弯半径就是控制这个「提前量」的。
- 半径越大:航线越平滑,速度损失小,但会偏离直线路径
- 半径越小:航线越贴近规划路径,但速度会降低,姿态变化大
我一般这样设:
- 测绘航线:半径3-5米,保证覆盖均匀
- 巡检航线:半径1-2米,精确贴近目标
- 高速航线:半径8-10米,减少能量损耗
3.3.2 航向模式
这个属性很多人搞混。它控制的是无人机机头朝向。常见模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 自动 | 机头始终指向下一个航点 | 通用飞行 |
| 锁定 | 机头保持固定朝向 | 侧方拍摄、线缆巡检 |
| 自定义 | 指定绝对或相对角度 | 精准云台对位 |
举个例子:你在巡检高压线时,如果航向模式用「自动」,无人机会一直对着下一个塔飞,云台得不停调整。换成「锁定」模式,机头始终朝北,云台只需微调俯仰,画面稳定多了。
3.3.3 到达容忍度
这个属性很多人不知道。它定义了「无人机离航点多近就算到达了」。默认一般是0.5米。但在某些场景下:
- 大风天:容忍度可以放宽到1-2米,否则无人机永远到不了
- 精准悬停:容忍度设到0.2米,但会消耗更多电量
避坑指南:我曾经在山区做航线测试,风很大,容忍度设了0.3米。结果无人机在每个航点都来回调整,飞了20分钟就没电了。后来改成1.5米,任务顺利完成。容忍度不是越小越好,要结合实际环境。
3.4 完整航点数据结构示例
说了这么多,咱们看一个实际的数据结构。以JSON格式为例:
{
"waypoint": {
"location": {
"lat": 39.9042,
"lon": 116.4074,
"altitude": {
"value": 100.0,
"type": "relative" // relative 或 absolute
}
},
"speed": 8.0, // m/s
"action": {
"type": "photo", // hover / photo / servo
"hover_time": 2.0, // 悬停秒数
"servo_angle": null, // 舵机角度,非舵机动作时为null
"photo_params": {
"mode": "single",
"format": "jpeg"
}
},
"properties": {
"turn_radius": 3.0, // 转弯半径,米
"heading_mode": "auto", // auto / lock / custom
"heading_angle": null, // 自定义航向角度
"arrival_tolerance": 0.5 // 到达容忍度,米
}
}
}
你看,一个完整的航点,包含了位置、速度、动作、属性四大块。缺了任何一块,航线都可能出问题。
我的习惯:每次写航线文件前,先画一个航点属性矩阵。横轴是航点序号,纵轴是动作和属性。这样一眼就能看出哪些航点需要特殊处理,避免遗漏。
好了,航点数据结构就讲到这里。记住:定义是基础,动作是功能,属性是优化。三者配合好了,你的航线才能飞得稳、拍得清、跑得远。