文档库

视觉结果UART协议

ESP32-S3-CAM-Mini 产品与硬件、快速上手、视觉案例、接口与图传使用说明。
ESP32-S3-CAM-Mini 使用与开发手册

本章针对vision-demos默认输出的Gizmo VISION_RESULT v1。它是传感结果协议,不是NodeHexa动作协议。默认115200、8N1,GPIO1 TX、GPIO2 RX;当前主要主动发送,RX不提供通用参数下发接口。

帧头与CRC

固定35字节,所有多字节字段小端:

偏移长度内容
02A5 47
21版本01
31消息类型60(十六进制)
41header flags,当前00
52sequence,uint16
72payload长度24,即18 00
924结果载荷
332CRC16,小端

CRC多项式0x1021、初值0xFFFF、不反射、不最终异或,覆盖偏移2–32共31字节。不要把偏移0的帧头也纳入CRC。

24字节载荷

下面偏移相对payload开始位置,帧绝对偏移再加9:

偏移类型字段当前含义
0uint8source_id来源编号,默认1,可配置
1uint8result_type见后表
2uint16result_sequence与头部sequence相同
4uint32timestamp_ms当前实现为识别结束后读取的启动毫秒
8uint8confidence0–100,语义按算法
9uint8flagsdetected为05,未检测为06
10uint16age_ms当前填latency_ms,最大65535;不是完整采集到接收年龄
12int16x按任务解释
14int16y按任务解释
16int16w按任务解释
18int16h按任务解释
20int16id类别或内容散列
22int16aux附加结果

flags bit0为tracked,bit1为lost,bit2为相对坐标标记。统计任务沿用这个标记,但x/y实际是统计值,所以必须先按result_type/id解释字段。 接收端还应记录自己的接收时间并设置失效期限,不能仅靠age_ms判断结果是否新鲜。

result_type和id

result_typeid任务
0—None
11红、2黄、3绿、4蓝、5紫色块
2当前默认0巡线
3—Tag预留,当前未实现AprilTag
416位散列二维码
51 / 2 / 3运动 / 亮点 / 亮度统计
510 / 11 / 12 / 13 / 14人脸 / 行人 / 猫 / 狗 / 手部

框类中心x/y在−1000..1000,尺寸w/h按图像比例映射到0..2000。中心标度约为pixel*2000/(extent-1)-1000,尺寸约为size*2000/extent。图像左上为负,右下为正。结果基于已校正方向的画面。

巡线:x为加权横向偏差,y固定500,w为底部带暗点覆盖率标度,h=aux为斜率缩放;不是框的高,也不是精确航向角。亮度统计:x均值、y方差;不是位置。二维码id不能用作无碰撞唯一键。

接收端建议流程

  1. 搜索A5 47,收集完整头部并检查版本/类型/长度。
  2. 收满载荷和CRC,校验后才更新结果;错误帧丢弃并重新同步。
  3. 依据source/type/id选择解释器,检查tracked/lost。
  4. 记录接收时刻;只保留最新有效结果,处理序号回绕与设备复位。
  5. 目标丢失、结果过期或链路异常时让上层策略进入停止/等待,不沿用旧目标位置。

不要直接memcpy到未定义布局的C结构体,编译器填充和大小端可能不同。按字段解码,或使用带明确小端格式的工具。

校验一帧

源码tools/decode_vision_result.py接受一整帧十六进制文本:

下面是人工构造并经解析器校验的协议示例(不是实机抓包):source=1、色块、序号42、时间1000 ms、置信度87、已检测、x=−125、y=54、w=410、h=360、红色id=1、处理耗时12 ms。

python tools/decode_vision_result.py "A5 47 01 60 00 2A 00 18 00 01 01 2A 00 E8 03 00 00 57 05 0C 00 83 FF 36 00 9A 01 68 01 01 00 00 00 9C D9"

预期输出tracked=true、lost=false、id=1。工具会检查长度、帧头、版本和CRC,并输出JSON;不是实时串口监听程序。实际调试时把示例替换为抓到的完整35字节帧。默认USB日志不输出逐帧结果,启用Debug日志后可观察;二维码原文通过Info日志输出。

视觉结果UART协议 | 瑷琟灵 AIVLE