前言
该例程实现的功能是循迹功能,可为想拿K210做视觉循迹开发作为参考
例程使用前需要搭建好MicroPython的开发环境
K210开发板MicroPython开发环境搭建
一、将K210连接好后打开CanMV IDE,连接成功后,三角形变成绿色
二、然后要把小车驱动库和PID控制库下载到内存卡的根目录上。
1、现在官方资料包找到下面三个源码,然后复制到文档/CanMV这个文件夹里
2、点这里,先把这两个库存进内存卡(前提是插上了内存卡)
3、点打开,依次写入这两个库
4、写入成功即可
三、在这个位置打开循迹例程
四、源码
import sensor, image, time, lcd
#导入所需模块
from modules import ybserial #串口通信模块
from robot_Lib import Robot #机器人控制模块
from simplePID import PID #PID控制器模块
#FollowLinePID = (22, 0, 2)
FollowLinePID = (15, 0, 2) #循迹PID参数
SCALE = 1000.0 #PID控制器缩放比例
#初始化PID控制器
PID_controller = PID(
160,
FollowLinePID[0] / 1.0 / (SCALE),
FollowLinePID[1] / 1.0 / (SCALE),
FollowLinePID[2] / 1.0 / (SCALE))
#初始化串口通信
ser = ybserial()
#初始化机器人控制
bot = Robot(ser)
#设置机器人声音和运动状态
bot.set_beep(50)
bot.set_car_motion(0, 0, 0)
#初始化相机传感器
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565) #设置图像格式为RGB565
sensor.set_framesize(sensor.QVGA) #设置图像帧大小为QVGA
sensor.skip_frames(time = 100) #跳过100ms的帧
sensor.set_auto_gain(False) #关闭自动增益
sensor.set_auto_whitebal(True) #打开自动白平衡
#初始化时间时钟
clock = time.clock()
#提示用户在摄像头前放置要跟踪的对象,并学习其颜色阈值
print("Hold the object you want to track in front of the camera in the box.")
print("MAKE SURE THE COLOR OF THE OBJECT YOU WANT TO TRACK IS FULLY ENCLOSED BY THE BOX!")
# Capture the color thresholds for whatever was in the center of the image.
# 50x50 center of QVGA.
#学习颜色阈值的中心图片区域
BOX = 30
r = [(320//2)-(BOX//2), (240//2)-(BOX//2), BOX, BOX]
for i in range(50):
img = sensor.snapshot()
img.draw_rectangle(r)
lcd.display(img)
#学习颜色阈值
print("Learning thresholds...")
threshold = [BOX, BOX, 0, 0, 0, 0] # Middle L, A, B values.
for i in range(50):
img = sensor.snapshot()
hist = img.get_histogram(roi=r)
lo = hist.get_percentile(0.01) # 获取直方图在1%范围内的累积分布函数值
hi = hist.get_percentile(0.99) # 获取直方图在99%范围内的累积分布函数值
# 取百分位值的平均值
threshold[0] = (threshold[0] + lo.l_value()) // 2
threshold[1] = (threshold[1] + hi.l_value()) // 2
threshold[2] = (threshold[2] + lo.a_value()) // 2
threshold[3] = (threshold[3] + hi.a_value()) // 2
threshold[4] = (threshold[4] + lo.b_value()) // 2
threshold[5] = (threshold[5] + hi.b_value()) // 2
# 绘制目标物体的边界框和中心交叉点
for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
img.draw_rectangle(r, color=(0,255,0))# 绘制颜色学习的区域
lcd.display(img)
print("Thresholds learned...")# 学习阈值完成
print("Start Color Recognition...")# 开始颜色识别
state = 0# 初始化状态
while(True):
clock.tick()
img = sensor.snapshot() # 获取图像
fps = clock.fps() # 计算帧率
data_in = 0
index = 0
for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):
#img.draw_rectangle(blob.rect())
#img.draw_cross(blob.cx(), blob.cy())
index = index + 1
state = 1
if index == 1:
area_max = blob.w()*blob.h()
area = blob
else:
temp_area = blob.w()*blob.h()
if temp_area > area_max:
area_max = temp_area
area = blob
if state == 1:
print("area:", index, area.w(), area.h())
value = PID_controller.incremental(area.cx())# 计算PID控制器输出值
img.draw_rectangle(area.rect())# 绘制目标物体的边界框
img.draw_cross(area.cx(), area.cy()) # 绘制目标物体的中心交叉点
bot.set_car_motion(0.2, 0, value)# 设置机器人运动
state = 0
img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0)
lcd.display(img)# 在LCD上显示帧率
#print("FPS:s", fps)
五、点击下载运行即可
六、现象
等待系统初始化完成后,LCD显示摄像头画面,并且屏幕中间有一个白色的方框,请将要识别的颜色放到白色方框内,等待白色方框变绿则开始采集颜色,采集完成绿框消失,开始运行程序。
颜色识别的功能主要是分析颜色的LAB值,先把要识别的颜色放方框内,然后系统会根据方框内读取到的颜色的LAB值,再与摄像头采集到的颜色的LAB值作为分析对比,如果符合要求则画出方框,表示识别到该颜色,并将识别到的颜色的位置信息传输给PID控制器进行计算,判断出识别到的颜色与小车中间的偏移量,根据偏移量来修改小车前进的方向,从而达到小车视觉巡线的功能。