17413| 12
|
撸狗初体验 | 手把手教你上手 HuskyLens 哈士奇人工智能摄像头 |
!!!二哈的 Arduino 官方库已更新,请大家直接看官方 wiki 教程!!! 直接上视频听我 BB: 下面开始编故事…… 某个周末,走在去加班的路上,脚底突然被某个东西咯噔一下,抬脚一看,竟然是…… 捡起来一看…… 哈士奇!哈士奇!哈士奇! 竟然是 DF 还在预售的 HuskyLens 人工智能摄像头(中文名:哈士奇) ! 这个故事告诉我们:喜欢加班的创客,运气不会太差。 # HuskyLens 功能介绍 # HuskyLens 是什么? 这里简单截取官网介绍的一部分: HuskyLens 是一款简单易用的人工智能摄像头(视觉传感器),内置 6 种功能:人脸识别、物体追踪、物体识别、巡线追踪、颜色识别、标签(二维码)识别。仅需一个按键即可完成 AI 训练,摆脱繁琐的训练和复杂的视觉算法,让你更加专注于项目的构思和实现。 详细介绍,可以查看官网说明:https://www.dfrobot.com.cn/goods-2050.html 哈士奇官方介绍视频,请直接跳转 B 站: 用 3 个单词就可以概括 HuskyLens 的特性:Click、Learn & Play。 总之:简单、易用、真香! 这么香的工具,到底该怎么玩呢?请继续往下看。 注意:以下章节偏技术性,是对体验视频的文字性详细描述,会略微无聊,请收藏后慢慢阅读。 # HuskyLens 数据读取测试 # 由于 HuskyLens 目前还没有正式上市,所以关于它的资料非常少,DF 暂时也没有放出 HuskyLens 对应的函数库,更不用说在 Mind+ 等图形化编程工具中调用了。不过相信不久,我们就可以在 Mind+ 中看到它了,到那时,它的使用就会更加简单、更加小白了! 暂时我们只能根据它的通信协议,徒手来撸代码了。 HuskyLens 默认采用串口通信,当然可以在它的设置中改成 I2C 通信。默认的串口波特率为 57600 bps,格式为 8N1( 8 位数据位、无校验、1位停止位 ),默认通信地址为 0x11。本文中,我带领大家使用掌控板来读取 HuskyLens 的数据。 当然你也可以选择使用 Arduino、Raspberry Pi、LattePanda、micro:bit 等控制器来读取 HuskyLens 的数据,原理都是一样的,就留作课后作业吧,看文本文后,你能不能用其他主控板来读取 HuskyLens 的数据呢? 电路连接图如下: 关于掌控板串口的补充说明:掌控板的主控芯片是 ESP32,ESP32 有 3 个串口,分别是 Serial、Serial1、Serial2 。Serial 我们一般用来下载程序, Serial1 默认使用了 GPIO 9 和 GPIO 10 ,但是 ESP32 的 GPIO 6~11 一般用于连接外部 Flash 芯片,所以我们这里使用 Serial2 与 HuskyLens 连接通信。另外,ESP32 可以将串口 RX 映射到几乎所有 IO 口上,TX 映射到 GPIO 0~31 上(此处没有进行验证)。所以,这里我们将掌控板 Serial2 的 RX 映射到 P14 引脚,将 TX 映射到 P13 引脚。(参考网址:https://blog.csdn.net/Naisu_kun/article/details/86004049) 我们来看一下 HuskyLens 的通信协议。它主要有两种模式,正如视频中看到的那样,大部分情况下, HuskyLens 屏幕上会显示一个方框(Block 模式),在巡线模式下,它会显示一个箭头(Arrow 模式)。这两种模式下,数据的长度和格式基本是一致的,这里我们以 Block 模式为例进行讲解,Arrow 模式原理一样,此处不再赘述。 我们来看一下它的数据格式,可以看到它是以 0x55 和 0xAA 开头的一串数据,紧接着是它的通信地址 Address、数据长度 Data Length、命令代码 Command,以及我们最关心的数据 Data。最后是一个校验位。 每个数据的含义如下: Block 模式: Arrow 模式: 上面两个表格中红框框出来的是相应的数据 Data 1 ~ Data n,其中:
我们根据通信协议,编写程序来读取一下 HuskyLens 返回的数据。 首先打开 Mixly 自带的 Arduino IDE,选择 Arduino HandBit (掌控板)进行编程。 最新版 Mixly 1.0 下载地址: https://mixly.readthedocs.io/zh_CN/latest/basic/02Installation-update.html 程序如下: [mw_shl_code=cpp,true]void setup() { Serial.begin(57600); Serial2.begin(57600, SERIAL_8N1, P14, P13); } void loop() { if (Serial2.available() > 0) { Serial.println(Serial2.read(), HEX); } }[/mw_shl_code] 将程序上传到掌控板,打开串口监视器,可以看到会返回类似下图中的数据: 但是这些数据代表着什么意思呢?我们将关键数据圈出来:0x55、0xAA、0x11、0x0A、0x10、0xA3、0x00、0x7B、0x00、0x46、0x00、0x46、0x00、0x01、0x00、0xD5。其中:
至此,我们就完成了 HuskyLens 数据的简单读取。 但是每次都要这么去读取数据,然后再进行手工计算么?这还怎么做人工智能项目啊? 当然不是的,我们发现,读取这些数据就是都是一件件重复的事情,而程序最擅长的就是做重复的事情了。 # HuskyLens 数据解析 # 我们将上面的程序简单调整一下,duang~ 就完成了!(程序源代码详见文末下载链接,建议配套代码一起阅读下文) 我们先定义了一些变量,用来存放数据。这些变量的名字,基本可以自解释其含义,此处不再赘述说明。 [mw_shl_code=cpp,true]#define LENG 15 // 0x55 + 15 bytes equal to 16 bytes unsigned char buf[LENG]; int xCenterOrXOrigin = 0; int yCenterOrYOrigin = 0; int widthOrXTarget = 0; int heightOrYTarget = 0; int learnedIndex = 0;[/mw_shl_code] 在 setup() 中,主要是对两个串口进行初始化: [mw_shl_code=cpp,true] void setup() { Serial.begin(57600); Serial2.begin(57600, SERIAL_8N1, P14, P13); }[/mw_shl_code] 然后在 loop() 中,不断去读取掌控板串口 2(Serial2)中返回的数据。首先要判断第 1 个读到的数据是否是默认的 Header 0x55,我们用了 find() 函数: [mw_shl_code=cpp,true]// Header // Read data until get the first header of data packet 0x55 if (Serial2.find(0x55)) { // ...... }[/mw_shl_code] 如果读取到 0x55,那么就把剩下的 15 个数据都读取进来,并存储到 buf 变量中。因为一个有效的通信命令共 16 个数据,大家可以在通信协议中数一下。 [mw_shl_code=cpp,true]// Read the next 15 data Serial2.readBytes(buf, LENG);[/mw_shl_code] 接着去检查第 2 个数据是否是默认的 Header 2 0xAA。这里需要注意的是,我们并没有把第 1 个 Header 数据 0x55 存储到 buf 变量中,所以 buf[0] 不是 0x55,而是 0xAA。 [mw_shl_code=cpp,true]// Header 2 // Check the second header of data packet 0xAA if (buf[0] == 0xAA) { // ...... }[/mw_shl_code] 如果第 2 个数据也是默认的包头的话,再去对剩下的数据进行校验,这里调用校验和函数 checkSum(),具体这个函数怎么实现的,下面再讲。 [mw_shl_code=cpp,true]// Checksum if (checkSum(buf, LENG)) { // ...... } else { Serial.println("Checksum Errorrrrr!"); }[/mw_shl_code] 校验和通过后,就可以对数据进行处理和计算了。在下面的程序中,我们先把原始数据打印出来: [mw_shl_code=cpp,true]// print the command list Serial.print(0x55, HEX); Serial.print(" "); for (int i = 0; i < LENG; i++) { Serial.print(buf, HEX); Serial.print(" "); } Serial.println();[/mw_shl_code] 然后通过 5 个函数分别去计算 Data 中的几个值。最后再将这些数据在串口监视器中打印出来。 [mw_shl_code=cpp,true]// get the values xCenterOrXOrigin = getX(buf); yCenterOrYOrigin = getY(buf); widthOrXTarget = getWidthOrXTarget(buf); heightOrYTarget = getHeightOrYTarget(buf); learnedIndex = getLearnedIndex(buf); // print the values Serial.print("x: "); Serial.print(xCenterOrXOrigin); Serial.print(" "); Serial.print("y: "); Serial.print(yCenterOrYOrigin); Serial.print(" "); Serial.print("width: "); Serial.print(widthOrXTarget); Serial.print(" "); Serial.print("height: "); Serial.print(heightOrYTarget); Serial.print(" "); Serial.print("learnedIndex: "); Serial.print(learnedIndex); Serial.print(" "); Serial.println(); Serial.println("-----------------------------"); Serial.println();[/mw_shl_code] 这样我们就把数据读取出来啦。 # 几个函数说明 # ## checkSum() checkSum() 函数的功能就是校验读取到的数据是否正确。只要简单讲读到的数据相加,并最终取和的低 8 位,检查是否和读到的最后一个数据相等即可。相等的话,将标记变量 receiveflag 赋值为 1 即可,否则赋值为 0,并返回 receiveflag 的结果。 [mw_shl_code=cpp,true]// check sum char checkSum(unsigned char *buf, char leng) { char receiveflag = 0; int sum = 0; int sumLow = 0; for (int i = 0; i < (leng - 1); i++) { sum = sum + buf; } sum = sum + 0x55; sumLow = sum & 0x00FF; if (sumLow == buf[leng - 1]) { sum = 0; receiveflag = 1; } return receiveflag; }[/mw_shl_code] ## getX() ## getY() ## getWidthOrXTarget() ## getHeightOrYTarget() ## getLearnedIndex() 这 5 个函数的原理基本一致,其函数名基本可以自解释含义,此处也不再赘述解释每个函数的功能。 这里以第 1 个函数 getX() 为例,介绍这几个函数内部的原理。 通过查看通信协议,我们可以知道,X 坐标的数值,分别存储在 buf 变量中的第 5 个和第 6 个(实际是完整数据的 6 个和第 7 个数据,但是 buf 变量中没有存储第 1 个数据 0x55),所以这里取 buf[4] 和 buf[5] 来进行计算即可。 由于是 16 进制的数据,所以可以通过移位进行计算,当然这里的 << 8 等价为 * 256。最后将计算出来的值返回即可。 [mw_shl_code=cpp,true]// X Center of Block [Block mode] // or X Origin of Arrow [Arrow mode: Line tracking mode] int getX(unsigned char *thebuf) { int xCenterValue; // calculate X Center of Block value xCenterValue = ((thebuf[5] << 8) + thebuf[4]); return xCenterValue; }[/mw_shl_code] 其他几个数据,也是同样道理,只要取对应的数据位进行计算即可。 # 总结 # 通过这一章节,我们根据 HuskyLens 的通信协议,把 HuskyLens 返回的数据都读取出来了。那么我们可以利用这些数据做一些什么有趣好玩的事情呢? 物体追踪,人脸识别,物体识别,巡线追踪,颜色识别,标签识别等功能,要怎么用呢? 交互手势控制、自主机器人、智能门禁、交互式玩具等又要怎么实现呢? 我们下期见! # 代码下载 # 请到知识星球下载本教程对应的源代码:https://t.zsxq.com/RB6EaYf # 广告时间 # 最后再打个小广告:欢迎关注我的个人公众号“铁熊玩创客”,不 kan 定 xin 期 qing 更新创客制作、技术教程以及一些胡言乱语。 # 往期作品 # - 掌控超声波传感器?可能没你想的那么简单:https://mc.dfrobot.com.cn/thread-296500-1-1.html - 首发测评 | 掌控板 V1.1 测试版语音识别初体验:https://mc.dfrobot.com.cn/thread-296662-1-1.html- 学会掌控板 + Siri 语音控制,只要半小时:https://mc.dfrobot.com.cn/thread-297311-1-1.html - 掌控板+麦轮,Mixly + Blynk,让你的麦轮战甲嗨炸全场!https://mc.dfrobot.com.cn/thread-297868-1-1.html ## 创客技巧 - 创客项目缺少高颜值电路图?看这里就对了:https://mc.dfrobot.com.cn/thread-289862-1-1.html - 小白也能学会的激光切割创意盒子设计方法:https://mc.dfrobot.com.cn/thread-276550-1-1.html ## 桌面机器人 - 桌面萌宠 Pando,这个机器人靠卖萌为生好多年:https://mc.dfrobot.com.cn/thread-35162-1-1.html - 桌面萌宠 Pandy,谁说智能车不能卖萌:https://mc.dfrobot.com.cn/thread-36721-1-1.html - 吃货战车:谁说泡面只能用来填肚子:https://mc.dfrobot.com.cn/thread-34679-1-1.html - 纯野生黑科技,分分钟教你自制最skr的全向麦熊小车:https://mc.dfrobot.com.cn/thread-268968-1-1.html - 不会垃圾分类?教你制作一个瓦力机器人来帮你:https://mc.dfrobot.com.cn/thread-296340-1-1.html ## 智能家居 - Hey Siri, 打开 HAY 旋转灯:https://mc.dfrobot.com.cn/thread-26865-1-1.html - Hey Siri,请告诉我传感器数据:https://mc.dfrobot.com.cn/thread-28859-1-1.html ## 创意生活 - HAY,你好 ── DIY HAY旋转灯:https://mc.dfrobot.com.cn/thread-26212-1-1.html - DIY 你的专属酷炫照片投影灯:https://mc.dfrobot.com.cn/thread-26900-1-1.html - 好色灯:你们吸猫,我吸色:https://mc.dfrobot.com.cn/thread-34483-1-1.html - DIY 你的专属酷炫照片投影灯:https://mc.dfrobot.com.cn/thread-26900-1-1.html - 没有什么问题是猜拳不能解决的:https://mc.dfrobot.com.cn/thread-38060-1-1.html - 律动头饰皇冠:每个女孩心中都有一个公主梦:https://mc.dfrobot.com.cn/thread-267927-1-1.html ## 学生作品 - 戒烟帽:https://mc.dfrobot.com.cn/thread-280204-1-1.html - 体感骑行安全帽:https://mc.dfrobot.com.cn/thread-280093-1-1.html ## HCRbot 机器人(SLAM) - HCRbot 系列 1──HCRbot 机器人简介:https://mc.dfrobot.com.cn/thread-26938-1-1.html - HCRbot 系列 2──HCRbot 硬件介绍与设置:https://mc.dfrobot.com.cn/thread-26939-1-1.html - HCRbot 系列 3──HCRbot 上位机 PC 端软件设置:https://mc.dfrobot.com.cn/thread-26975-1-1.html - HCRbot 系列 4──HCRbot下位机设置(树莓派版):https://mc.dfrobot.com.cn/thread-27020-1-1.html - HCRbot 系列 5──HCRbot下位机设置(Odroid XU4版):https://mc.dfrobot.com.cn/thread-27161-1-1.html - HCRbot 系列 6──HCRbot 底层驱动 OpenCR 设置:https://mc.dfrobot.com.cn/thread-27296-1-1.html - HCRbot 系列 7──启动 HCRbot 机器人:https://mc.dfrobot.com.cn/thread-28248-1-1.html - HCRbot 系列 8──远程控制 HCRbot 机器人:https://mc.dfrobot.com.cn/thread-29354-1-1.html - HCRbot 系列 9──控制 HCRbot 机器人绘制平面地图(SLAM):https://mc.dfrobot.com.cn/thread-29936-1-1.html |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed