1. 案例目的
学习 AI 视觉感知模块的线条检测功能,并用 CoCube 实现自动巡线功能。
2. 使用材料
巡线地图,可下载并用A3纸印刷
3. 软件平台
或直接打开添加有 AI 视觉感知模组的编程环境:MicroBlocks-AI Camera
4. 算法知识
算法简介
检测图像中是否有线条,如果有则会返回线条的两个端点和倾斜角度,最多可同时检测5个线段,如果为曲线,则会返回近似的直线段。
点击观看视频:Sentry2视觉传感器-线条检测算法介绍_哔哩哔哩_bilibili
配置参数
UI界面中可以设置算法性能和同时检测的线段数量
算法性能:
根据不同的应用需求来选择合适能算法性能,有3个选项可以设置,分别为“灵敏”、“均衡”、“准确”
灵敏模式下会对小线段更为敏感,准确模式下会忽略较小的线段,默认为均衡模式
线段数量:
可以设置1~5条线段
返回结果
检测到线条后会返回其两个端点和倾斜角度
注意:水平向右为0度,逆时针增大,垂直向上为90度,水平向左为180度,一般不会向下检测输出角度
最多可同时可检测5个线段,为便于UI界面上进行区分,按结果顺序依次用“红、黄、绿、蓝、紫”五种颜色进行标记
当通过主控读取寄存器时,将会返回以下的数据:
结果 | 含义 |
---|---|
1 | 线段终点x坐标(高处) |
2 | 线段终点y坐标(高处) |
3 | 线段起点x坐标(低处) |
4 | 线段起点y坐标(低处) |
5 | 线段的倾斜角度 |
使用技巧
背景与线条应清晰分明,比如白底黑线,如果背景杂乱,则可能会检测出背景中的线条
线条粗细应适中,不可过细,也不可太宽
一般来说,巡线时,第一条线段始终为屏幕下方先发现的线段,然后是分支线段
需要使用到的积木说明
- Sentry2 初始化积木
一个可选参数是 i2c 地址。默认为 96。(0x60)
在使用 Sentry2 前需要先执行初始化积木。通常会放在“当启动时”帽子积木下。
- Sentry2 设置模式积木
需要设置模式为line,即线条检测模式。
- Sentry2 检测结果
使用这个积木前需要确定line算法模式已开启。
这块积木也是用来触发检测的积木,只有先使用这块积木,才能获得检测结果。
返回的结果为当前line算法识别到的结果数量。
结果的数量会受对应算法的参数设置影响。
- Sentry2 线条检测对象属性
返回线条检测对象id的属性,包括线段终点x坐标(高处)、线段终点y坐标(高处)、线段起点x坐标(低处)、线段起点y坐标(低处)、线段的倾斜角度。
5. 开始编程
连接设备:通过有线或者无线方式,连接 MicroBlocks IDE 与 CoCube 机器人,并将 AI 视觉感知模块拓展在 CoCube 机器人前方。
载入积木库:如未添加 Sentry2 AI 摄像头库和 CoCube 外接模块库,可先加载CoCube的外接模块库和Sentry2 AI 摄像头库。
摄像头模块初始化:选择启动时先启用外接模块电源,然后等4秒后摄像头模块启动成功再初始化I2C接口,然后再将摄像头的算法模式设置为line模式用于色块识别。
- 线条检测:循环判断是否有检测到Blob色块,当检测到的色块数量为1时,输出该色块的5种属性。你可以实时观察该色块的位置、大小以及颜色标签。
现在考虑如何根据线条的位置和角度来让CoCube保持在巡线上,因为CoCube是履带式差速轮,当其偏离巡线时需要通过调整两个车轮的转速来进行转向校正。所以我们就需要判断什么情况下需要调整转向,如下图所示:
1. 首先当直线本身位置偏左时,说明此时CoCube已经偏向于巡线的右侧,而我们最希望的是CoCube能尽快回到最近的训线的中心,所以选择bottom_X与屏幕中心(50)作差,然后除以一个比例系数得到差速值,定义为error_1
2.其次当直线角度不是90度(即前方巡线存在拐弯)时说明我们需要进行转向来跟踪巡线。因此选择直角(90)与angle作差,然后除以另一个比例系数得到差速值,定义为error_2;
最终左轮的速度等于直线速度(默认25)+error_1+error_2, 右轮的速度等于直线速度(默认25)-error_1-error_2。
(注:这里error_1和error_2采用了负反馈的思想,根据实际的误差调整车轮转速,进而减少误差)
代码如下(自动巡线):
- 编写自己的程序:有了上述的调试代码,不妨尝试下改用其他参数作为负反馈项实现更高精度的跟踪,也可以自己试试组合更多的功能!
6. 挑战一下
基于色块识别功能,实现跟随蓝色圆柱移动的功能。
注意,需要手动设置Sentry2摄像头的色块识别的参数,将识别色块的颜色由出厂默认红色,更改为蓝色。