2. 遥测数据基础

遥测数据分析的第一步不是打开软件画曲线,而是先弄清楚“数据从哪来、是什么、怎么传、长什么样”。无人系统的遥测数据并非单一来源,它同时包含飞行/行驶状态、导航定位、动力能源、任务载荷、链路通信和健康管理等多类信息。只有先建立参数分类、采集链路、协议与格式的整体认知,后续的解析、告警和故障定位才有可靠基础。

一、遥测参数分类:按物理意义与用途划分

工程上通常按“参数域”对遥测量分类,便于组织采集、编帧和告警。常见分类如下:

  • 飞行/运动状态类:姿态角(滚转、俯仰、偏航)、角速率、三轴加速度、空速/地速、高度、升降速率。这类参数直接反映平台是否处于可控状态。
  • 导航定位类:经纬度、海拔、GNSS 定位质量(星数、HDOP)、航向、地速、位置解算状态。用于判断定位是否可信。
  • 动力与能源类:电池电压、电流、剩余电量、电机转速、油门/舵面输出、温度。用于评估续航与动力余量。
  • 任务载荷类:云台角度、相机状态、存储余量、载荷工作模式、目标跟踪状态。
  • 链路通信类:上行/下行信号强度(RSSI)、信噪比、丢包率、链路时延、遥控指令计数。
  • 健康管理类:各分系统自检结果、故障码、看门狗计数、CPU 占用率、传感器有效性标志。

分类的意义在于:不同参数域的采样率、量纲、告警阈值和判读方式差异很大。例如姿态角通常以度或弧度表示,采样率可达 50~200 Hz;而电池电压可能只有 1~10 Hz,但需要做趋势和阈值双重判断。若把不同域的参数混在同一张表里而不标注单位与频率,后续分析极易出错。

二、数据采集链路:从传感器到地面

无人系统遥测采集链路一般可抽象为“传感器 → 采集/转换 → 机载处理 → 组帧 → 无线传输 → 地面接收 → 解析入库”。以典型中小型无人机为例:IMU、GNSS、气压计、电流计等传感器通过 CAN、UART、I2C 或 SPI 接入飞控;飞控以固定周期采样并做滤波、融合,得到姿态、位置等估计量;随后按既定帧格式打包,经数传电台或图传链路下行;地面站接收后按协议解析,再写入日志或数据库。

这条链路中有几个关键点直接影响数据质量:采样周期决定时间分辨率;时间戳来源决定多源数据能否对齐;组帧顺序决定解析时字段偏移是否正确;传输丢包决定数据是否连续。实际排查中,很多“曲线跳变”并非传感器故障,而是时间戳错位或丢包后插值造成的。

无人系统遥测采集链路与参数域映射 传感器层 IMU / 陀螺 GNSS / 磁罗盘 气压 / 空速 电流 / 电压 载荷 / 健康状态 采集与机载处理 周期采样 CAN/UART/I2C/SPI 滤波与状态估计 姿态/位置融合 打时间戳 统一时基 按帧格式组包 帧头+序号+载荷+校验 无线传输 数传电台 图传 / 4G / 5G 卫星链路 关注:丢包、时延 地面接收与解析 接收缓冲 / 帧同步 协议解析(字段还原) 单位换算 / 量纲统一 入库 / 日志 / 告警 参数域:运动状态 · 导航定位 · 动力能源 · 任务载荷 · 链路通信 · 健康管理

三、常见遥测协议:MAVLink、自定义二进制与文本协议

无人系统中最常见的遥测协议是 MAVLink,它采用二进制帧结构,包含起始标志、载荷长度、序列号、系统 ID、组件 ID、消息 ID、载荷和校验字段。MAVLink 的优势是消息定义明确、字段紧凑、适合低带宽链路;缺点是必须依赖消息定义(XML/字典)才能正确解析,版本不匹配时字段偏移会错位。

除 MAVLink 外,工程中还常见两类协议:

  • 自定义二进制协议:厂商为特定机型设计,帧头、长度、命令字、数据区、校验和自行定义。解析时必须拿到协议文档,否则只能靠逆向猜测。
  • 文本协议:如 NMEA 0183(GNSS 常用)、部分调试串口输出。可读性好,但带宽效率低,适合低速参数。

以 MAVLink 的 ATTITUDE 消息为例,其载荷中依次包含时间戳、滚转、俯仰、偏航、滚转速率、俯仰速率、偏航速率等字段,均为 IEEE 754 单精度浮点。解析时若把字段顺序读错,姿态角就会变成角速率,曲线形态完全改变。因此协议解析的第一原则是:先确认消息 ID 与字段定义,再按字节偏移逐字段读取。

四、数据格式解析:从原始字节到可用参数

地面收到的一帧数据本质是字节序列。解析过程通常包括:帧同步(找帧头)、长度校验、校验和验证、按字段定义提取原始值、量纲换算、时间戳对齐、写入结构化记录。下面给出一段简化的 Python 示例,演示如何按固定偏移解析一帧自定义遥测数据。示例中的帧格式为:帧头 0xAA55(2 字节)、长度(1 字节)、序号(1 字节)、滚转角(float,4 字节)、俯仰角(float,4 字节)、电池电压(uint16,2 字节,单位 0.01 V)、校验和(1 字节,前面所有字节异或)。

import struct

def parse_frame(buf: bytes):
    # buf 为完整一帧,示例:AA 55 0E 01 3F 8C CC CD ...
    if len(buf) < 15 or buf[0] != 0xAA or buf[1] != 0x55:
        return None
    length = buf[2]
    seq = buf[3]
    roll = struct.unpack_from('<f', buf, 4)[0]      # 滚转角,弧度
    pitch = struct.unpack_from('<f', buf, 8)[0]     # 俯仰角,弧度
    volt_raw = struct.unpack_from('<H', buf, 12)[0]
    checksum = buf[14]
    calc = 0
    for b in buf[:14]:
        calc ^= b
    if calc != checksum:
        return None
    return {
        'seq': seq,
        'roll_deg': roll * 57.2958,
        'pitch_deg': pitch * 57.2958,
        'battery_v': volt_raw * 0.01
    }

这段代码体现了几个关键点:帧头校验防止错位解析;长度检查防止越界;校验和判断数据是否在传输中损坏;量纲换算把弧度转成度、把原始整数转成电压。实际工程中还会加入时间戳字段,并用单调时钟或 GPS 周内秒做多源对齐。

解析时建议先打印前若干帧的十六进制原始数据,与协议文档逐字段对照,确认偏移和字节序(大端/小端)无误后,再批量处理。字节序错误是遥测解析中最常见的问题之一。

五、参数、协议与格式的对应关系

把三者串起来看:参数分类决定“采什么”,采集链路决定“怎么采和怎么传”,协议与格式决定“怎么解”。例如电池电压属于动力能源类,采样率低但需要趋势判断;它可能通过自定义二进制帧传输,字段为 uint16、单位 0.01 V;解析后得到浮点电压值,再与阈值比较触发告警。若协议解析错误,电压可能被读成电流或温度,告警逻辑就会完全失效。

参数域典型参数常见采样率常见传输/格式
运动状态姿态角、角速率、加速度50~200 HzMAVLink / 自定义二进制
导航定位经纬度、高度、HDOP5~20 HzMAVLink / NMEA
动力能源电压、电流、剩余电量1~10 Hz自定义二进制
链路通信RSSI、丢包率、时延1~5 Hz自定义二进制 / 文本
健康管理故障码、自检状态事件触发MAVLink / 自定义二进制

掌握以上基础后,面对一段陌生遥测日志,可以按“先分类、再找链路、后对协议、最后解析字段”的顺序推进。这样既能避免盲目猜测,也能在出现异常时快速定位是采集端、传输端还是解析端的问题。