这是我第一次参加电赛,队友3个人,我们虽然是第一次合作,但是配合的很好,很感谢我的队友....
下面进入正题
刚出题的那个早上,我们都是挺兴奋的,在实验室睡觉,怕第二天起不来,然而,我们的生物钟好像比鸟儿还早,早早就兴奋的不行,我们第一次参加国赛,是会有这种感觉的.
出题了,我们之前就是准备做自控类的题目,所以第一眼就看B题,觉得好像有点难,然后再看了其他的所有题目,还是觉定做B题,刚好我们学校还有两组也是做B的,我们就在一起讨论了十几分钟,就去选择材料了,开着小电动,去市区买木板.我们都没买过木板,不知道哪里有木板,就兜兜转转,终于买到了,拿回去,就想着构思硬件,很快,迎检就搭好了.另一个队友就在调试舵机中值,分工很好,进度算是挺快的,然后就弄好了机械结构,开始调试,我们是用两块单片机的,一块stm32作为主控芯片,另一块k60作为数据处理芯片,鹰眼摄像头采集数据,通过串口传输给stm32,做出相应的处理,这些地方我们都做的挺好的,但是,还是有很多问题,下面我一一总结:
由于,我们之前一直在准备电赛,买了很多模块回来调试,比如带丝杆的步进电机..舵机..超声波模块..mpu6050..角度传感器....买了那么多东西回来,都调好了,但是..却一点都没有用上..最后还是拆了我们之前搞飞思卡尔的舵机跟摄像头..把基本的模块搭建起来,用stm32控制舵机的打角与显示屏的显示,,而k60作为摄像头的处理,扫描小球,得出小球所在的坐标,传输给stm32,让stm32通过pid算法,让舵机打角,从而完成操控....
下面是流程框图:
这里的主要难点是摄像头的扫描..因为木板是正方形,而摄像头采集的图像是320*240分辨率的,是长方形..这里不能像飞思卡尔一样用边沿扫描的方法,要用全场扫描,找出小球的黑点,从而得出他的圆心(球心)坐标..
然后再做摄像头采集的数据的滤波处理和圆心的滤波:
camera_get_img(); //摄像头获取图像//黑白摄像头
mg_extract(img,imgbuff, CAMERA_SIZE); //解压图像,为了调用
AllFilt(); //整场滤波
countcenter_ball(); //搜线
x_filte(); //x轴滤波
y_filte(); //y轴滤波
count_ball_center(); //计算小球中心点
这是主函数的内容,代码我在下面已经开源...
还有传输数据的滤波:假如小球x与y都为0,,说明数据采集错误,这种是不能传给stm32的,否则会很抖,毕竟那一瞬间通过pid的处理得出的值变化很大:
还有小球x或者y有一个为0也是,所以要对小球限制,...
if((ball_x_num!=0)&&(ball_y_num!=0)&&absi((ball_x_num-ball_y_num))<250)
{
send_ball_num(ball_x_num,ball_y_num);
}
就传一个坐标,,,stm32就能处理了....
由于这种通讯也是涉及到时间的问题
我们测出k60采集并处理得出坐标的时间为50ms左右,算是比较快的了,再传输数据...
而stm32用上串口中断,当他接收到数据的时候,舵机才打角,我们舵机是100hz的频率,最快可以每10ms打一次角..所以这种操作完全适合..还避免了乱打角的问题...
至于关于算法的问题,,下面的代码也已经开源了我的算法: 舵机打角,,,,可以自己去看看代码...........
*还有很重要的一点:硬件要搭的稳,摄像头不能动,不然坐标会动的,,,多多少少都有影响.*
经验之谈
电赛遇到的问题简单描述:
1:选择材料,选用山外鹰眼摄像头,硬件二值化,毕竟前段时间做完飞卡,刚好会用这个摄像头,选择木板,小球滚动的木板是黄色的,还有树木黑色的年轮,对摄像头会照成一点的干扰,所以选择喷漆,但是组委会明确规定不能喷漆,但是还是冒险喷漆了,避开了数据的不稳定。
机械结构的问题:
我们选择木板搭建,真正搭建的时候,才发现自己想到的模型跟现实还是有很大差别的,机械结构不对称,舵机打角不好控制,稳定性这些都要考虑,还有选择固定木板的材料,我们选择502加铁钉,还算比较牢固,但是502用得比较多,还不容易拆卸,去到送作品现场才发现别的作品很小,可以拆卸的,但是我们的作品很大很大,90*70*100cm。
木板还容易变形,我们的第一块板子,小球目标的地方凸起,导致小球无法定在目标里面,遂换了一块板。
这些是硬件的问题。
软件上,其实就是算法的处理,还有小球坐标点的精确,对坐标的滤波做的不好,沿用了当时飞思卡尔的滤波,没有改进,本来飞思卡尔做完有挺多时间改进的,但是没有改.
其他的东西基本没什么问题.
现在的我对pid的算法有了更深的理解了.这是一种收获.
吃亏的地方在于,我都调出来了,但是由于作品太大,搬运时候导致摄像头不正,或者有可能是平横板歪了,总之,去到现场调试时候,没能做出在实验室的效果,这是很可惜的一个地方,
解决的办法其实有很多的,但是软件没做好,没完善,就解决不了.
请记住以下几点:
1>:人机交互界面要做好,程序要写好,通过按键查看参数,不断调整,这是很好的方法.
2>:对于类似摄像头这种采集精确数据的传感器,装箱拆箱后都要重新采集数据,保存在类似24c02的存储芯片上,可以使数据在程序中运行更加精确,不会因为搬动导致数据不精确,这也是我终于知道别的学校的飞思卡尔的队伍为什么不拿电脑在调试,只是通过按键就能调试了.
3>:我们实验室的光线不足,任何一个比赛的场地,光线都是充足的,小球反光?应该都有这个影响,还有就是摄像头支架不要用太大的木条,会遮挡光线,导致也会有偏差.可以适当添加LED来补光.
还有重中之重的经验就是,网上有猜测题,最好就做,起码要构思硬件并写好相关模块的代码.
这些是我电赛的经验.
配上我的作品照片:搭好硬件的当天晚上:
能动起来的那个时刻:
由于当时调试没怎么拍照,只能找到这些.这些也是比较激动的时候拍的.
哎呀!我差点忘了给点原理图了:电源模块这个....不难,,,,差点就忘了它 哈哈哈哈上点图吧:
整体的原理图:
tft_lcd接口原理图
谢谢大家.
再开源我的所有代码吧,包括k60的小球扫描,滤波,与stm32间的通讯:
代码在 [我的电竞]那个无憾的4天3夜+自己的总结+开源代码
http://bbs.21ic.com/forum.php?mod=viewthread&tid=2033464&fromuid=1875788
|