今天重点来分享一下二哈识图视觉传感器的串口通信内容,通过此篇深入分析通信协议的内容以及如何利用MCU单片机来驯服这只二哈狗。
现在正式进入训狗内容:
通过串口助手上位机来与二哈进行数据通信
官方提供的通信命令格式
这次分享内容依旧采用串口通信协议,首先根据官方提供的通信手册看到协议为0X55 0XAA 地址 数据长度 命令 数据 校验 这几部分组成,知道了这些东西我们就可以根据手册去进行深入分析其中的通信内容。
上位机或单片机通过发送此指令给二哈传感器,请求读取当前学习到的所有方框图形数据。
这条指令是二哈传感器返回给设备端的数据,包括识别到的图形方框数量和自学习图片的数量以及当前识别到的图片。
此指令是二哈当前识别到的图形数据XY坐标和方框图的尺寸以及图形ID名称。
上面三张图片是官方手册里的协议语句,第一张图是外界设备(外界设备可以是上位机串口助手或者单片机都可以)通过发送0X55 0XAA 0X11 0X00 0X24 0X34 这条语句给二哈传感器来读取二哈当前识别到的图形内容。根据协议内容当二哈检测到设备像他发起数据请求后,二哈根据协议内容返回给设备端当前识别到的数据,通过上面串口助手图片里的串口接收信息我们看到接收到三组数据,每组数据两条指令,下面我将介绍返回的数据和解析具体内容信息。
第一组返回信息是55 AA 11 0A 29 01 00 03 00 75 2C 00 00 00 00 E8和55 AA 11 0A 2A 7C 00 54 00 53 00 70 00 01 00 D8 ,根据手册看到第一条指令55 AA 11 0A 29这些都是规定好的协议格式,后面的这些数据01 00 03 00 75 2C 00 00 00 00 E8这些具体表示内容01 00表示识别到一个方框图数据01为低字节00为高字节,03 00 表示为二哈总共学习到3种方框图形数据,75 2C表示当前摄像头识别到的图形数据帧号,后面的00 00 00 00 为预留接口,最后一位 E8为数据校验位。 第二条数据55 AA 11 0A 2A 也是数据格式后面的7C 00 54 00 53 00 70 00 01 00 D8中7C 00 54 00意思是识别到的图形在屏幕中的XY坐标轴,53 00 70 00 表示是识别到方框的大小宽度。01 00表示识别到的是那个学习过的图形ID号。通过这条数据信息可以知道采集到了那个学习过的图形,采集的内容在屏幕中那个位置以及采集到图形的方框尺寸还有采集到ID这些信息内容。通过分析串口助手返回来的数据我们就可以知道二哈这双狗眼看到的的具体工作数据,上面串口助手是采集了学习过的三幅不同图形格式返回来的数据,通过数据01 02 03 这些ID数据可以确定是那个图形的信息被返回来的。
如果我们利用单片机与二哈进行串口通信,单片机每隔100MS就请求二哈发送一下当前识别到的图形数据,然后单片机根据二哈反馈回来的图形信息经过判断在执行下一步操作,这样就可以实现一个实时的反馈机制。举例:当二哈传感器识别到前方LED灯为绿色时反馈给单片机颜色信息,单片机接收到信息后可以控制小车电机正常前进行驶,当前方LED变成红色后,二哈在传输给单片机控制器信息,单片机接收到前方LED灯变为红色的数据后,单片机控制小车电机停止。这样就可以简单实现通过二哈摄像头传感器识别一个LED灯的颜色控制小车前进停止的试验了。
好多功能可以做到举一反三的效果,二哈识别物体,人脸,巡线,动物,多种多样的识别可以呈现不同的实现效果,只有掌握了通信内容才能驯服这只二哈狗,后面的文章将实际利用单片机来驯服这条二哈狗。最后这篇文章深层次的分析了二哈通过串口反馈的数据内容进行解析,只有完全搞清楚通信的数据内容是代表意思才能做到用相同的语言来与这只二哈进行交流。
发现官方提供的协议文档只有英文版本对于我来说阅读有点费劲只能自己找软件翻译一遍。有兴趣的网友可以自己研究一下二哈视觉传感器的底层通信协议要做到不只会遛狗还要会训练狗。
HUSKYLENS 协议
0.5.1
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
1 字节 |
1 字节 |
1 字节 |
数据1~数据n |
1 字节 |
十六进制 |
功能 |
---|---|
0x55 |
标题 |
0xAA |
标题 2 |
0x11 |
地址 |
0x0A |
数据长度 |
0x2A |
命令为 0x2A |
0x2C |
数据[0] |
0x01 |
数据[1] |
0xC8 |
数据[2] |
0x00 |
数据[3] |
0x0A |
数据[4] |
0x00 |
数据[5] |
0x14 |
数据[6] |
0x00 |
数据[7] |
0x01 |
数据[8] |
0x00 |
数据[9] |
0x58 |
CheckSum、Sum all 和只使用低字节(0x258 的低字节 = 0x55 + 0xAA + 0x11 + 0x0A + 0x2A + 0x2C + 0x01 + 0xC8 + 0x00 + 0x0A + 0x00 + 0x00 + 0x04 + 0x04) |
ID |
方法 |
---|---|
1 |
检测到第一个学习项 |
2 |
检测到第二个学习项 |
XXX |
检测到第 XXX 个学习项 |
0 |
检测到项目但未学习,如灰色的未学习面孔块。 |
主机 |
哈士奇伦 |
---|---|
COMMAND_REQUEST_KNOCK===> |
|
|
<===COMMAND_RETURN_OK |
|
|
命令请求===> |
|
|
<=== COMMAND_RETURN_INFO |
|
<=== COMMAND_RETURN_BLOCK |
|
<=== COMMAND_RETURN_BLOCK |
|
<=== COMMAND_RETURN_ARROW |
|
|
COMMAND_REQUEST_BLOCKS====> |
|
|
<=== COMMAND_RETURN_INFO |
|
<=== COMMAND_RETURN_BLOCK |
|
<=== COMMAND_RETURN_BLOCK |
|
|
COMMAND_REQUEST_ARROWS====> |
|
|
<=== COMMAND_RETURN_INFO |
|
<=== COMMAND_RETURN_ARROW |
|
|
COMMAND_REQUEST_ALGORITHM===> |
|
|
<===COMMAND_RETURN_OK |
|
|
COMMAND_REQUEST_ALGORITHM===> |
|
COMMAND_REQUEST_ALGORITHM===> |
|
|
<===COMMAND_RETURN_BUSY |
|
<===COMMAND_RETURN_OK |
从 HUSKYLENS 请求所有方块和箭头。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x20 |
0x30 |
从 HUSKYLENS 请求所有块。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x21 |
0x31 |
从 HUSKYLENS 请求所有箭头。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x22 |
0x32 |
从 HUSKYLENS 请求所有学习块和箭头 (ID >=1)。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x23 |
0x33 |
从 HUSKYLENS 请求所有学习块 (ID >=1)。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x24 |
0x34 |
从 HUSKYLENS 请求所有学习箭头 (ID >=1)。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x25 |
0x35 |
从 HUSKYLENS 请求给定 ID(这里是 0x01)的所有块和箭头。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x26 |
0x01 0x00 |
0x39 |
数据详情:
数据 |
功能 |
---|---|
0x01 |
给定 ID,请参阅上面的ID 详细信息(1 的低字节 = 0x0001) |
0x00 |
给定 ID,请参阅上面的ID 详细信息(1 的高字节 = 0x0001) |
从 HUSKYLENS 请求给定 ID(这里是 0x01)的所有块。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x27 |
0x01 0x00 |
0x3A |
数据详情:
数据 |
功能 |
---|---|
0x01 |
给定 ID,请参阅上面的ID 详细信息(1 的低字节 = 0x0001) |
0x00 |
给定 ID,请参阅上面的ID 详细信息(1 的高字节 = 0x0001) |
从 HUSKYLENS 请求给定 ID(这里是 0x01)的所有箭头。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x28 |
0x01 0x00 |
0x3B |
数据详情:
数据 |
功能 |
---|---|
0x01 |
给定 ID,请参阅上面的ID 详细信息(1 的低字节 = 0x0001) |
0x00 |
给定 ID,请参阅上面的ID 详细信息(1 的高字节 = 0x0001) |
当 HUSKYLENS 接收到上述命令时,HUSKYLENS 会先返回此信息,然后返回箭头和方块。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x0A |
0x29 |
0x01 0x00 0x01 0x00 0x05 0x00 0x00 0x00 0x00 0x00 |
0x4A |
数据详情:
数据 |
功能 |
---|---|
0x01 |
来自 HUSKYLENS 的块和箭头的数量(低字节 1 = 0x0001) |
0x00 |
来自 HUSKYLENS 的块和箭头的数量(高字节 1 = 0x0001) |
0x01 |
HUSKYLENS 学习的 ID 数量(低字节 1 = 0x0001) |
0x00 |
HUSKYLENS 学习到的 ID 数量(高字节 1 = 0x0001) |
0x05 |
当前帧号(低字节 5 = 0x0005) |
0x00 |
当前帧号(高字节 5 = 0x0005) |
0x00 |
预订的 |
0x00 |
预订的 |
0x00 |
预订的 |
0x00 |
预订的 |
HUSKYLENS 返回信息后, HUSKYLENS 将返回这样的块:
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据
|
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x0A |
0x2A |
0x2C 0x01 0xC8 0x00 0x0A 0x00 0x14 0x00 0x01 0x00 |
0x58 |
数据详情:
十六进制 |
功能 |
---|---|
2C |
X 块中心(300 的低字节 = 0x012C,范围:0-319) |
01 |
X 块中心(300 的高字节 = 0x012C,范围:0-319) |
C8 |
Y 块中心(200 的低字节 = 0x00C8,范围:0-239) |
00 |
Y 块中心(200 的高字节 = 0x00C8,范围:0-239) |
0A |
块的宽度(低字节 10 = 0x000A,范围:0-319) |
00 |
块的宽度(高字节 10 = 0x000A,范围:0-319) |
14 |
块的高度(20 的低字节 = 0x0014,范围:0-239) |
00 |
块的高度(20 的高字节 = 0x0014,范围:0-239) |
01 |
ID,参见上面的ID 含义(低字节 1 = 0x0001) |
00 |
ID,参见上面的ID 含义(1 的高字节 = 0x0001) |
HUSKYLENS 返回 info 后,HUSKYLENS 会返回这样的箭头:
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x0A |
0x2B |
0x2C 0x01 0xC8 0x00 0x0A 0x00 0x14 0x00 0x01 0x00 |
0x5A |
数据详情:
数据 |
功能 |
---|---|
2C |
X 箭头原点(300 的低字节 = 0x012C,范围:0-319) |
01 |
X 箭头原点(300 的高字节 = 0x012C,范围:0-319) |
C8 |
Y 箭头原点(200 的低字节 = 0x00C8,范围:0-239) |
00 |
Y 箭头原点(高字节 200 = 0x00C8,范围:0-239) |
0A |
箭头的 X 目标(低字节 10 = 0x000A,范围:0-319) |
00 |
箭头的 X 目标(10 的高字节 = 0x000A,范围:0-319) |
14 |
Y 箭头目标(20 的低字节 = 0x0014,范围:0-239) |
00 |
Y 箭头目标(高字节 20 = 0x0014,范围:0-239) |
01 |
ID,参见上面的ID 含义(低字节 1 = 0x0001) |
00 |
ID,参见下面的ID 含义(1 的高字节 = 0x0001) |
用于与 HUSKYLENS 的测试连接。当 HUSKYLENS 收到此命令时,HUSKYLENS 将返回 COMMAND_RETURN_OK。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x2C |
0x3C |
当 HUSKYLENS 收到此命令时,HUSKYLENS 将根据数据更改算法。并将返回 COMMAND_RETURN_OK。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x2D |
0x01 0x00 |
0x40 |
数据详情:
数据 |
功能 |
---|---|
0x01 |
更改为 ALGORITHM_OBJECT_TRACKING(低字节 1 = 0x0001) |
0x00 |
更改为 ALGORITHM_OBJECT_TRACKING(高字节 1 = 0x0001) |
数据对应算法:
数据 |
算法 |
---|---|
0x00 0x00 |
ALGORITHM_FACE_RECOGNITION |
0x01 0x00 |
ALGORITHM_OBJECT_TRACKING |
0x02 0x00 |
ALGORITHM_OBJECT_RECOGNITION |
0x03 0x00 |
ALGORITHM_LINE_TRACKING |
0x04 0x00 |
ALGORITHM_COLOR_RECOGNITION |
0x05 0x00 |
ALGORITHM_TAG_RECOGNITION |
0x06 0x00 |
ALGORITHM_OBJECT_CLASSIFICATION |
HUSKYLENS 将返回 OK,如果 HUSKYLENS 收到 COMMAND_REQUEST_ALGORITHM、COMMAND_REQUEST_KNOCK。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x2E |
0x3E |
为学习对象设置自定义名称。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x07 |
0x2F |
0x01 0x05 0x54 0x45 0x53 0x54 0x00 |
0x8C |
数据详情: 名称:TEST
数据 |
功能 |
---|---|
0x01 |
给定对象的 ID |
0x05 |
名称长度 + 1 |
0x54 |
“T”的十六进制值 |
0x45 |
“E”的十六进制值 |
0x53 |
“S”的十六进制值 |
0x54 |
“T”的十六进制值 |
0x00 |
0 用于标记名称结尾的值 |
在 HuskyLens SD 卡上保存照片。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x30 |
0x40 |
保存当前的算法模型到SD卡中的以下文件格式“AlgorithimName_Backup_ FILENUM的.conf”
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x002 |
0x32 |
0x01 0x00 |
0x45 |
数据详细信息:FileNum:1 示例文件名:LineTracking_Backup_1.conf
数据 |
功能 |
---|---|
0x01 |
FileNum 的低字节 (1 = 0x0001) |
0x00 |
FileNum 的高字节 (1 = 0x0001) |
从 SD 卡加载模型文件到当前算法并刷新算法。加载的文件将是以下格式“AlgorithimName_Backup_ FileNum .conf”
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x33 |
0x01 0x00 |
0x46 |
数据详细信息:FileNum:1 示例文件名:LineTracking_Backup_1.conf
数据 |
功能 |
---|---|
0x01 |
FileNum 的低字节 (1 = 0x0001) |
0x00 |
FileNum 的高字节 (1 = 0x0001) |
在 HuskyLens UI 顶部放置一串文本(少于 20 个字符)。文本 (X,Y) 坐标的位置是文本框的左上角。
您一次最多可以在 UI 上拥有 10 个自定义文本,如果您继续添加文本,您将以循环方式替换之前的文本。例如,如果您输入 10 个文本,您将填充文本缓冲区。如果您随后插入一个新的文本对象,您将覆盖第一个文本位置 (textBuffer[0])。插入另一个新文本对象将覆盖第二个文本位置 (textBuffer[1])。
每个文本都由其 (X,y) 坐标唯一标识,因此您可以替换 (X,Y) 坐标处的文本字符串,而不是添加新的文本对象。例如,如果您在 (120,120) 处插入“TEST_1”,然后在 (120,120) 处提交“TEST_2”,则您会将字符串“TEST_1”替换为“TEST_2”并保持总文本计数为 1。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x0A |
0x34 |
0x06 0x00 0x78 0x78 0x54 0x45 0x53 0x54 0x5F 0x31 |
0x14 |
数据详细信息:文本:“TEST_1”坐标:(120,120)或(0x78,0x78)
数据 |
功能 |
---|---|
0x06 |
字符串长度(“TEST_1”) |
0x00 |
X Flag(如果X>=255,这个字节应该设置为0xFF) |
0x78 |
X 坐标(如果 X 标志为 0xFF,则该值应为 X % 255 ) |
0x78 |
Y坐标 |
0x54 |
“T”的十六进制值 |
0x45 |
“E”的十六进制值 |
0x53 |
“S”的十六进制值 |
0x54 |
“T”的十六进制值 |
0x5F |
“_”的十六进制值 |
0x31 |
“1”的十六进制值 |
从屏幕上清除和删除所有自定义 UI 文本。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x35 |
0x45 |
使用选定的ID在屏幕上了解当前识别的对象
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x36 |
0x01 0x00 |
0x49 |
数据详情:
数据 |
功能 |
---|---|
0x01 |
给定 ID,请参阅上面的ID 详细信息(1 的低字节 = 0x0001) |
0x00 |
给定 ID,请参阅上面的ID 详细信息(1 的高字节 = 0x0001) |
忘记当前运行算法的学习对象。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x37 |
0x47 |
将当前 UI 的屏幕截图保存到 HuskyLens SD 卡。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x39 |
0x49 |
检查您的 HuskyLens 是什么型号。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x3B |
0x4b |
如果是专业型号,IS_PRO 命令的返回值将发送 1(逻辑真),如果是标准型号,将发送 0(逻辑假)。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
数据 |
校验和 |
---|---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x02 |
0x3B |
0x01 0x00 |
0x4E |
数据详细信息:返回值 -> 1(专业模型)
数据 |
功能 |
---|---|
0x01 |
LOW 返回值字节 |
0x00 |
HIGH 返回值字节 |
如果发送多个命令而不等待确定,HUSKYLENS 将返回 Busy。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x3D |
0x4D |
HUSKYLENS 将返回需要 pro,如果向 huskylens 发送 pro only 命令。
标题 |
标题 2 |
地址 |
数据长度 |
命令 |
校验和 |
---|---|---|---|---|---|
0x55 |
0xAA |
0x11 |
0x00 |
0x3E |
0x4E |
本帖最后由 许慧清 于 2021-12-15 22:37 编辑
引用: Jacktang 发表于 2021-12-16 07:30 有时感觉根据手册去进行分析通信内容觉得很难,跟着楼主学习
通信协议都是有规律可循的,找到规律就可以举一反三了。