3. 航点数据结构:数据包结构与格式解析

航点任务规划,说白了就是给无人机画一条它要走的路线。但无人机不是人,它看不懂地图上的点。它需要一种结构化的数据——航点数据包。每个航点,都是一个包含位置、行为、时间等信息的“指令包”。

我刚开始接触这个领域时,以为航点就是经纬度加高度。结果第一次试飞,无人机到了点就悬停,既不拍照也不转弯,像个木头。后来我才明白,航点数据包里的每个字段,都有它的意义。

3.1 航点数据包的核心字段

一个标准的航点数据包,通常包含以下六个核心字段。我习惯把它们分成两类:位置类和行为类。

字段 类型 说明 典型范围/示例
经度 (Longitude) 浮点数 WGS-84 坐标系,东经为正 116.397428
纬度 (Latitude) 浮点数 WGS-84 坐标系,北纬为正 39.90923
高度 (Altitude) 浮点数 相对起飞点或海平面,单位米 50.0 (相对高度)
速度 (Speed) 浮点数 飞向下一个航点的速度,单位 m/s 5.0
悬停时间 (Hover Time) 整数/浮点数 到达该点后停留的秒数 3 (秒)
动作指令 (Action Command) 枚举/整数 到达该点后执行的动作 0:无动作, 1:拍照, 2:开始录像

关键点:高度字段最容易出问题。我见过不少新手把相对高度和绝对海拔搞混。无人机起飞后,如果使用相对高度,50米就是离起飞点50米;如果使用绝对海拔,50米就是海平面以上50米。在山区作业时,这个区别能决定你的飞机是撞山还是安全通过。

3.2 动作指令的细节

动作指令是航点数据包的“灵魂”。没有它,无人机就是个只会飞的搬运工。常见的动作指令包括:

  • 0 - 无动作:仅飞过该点,不停留。
  • 1 - 拍照:触发相机快门,常用于测绘。
  • 2 - 开始录像:到达该点后开始录制视频。
  • 3 - 停止录像:停止录制。
  • 4 - 旋转云台:调整相机角度。
  • 5 - 抛投:用于植保或物流无人机释放载荷。

我的习惯:在规划巡检航线时,我会在每一个需要拍摄的航点前插入一个“悬停+拍照”的组合。悬停时间设为1-2秒,确保飞机稳定后再拍照。这样拍出来的照片不会模糊,后期建模也省事。

3.3 JSON 格式解析

JSON 是目前最流行的航点数据交换格式。它轻量、易读,而且几乎所有编程语言都支持。一个典型的航点任务 JSON 文件长这样:

{
  "mission": {
    "name": "巡检任务-01",
    "waypoints": [
      {
        "latitude": 39.90923,
        "longitude": 116.397428,
        "altitude": 50.0,
        "speed": 5.0,
        "hover_time": 3,
        "action": 1
      },
      {
        "latitude": 39.90950,
        "longitude": 116.397800,
        "altitude": 60.0,
        "speed": 4.0,
        "hover_time": 0,
        "action": 0
      }
    ]
  }
}

你看,每个航点都是一个对象,放在 waypoints 数组里。解析时,我一般会先检查 mission 根节点,然后遍历数组。嗯,这里要注意:JSON 的键名大小写敏感。有些飞控系统要求全小写,有些用驼峰。我建议统一用小写加下划线,兼容性最好。

我曾经踩过的坑:有一次,我把经纬度的顺序写反了——先写了纬度,后写了经度。结果无人机直接往反方向飞了十几公里。从那以后,我写解析代码时都会加一个校验:经度值应该在 -180 到 180 之间,纬度在 -90 到 90 之间。如果发现异常,立刻报错,绝不执行。

3.4 KML 格式解析

KML 是 Google Earth 的标记语言,基于 XML。它的优势在于可视化——你可以在 Google Earth 里直接看到航线。但说实话,KML 的解析比 JSON 麻烦一些,因为 XML 的层级结构更复杂。

一个 KML 航点文件的核心结构:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>巡检任务-01</name>
    <Placemark>
      <name>WP-001</name>
      <Point>
        <coordinates>116.397428,39.90923,50.0</coordinates>
      </Point>
      <ExtendedData>
        <Data name="speed"><value>5.0</value></Data>
        <Data name="hover_time"><value>3</value></Data>
        <Data name="action"><value>1</value></Data>
      </ExtendedData>
    </Placemark>
  </Document>
</kml>

KML 里,经纬度和高度是放在 <coordinates> 标签里的,顺序是 经度,纬度,高度。这个顺序和 JSON 里常见的 [lat, lng] 正好相反。你想想看,如果不注意这个细节,解析出来的数据就是错的。

我的建议:如果你需要和 GIS 系统对接,KML 是首选。但如果只是做任务规划,我更喜欢 JSON。JSON 的解析速度快,而且结构清晰,不容易出错。我个人习惯在项目中同时支持两种格式,内部存储用 JSON,导出给第三方用 KML。

3.5 JSON 与 KML 的对比

对比维度 JSON KML
格式基础 轻量级文本格式 基于 XML 的标记语言
可读性 高,结构简洁 中等,标签较多
解析复杂度 低,直接映射为对象 较高,需处理命名空间
可视化支持 需额外工具 原生支持 Google Earth
扩展性 通过嵌套对象扩展 通过 ExtendedData 扩展
文件大小 较小 较大(含大量标签)

3.6 航点数据包结构图

下面这张图,是我自己总结的航点数据包结构。它把位置、行为、元数据三个层次分得很清楚。每次带新人时,我都会先让他们看这张图。

航点数据包结构图 航点数据包结构 航点数据包 位置信息 行为信息 元数据 经度 纬度 高度 速度 悬停时间 动作指令 航点名称 航点序号 转弯模式 说明: 1. 位置信息:决定无人机“飞到哪里”。 2. 行为信息:决定无人机“到了之后做什么”。 3. 元数据:辅助信息,用于任务管理和日志记录。 4. 实际应用中,元数据字段可选,但位置和行为字段必须完整。

3.7 实战中的格式选择

说了这么多,到底该用 JSON 还是 KML?我的经验是:

  • 如果你在写地面站软件,用 JSON。解析快,调试方便。
  • 如果你需要和测绘、GIS 部门协作,用 KML。他们习惯在 Google Earth 里看航线。
  • 如果你在做跨平台开发,两种都支持。我一般会写一个转换器,JSON 转 KML 和 KML 转 JSON 都做。

注意:无论你选择哪种格式,一定要在代码里做好数据校验。我见过太多因为格式问题导致的炸机事故。比如,KML 里 <coordinates> 标签内的空格和换行符,有些解析器会处理不当。我的做法是:先做一次字符串清洗,去掉多余的空格和换行,再按逗号分割。

好了,航点数据包的结构和格式就讲到这里。记住,数据是任务规划的基石。格式选对了,解析写对了,后面的工作才能顺利展开。