版本:V1.0 编制日期:2026-07-02 状态:初稿
一、背景与目标
1.1 背景
当前线索识别流程已能够将无人机AI识别到的图片、目标类别、识别时间、截图地址、经[坐标已隐藏]等信息写入线索表,并在线索管理中进行展示和处置。现有 device_detection_clues 表已新增 drone_real_time_info 字段,用于保存无人机实时信息,例如经[坐标已隐藏]角度、高度等。
在实际飞行识别过程中,仅保存识别图片和目标检测框还不足以判断物体的真实空间位置。无人机在识别时刻的经[坐标已隐藏]高度、飞行姿态、云台角度、相机变焦、时间戳等信息,需要与AI识别结果一并入库。后续后台线索管理才能根据识别图片、目标对象、无人机位置和姿态信息,判断物体大致位置,并支撑地图展示、核查定位和线索追溯。
本需求要求在无人机AI识别过程中实时获取无人机MQTT属性信息,并在生成线索时将该时刻的无人机实时信息写入数据库。
1.2 需求目标
| 目标编号 | 目标描述 | 优先级 |
|---|---|---|
| G1 | AI识别过程中实时获取无人机MQTT属性信息 | P0 |
| G2 | 识别到图片和目标后,将识别结果与同一时刻的无人机实时信息绑定入库 | P0 |
| G3 | 在线索表中保存无人机实时信息原始快照,保证后续可追溯、可复算 | P0 |
| G4 | 抽取关键无人机定位字段,支撑后台线索管理判断物体位置 | P0 |
| G5 | 保持现有线索管理流程不变,仅补充无人机实时信息展示与数据支撑 | P1 |
1.3 参考依据
- DJI 上云 API:Matrice 3D / 3TD 机场上云属性,参考地址:https://developer.dji.com/doc/cloud-api-tutorial/cn/api-reference/dock-to-cloud/mqtt/aircraft/m3d-properties.html
- MQTT实时数据样例:以本次提供的无人机属性消息JSON为准,包含
[坐标已隐藏]height、elevation、attitude_head、attitude_pitch、attitude_roll、gimbal_pitch、gimbal_yaw、zoom_factor、timestamp等字段。
二、当前问题
2.1 线索缺少识别时刻的无人机状态
当前线索中虽然有图片、缩略图、识别时间、线索来源、线索类型、线索经[坐标已隐藏]等字段,但对无人机实时状态保存不足。若只有图片和目标框,后续很难准确解释目标位置来自哪里,也难以复盘识别时无人机的视角、高度和云台角度。
2.2 目标位置判断缺少必要参数
无人机AI识别目标真实位置时,需要综合以下信息:
| 信息类别 | 关键字段 | 用途 |
|---|---|---|
| 无人机位置 | [坐标已隐藏]height、elevation | 判断拍摄点位置和高度 |
| 飞行姿态 | attitude_head、attitude_pitch、attitude_roll | 判断机头方向和姿态 |
| 云台姿态 | gimbal_pitch、gimbal_yaw、gimbal_roll | 判断相机视线方向 |
| 相机参数 | payload_index、zoom_factor、相机/镜头参数 | 判断画面视场范围 |
| 时间信息 | MQTT timestamp、识别时间 detect_time | 对齐识别结果与飞行状态 |
| 定位质量 | position_state.gps_number、quality、is_fixed、rtk_number | 判断定位可信度 |
2.3 数据追溯链条不完整
后续若出现线索位置偏差,需要能够回溯:
- AI识别到的原始图片
- 识别目标类别、置信度、检测框[坐标已隐藏]识别时刻无人机MQTT实时快照
- 计算线索位置时使用的关键无人机参数
因此,数据库需要同时保存“原始MQTT快照”和“关键结构化字段”。
三、需求范围
3.1 包含范围
- 在无人机AI识别服务运行过程中,接入无人机MQTT属性消息。
- 缓存每架无人机最新一帧实时属性信息。
- AI识别生成目标线索时,读取与识别时间最接近的无人机实时信息。
- 将无人机实时信息原样保存到线索表
drone_real_time_info字段。 - 从MQTT快照中抽取关键字段,用于线索经[坐标已隐藏]计算、后台展示和问题排查。
- 后台线索管理详情页展示无人机实时信息摘要。
3.2 不包含范围
- 不改变无人机飞控、航线执行、视频拉流逻辑。
- 不改变DJI上云API的消息格式。
- 不在本需求中实现复杂三维投影算法;若需要精确由像素点反算目标坐标,可继续沿用或扩展《AI识别目标经[坐标已隐藏]定位与线索管理需求文档》中的算法方案。
- 不强制前端列表展示全部MQTT字段,完整原始数据以详情/调试信息方式保留。
四、业务流程
4.1 总体流程
DJI上云API / 无人机MQTT属性消息
|
v
无人机实时信息订阅服务
|
v
按设备ID缓存最新MQTT快照
|
+-----------------------------+
|
AI视频/图片识别服务 |
| |
v |
识别到目标对象、生成截图/检测框 |
| |
v |
根据 device_id + detect_time 匹配无人机实时信息
|
v
生成线索记录并写入 device_detection_clues
|
v
后台线索管理展示图片、目标、位置、无人机实时信息
4.2 时序要求
| 场景 | 处理规则 |
|---|---|
| MQTT消息先到,AI识别后到 | 缓存最新MQTT快照,AI识别生成线索时读取识别时间前后2秒内最近的一条快照 |
| AI识别先生成,MQTT短时未更新 | 查询识别时间前后2秒内最近的一条有效MQTT快照,允许存在自然时间偏差 |
| 2秒窗口内未匹配到MQTT快照 | 线索仍可入库,但标记 drone_info_status=timeout 或 missing,并在详情中提示未匹配到有效无人机实时信息 |
| 同一架无人机多路相机/载荷 | 使用 payload_index 进行载荷匹配,优先选择与识别视频源一致的相机信息 |
无人机MQTT属性消息约每2秒上报一次,因此系统不要求AI识别时间与MQTT时间绝对一致。线索生成时只需匹配识别时间前后2秒内最近的一条MQTT快照,并记录 drone_info_delay_ms 用于后续追溯和问题排查。
五、功能需求
5.1 MQTT实时信息订阅
| 需求编号 | 需求描述 | 详细说明 |
|---|---|---|
| F01 | 订阅无人机属性消息 | 根据DJI上云API接入无人机属性Topic,实时接收设备属性 |
| F02 | 解析MQTT消息 | 解析 bid、tid、timestamp、gateway、data 等字段 |
| F03 | 按设备缓存最新快照 | 以无人机设备ID、网关、载荷编号为维度缓存最新一帧信息 |
| F04 | 记录消息接收时间 | 除MQTT自带 timestamp 外,服务端需记录 receive_time |
| F05 | 异常容错 | MQTT断连、字段缺失、JSON解析失败时记录日志,不阻断AI识别流程 |
5.2 AI识别过程绑定无人机实时信息
| 需求编号 | 需求描述 | 详细说明 |
|---|---|---|
| F06 | 识别结果携带设备标识 | AI识别服务生成结果时必须包含 device_id、task_id、识别时间、图片地址 |
| F07 | 匹配实时信息 | 后端根据 device_id + detect_time 获取最近的MQTT快照 |
| F08 | 保存原始快照 | 将匹配到的完整MQTT JSON保存到 device_detection_clues.drone_real_time_info |
| F09 | 抽取关键字段 | 从MQTT快照中抽取经[坐标已隐藏]高度、姿态、云台角度、定位质量等字段 |
| F10 | 标记匹配状态 | 保存匹配状态,区分正常、超时、缺失、解析失败 |
5.3 线索管理展示
| 需求编号 | 需求描述 | 详细说明 |
|---|---|---|
| F11 | 详情页展示无人机信息 | 在线索详情中展示识别时无人机经[坐标已隐藏]高度、航向、云台俯仰角、定位质量 |
| F12 | 支持原始信息查看 | 管理员或调试模式下可查看完整MQTT原始JSON |
| F13 | 地图定位支撑 | 后台地图打点优先使用线索目标经[坐标已隐藏]若目标经[坐标已隐藏]未计算成功,可参考无人机位置和姿态辅助排查 |
| F14 | 异常提示 | 当无人机信息缺失或超时时,详情页提示“未匹配到有效无人机实时信息” |
六、数据设计
6.1 现有线索表扩展
表名:device_detection_clues
截图中已新增字段:
| 字段名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
drone_real_time_info | text | 否 | 无人机实时信息原始JSON,例如经[坐标已隐藏]角度、高度等信息 |
该字段用于保存识别时刻匹配到的完整MQTT消息快照,建议保存为JSON字符串,内容不做裁剪,便于后续追溯和算法复算。
6.2 建议补充结构化字段
仅保存 drone_real_time_info 可以满足原始信息追溯,但后台查询、地图定位和统计筛选会不方便。建议同步增加以下结构化字段,或在数据库支持的情况下将 drone_real_time_info 改为 jsonb 并建立关键字段索引。
| 字段名 | 建议类型 | 说明 |
|---|---|---|
| `drone_[坐标已隐藏]7) | 识别时无人机[坐标已隐藏]对应MQTT `data.[坐标已隐藏] | |
| `drone_[坐标已隐藏],7) | 识别时无人机[坐标已隐藏]对应MQTT `data.[坐标已隐藏] | |
drone_height | decimal(10,3) | 识别时相对高度,对应MQTT data.height |
drone_elevation | decimal(10,3) | 识别时海拔/高程,对应MQTT data.elevation |
drone_attitude_head | decimal(10,3) | 飞行器航向角,对应MQTT data.attitude_head |
drone_attitude_pitch | decimal(10,3) | 飞行器俯仰角,对应MQTT data.attitude_pitch |
drone_attitude_roll | decimal(10,3) | 飞行器横滚角,对应MQTT data.attitude_roll |
gimbal_pitch | decimal(10,3) | 云台俯仰角,对应 data[payload_index].gimbal_pitch |
gimbal_yaw | decimal(10,3) | 云台偏航角,对应 data[payload_index].gimbal_yaw |
gimbal_roll | decimal(10,3) | 云台横滚角,对应 data[payload_index].gimbal_roll |
camera_zoom_factor | decimal(10,4) | 相机变焦倍数,对应 zoom_factor |
payload_index | varchar(50) | 载荷编号,例如 81-0-0 |
mqtt_timestamp | bigint | MQTT消息时间戳 |
mqtt_receive_time | timestamp | 服务端接收到MQTT消息的时间 |
drone_info_delay_ms | int | MQTT快照时间与AI识别时间差 |
drone_info_status | varchar(20) | 匹配状态:matched、timeout、missing、parse_failed |
gps_quality | int | 定位质量,对应 position_state.quality |
gps_number | int | GPS星数,对应 position_state.gps_number |
rtk_number | int | RTK星数,对应 position_state.rtk_number |
6.3 字段映射说明
| 入库字段 | MQTT来源 | 样例值 | 说明 |
|---|---|---|---|
drone_[坐标已隐藏]ude | 30.[银行卡已隐藏] | 无人机[坐标已隐藏] | |
drone_[坐标已隐藏]itude | 113.84906226241627 | 无人机[坐标已隐藏] | |
drone_height | data.height | 171.08468017578127 | 相对高度 |
drone_elevation | data.elevation | 156.1 | 高程 |
drone_attitude_head | data.attitude_head | 18.8 | 飞行器航向角 |
drone_attitude_pitch | data.attitude_pitch | -11.3 | 飞行器俯仰角 |
drone_attitude_roll | data.attitude_roll | -5.5 | 飞行器横滚角 |
gimbal_pitch | data["81-0-0"].gimbal_pitch | -45 | 云台俯仰角 |
gimbal_yaw | data["81-0-0"].gimbal_yaw | 18.[银行卡已隐藏] | 云台偏航角 |
gimbal_roll | data["81-0-0"].gimbal_roll | 0 | 云台横滚角 |
camera_zoom_factor | data["81-0-0"].zoom_factor 或 cameras[].zoom_factor | 0.5678 / 1 | 变焦信息 |
mqtt_timestamp | timestamp | 1782963164102 | MQTT消息时间戳 |
gateway | gateway | 7CTXN7600B0CCY | 网关 |
七、接口与同步方案
7.1 MQTT消息处理接口
系统内部新增无人机实时信息处理服务,职责如下:
| 模块 | 职责 |
|---|---|
| MQTT订阅模块 | 订阅DJI上云API无人机属性消息 |
| 消息解析模块 | 将原始JSON解析为统一对象 |
| 实时缓存模块 | 保存每架无人机最新实时快照 |
| 快照查询模块 | 提供按 device_id + detect_time 查询最近快照能力 |
| 线索写入模块 | 生成线索时写入原始快照和结构化字段 |
7.2 AI识别结果建议结构
AI识别服务向线索服务提交结果时,建议包含:
{
"task_id": "巡查任务ID",
"device_id": "无人机设备ID",
"model_id": "AI模型ID",
"detect_time": "2026-07-02 10:12:30.123",
"image_path": "/uploads/clues/xxx.jpg",
"thumbnail_path": "/uploads/clues/xxx_thumb.jpg",
"payload_index": "81-0-0",
"detections": [
{
"class_name": "疑似违建",
"confidence": 0.92,
"bbox": {
"x1": 320,
"y1": 240,
"x2": 580,
"y2": 460
}
}
]
}
7.3 线索写入逻辑
1. AI识别服务返回图片和目标对象
2. 线索服务读取 device_id、detect_time、payload_index
3. 查询无人机实时信息缓存或历史快照
4. 判断快照是否在识别时间前后2秒窗口内
5. 写入线索基础字段:图片、模型、目标类型、识别时间等
6. 写入无人机原始快照:drone_real_time_info
7. 写入结构化无人机字段:经[坐标已隐藏]高度、姿态、云台角度等
8. 若目标经[坐标已隐藏]计算成功,写入线索 [坐标已隐藏]
9. 若目标经[坐标已隐藏]未计算成功,保留无人机位置和状态用于后续复核
八、后台线索管理改造
8.1 列表页
列表页保持现有字段不变,可根据需要增加以下展示项:
| 展示项 | 说明 |
|---|---|
| 无人机信息状态 | 正常、超时、缺失 |
| 识别时高度 | 显示 drone_height |
| 识别时航向 | 显示 drone_attitude_head |
默认列表不建议展示过多无人机参数,避免影响线索管理主流程。
8.2 详情页
线索详情页新增“无人机实时信息”区块:
| 信息项 | 说明 |
|---|---|
| 无人机位置 | [坐标已隐藏][坐标已隐藏]高度、高程 |
| 飞行姿态 | 航向角、俯仰角、横滚角 |
| 云台姿态 | 云台俯仰角、偏航角、横滚角 |
| 相机信息 | 载荷编号、变焦倍数 |
| 定位质量 | GPS星数、RTK星数、定位质量 |
| 时间信息 | 识别时间、MQTT时间、时间差 |
| 原始快照 | 管理员可展开查看完整MQTT JSON |
8.3 地图定位
地图点位优先级如下:
- 优先使用AI目标计算后的 `[坐标已隐藏]作为线索目标位置。
- 如果目标经[坐标已隐藏]为空,但存在无人机实时位置,则可在详情中展示无人机拍摄点位置,并提示“目标位置待计算”。
- 如果无人机实时信息缺失,则线索仍展示图片和识别结果,但地图定位状态标记为“不完整”。
九、非功能需求
9.1 实时性
| 指标 | 要求 |
|---|---|
| MQTT消息处理延迟 | 单条消息解析与缓存不超过 1 秒 |
| AI识别绑定快照耗时 | 线索生成时查询无人机实时信息不超过 200ms |
| 有效快照匹配时间差 | 匹配识别时间前后2秒内最近的一条MQTT快照 |
9.2 稳定性
- MQTT断连不影响AI识别主流程。
- 无人机实时信息缺失时,线索仍正常入库。
- 原始MQTT JSON字段变化时,结构化字段解析失败不影响原始快照保存。
- 解析异常需要记录日志,便于排查字段格式变化。
9.3 数据安全
- MQTT消息中如包含设备序列号、电池序列号等敏感设备信息,后台默认不在普通页面展示。
- 原始JSON仅管理员或运维调试角色可查看。
- 内外网同步场景下,遵循现有数据交换和安全隔离机制。
十、验收标准
| 验收编号 | 验收项 | 验收标准 |
|---|---|---|
| A01 | MQTT实时信息接入 | 系统能持续接收并解析无人机属性消息 |
| A02 | 识别结果绑定 | AI识别生成线索时,能匹配到同一设备最近的无人机实时信息 |
| A03 | 原始快照入库 | device_detection_clues.drone_real_time_info 保存完整MQTT JSON |
| A04 | 结构化字段入库 | [坐标已隐藏][坐标已隐藏]高度、姿态、云台角度、时间戳等关键字段正确写入 |
| A05 | 超时处理 | MQTT快照超过有效窗口时,线索状态标记为 timeout,不阻断入库 |
| A06 | 后台展示 | 线索详情页能查看无人机位置、姿态、云台、定位质量等信息 |
| A07 | 地图定位 | 线索管理能根据目标经[坐标已隐藏]或无人机参考位置辅助判断物体位置 |
| A08 | 追溯复核 | 任一无人机AI线索可回溯图片、目标、识别时间和无人机MQTT快照 |
十一、待确认事项
- MQTT属性消息中用于匹配无人机设备的唯一字段需要确认:使用
device_id、gateway、tid、无人机SN,还是平台内部设备ID。 - AI识别服务当前是否已携带
payload_index,若未携带,需要确认视频源与载荷编号的映射方式。 device_detection_clues表是否允许继续增加结构化字段,或改用独立扩展表保存无人机实时信息。drone_real_time_info字段类型建议评估是否由text调整为 PostgreSQLjsonb,便于后续查询和索引。- 目标真实经[坐标已隐藏]计算是否本期实现。如果本期只保存无人机实时信息,则线索目标位置计算可作为下一阶段增强。
- MQTT属性消息约每2秒上报一次,本期按识别时间前后2秒内最近快照进行绑定;如现场上报频率发生变化,再同步调整匹配窗口。