[传感器] 【二哈识图人工智能视觉传感器】利用串口通信与二哈狗进行深入交流数据分析

许慧清   2021-12-15 22:37 楼主

今天重点来分享一下二哈识图视觉传感器的串口通信内容,通过此篇深入分析通信协议的内容以及如何利用MCU单片机来驯服这只二哈狗。

现在正式进入训狗内容:

0bef89765b8d34c4dea552d24b67444.png

通过串口助手上位机来与二哈进行数据通信

1639488513(1).jpg

                            官方提供的通信命令格式

这次分享内容依旧采用串口通信协议,首先根据官方提供的通信手册看到协议为0X55 0XAA 地址 数据长度 命令 数据 校验 这几部分组成,知道了这些东西我们就可以根据手册去进行深入分析其中的通信内容。

 

ae28c7276beece8dbc6f700636c04dc.png

上位机或单片机通过发送此指令给二哈传感器,请求读取当前学习到的所有方框图形数据。

 

74d29a0f58a34b6c332f57792162a13.png

这条指令是二哈传感器返回给设备端的数据,包括识别到的图形方框数量和自学习图片的数量以及当前识别到的图片。

 

6be74f958715bea97ea1c3072a10fbf.png

此指令是二哈当前识别到的图形数据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 编辑

回复评论 (3)

有时感觉根据手册去进行分析通信内容觉得很难,跟着楼主学习

点赞  2021-12-16 07:30
引用: Jacktang 发表于 2021-12-16 07:30 有时感觉根据手册去进行分析通信内容觉得很难,跟着楼主学习

通信协议都是有规律可循的,找到规律就可以举一反三了。

点赞  2021-12-16 08:33

写的非常详细,楼主可否排版的时候能够更加清晰明了?

没有什么不可以,我就是我,不一样的烟火! 
点赞  2021-12-16 15:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复