序言
当时手里有一个大创的项目,还很头疼的时候,被舍友忽悠去搞电赛,虽然说被扔过来一堆任务,很烦,但也算是当了一次主力,选队友很重要很重要,要是担子一个人扛那真是.....
一直想把资源开源给大家,电赛训练过程积累到不少的学习经验,参赛前一个月才第一次摸到msp430和k210,理论上我的资源应该可以应急,或者解决小白的困难,若有其他疑问可以评论区咨询。
关于电赛e题,同校参赛成员多采取开环算法,代码写死,不能应对随机放置A4纸的情况,这里我采取闭环算法,只采用一块k210和一块稳压驱动,用k210自带摄像头检测目标后,经计算得到的坐标和角度反馈给k210控制的舵机,k210有个很大的优点是采用micropython语言,有足够用的库供您选择,在pid算法,三角函数算法,以及PWM波输出和串口调用方面提供了极大的便利,列表元组等灵活应用更便于处理整理摄像头获取的大量数据。
关联坐标和现实位置
反正切函数法
e题中有两个东西是可以或者必须固定的,一个是50*50屏幕,一个是摄像头和云台的系统整体,我设计的方法必须要有两个固定的值,题中明确告知摄像头和云台系统和屏幕的距离为1m,因此此外的固定值一个是摄像头相对于屏幕中心的左右偏移,摄像头相对于屏幕中心的高度,这些值在固定已知的情况下,才能用反三角函数来计算云台指向目标所需要转动的角度。
示例如下:
反三角函数示意图
k210正对白屏正中心点 假设(180,120)
比例尺K:k210屏幕上显示一条横线的像素长度和现实白屏上横线的实际长度(单位尽可能选毫米)
k210屏幕上获取的目标横纵图像坐标X,Y。
则目标点相对中心点偏移量为(180±X,120±Y)
白屏中心对于k210摄像头的距离D
若tanA=a/b,则A=arctan a/b
总结公式:角度x = arctan [ K(180±X) / D ]
角度b = arctan [ k(120±Y) / D ]
python的math库中反正切函数:
jiaoA = math.degrees(math.atan((160-x)/b)) #角a为水平方向舵机偏转角度,b为舵机云台到图像的距离,为固定已知值
坐标法
这是比赛倒数第二天晚上,根据其他博主的思路和其他参赛组的思路综合后突发奇想所得。
当屏幕正对着白屏的时候,激光打在白屏上,光斑在k210屏幕上可以获取对应图像坐标,云台内舵机的角度可以通过读取输入的高电平时长,二者应当有一种函数关系,因此固定好摄像头-云台系统,固定好屏幕,摄像头正对白屏正中心,使每次转动一点固定角度,光斑移动的距离均匀。
开启激光笔,通过按键使云台转动固定角度,记录每次转动后的角度,并采用检测色块函数获得色块在屏幕上的坐标值函数来记录每次移动后的光斑中心图像坐标。
记录完整后将数值放入excel表格一次方程拟合后获取K和B的值
类似下图:
计算角度和坐标的比例关系
坐标法部分代码:
while flag1 < 4 :
#lcd.display(img)
x = zb_x[flag1] #从左上角开始,顺时针数第[flag1]个点的X坐标
y = zb_y[flag1] #从左上角开始,顺时针数第[flag1]个点的Y坐标
xx = -0.2447*x + 19.271 #X方向角度 k = -0.2447 b = 19.271 #右上左下
yy = 0.2334*y - 47.567 #Y方向角度 k = 0.2334 b = -47.567
jiao_x.append(xx)
jiao_y.append(yy)
print(jiao_x)
flag1 = flag1 + 1
Servo_x(S1,jiao_x[0]) #输入舵机第一个点的X方向角度
Servo_y(S2,(jiao_y[0])) #输入舵机第一个点的Y方向角度
utime.sleep_ms(1000)
while flag2 < 4 :
while iii < 301:
flag3 = flag2 + 1
if flag3 == 4:
flag3 = 0
bujin_x = jiao_x[flag2] + (((jiao_x[flag3])-(jiao_x[flag2]))/300)*iii #X的角度步进量
bujin_y = jiao_y[flag2] + (((jiao_y[flag3])-(jiao_y[flag2]))/300)*iii #Y的角度步进量
Servo_x(S1,bujin_x)
utime.sleep_ms(2)
Servo_y(S2,bujin_y) #每2ms移动一点角度
iii = iii + 1
utime.sleep_ms(2)
utime.sleep_ms(500)
flag2 = flag2 + 1
iii = 1
利弊
个人更倾向于坐标法,反正切函数在精度足够高的情况下,三角函数的精确度上限比较高,但是很容易受到器材晃动、摄像头与云台的相对位置或者位置没有摆到完全理想状态等情况影响精确度,坐标法相对灵活,通过转动的角度和图像坐标对应,只要使摄像头-云台系统足够稳定,不用考虑摄像头和云台的相对位置,更简便,但是精度不会太高。
关于k210
个人在k210最小系统板和openmv最小系统板的学习和使用过程中,个人感受是openmv全方位碾压k210,但是价格要高,在QVGA分辨率模式下,openmv帧率在15~20左右,而k210则会因内存不够中断进程,因此比赛时器材数量原因,我没拿到openmv,用K210的QQVGA超级模糊的分辨率模式监测坐标值,数值疯狂跳动。
因此在黑色方框激光光斑循迹过程中能不能稳定贴合那就听天由命。