十四届全国大学生“恩智浦”杯智能汽车竞赛信标组总结(3)

这篇文章主要讲信标灯识别。

提及这个,不得不说那坑爹的神眼摄像头,明明用的是同样的例程,在俱乐部其他人的板子上就能够显示图像,在自己的板子上就是不能,搞来搞去只有NG(表示无法读取摄像头)在OLED上显示。
一怒之下改例程,从基本通信方式看起,到它的行中断,场中断,终于,在删删改改一番我自己也不知道的地方后这摄像头终于显露出图像来了。然而拿这程序到其他人的板子上后
他们的摄像头图像显示不出来了…

咳!言归正传,有关信标灯识别这东西由于俱乐部前辈们并没有留下经验,一切只能够从头开始,于是乎,我发奋图强,利用高超的数学功底模仿大津法动态阈值写出了动态图像处理函数。然后很快发现由于复杂度太高车子卡的一帧一帧的。再然后就没有然后了…

之前我考虑的方案一直是如何从周围的杂光中把信标灯的光找出来,后来才发现大道至简,与其考虑这么多,不如直接下场看看信标灯在摄像头下到底是什么样子的,结果惊奇的发现在OLED上(我们把摄像头采集得到的图像放在OLED上显示)居然只有一个米粒大小一闪一闪的光点,压根不需要什么处理,滤波函数,经过仔细推衍,层层研究终于发现这是由于在摄像头上加上了滤镜,所以就把非红外线以外的光全部滤掉了,管它什么白炽灯光,墙面反射,我只认信标灯的红外光。但这是夜晚!这是夜晚!这是夜晚!重要的事情说三遍,因为白天这车就跪了!
之后的事情就简单了,从摄像头里采集得到的是灰度图像,经过一番例程处理函数的大津法动态阈值处理后二值化,成为一个64行128列的二维数组,你喜欢也可以叫矩阵,我一般把行数看作纵坐标,列数看作横坐标。我的方案是找到所有非0的点,其实也就是为1的点,取它们对应坐标的平均值作为对应灯光的坐标值,一般来讲这个值是对应信标灯的坐标。
经过测验,纵坐标值意义不大,因为我们把车子从远处一直推到信标灯近处,图像从一个小点变成一个大圆,它的y值没什么明显变化,毕竟从图像读取实际位置本就不怎么靠谱。
而它的横坐标值则就有大用了,虽然不能够正确表示与车子的横向距离偏差,却能够表示出信标灯中心点与车摄像头中心点之间的角度偏差。
而车子走什么路径能够最快到达信标灯,当然是直线了。于是就需要通过它的横坐标进行控制使得车子正对着信标灯以直线向它跑去。

还记得第一篇文章里讲的速度合成吗

好吧,还是上一幅图
在这里插入图片描述
这里只考虑y方向或者说前进方向速度,并在前进中通过车身角速度w来调控车的角度使之对准信标灯,好比你开车要到左上方一个点,一方面你要踩油门,另一方面要打方向盘,当然麦克纳姆轮是靠差速调控需要转换一下。

//注意!这里的代码只做示范,不符合任何语言规则,当伪代码看看就好了

//预先定义比例值,调节角度应该没谁会用积分量
kp = 4;
......
//通过摄像头图像获取信标灯光点坐标与中线(中线当然是在中间位置x = 64处喽)差值

deltax = -20;//得到插值,即说明灯在左边,x小于中线当然在左

//这里就用封装好的函数直接输入给各个电机的pwm值,这里500是直线速度
motor1.setvalue = 500 + kp*deltax;
motor2.setvalue = 500 - kp*deltax;
motor3.setvalue = 500 - kp*deltax;
motor4.setvalue = 500 + kp*deltax;
//直线分量与对应的角速度分量直接相加,就是速度合成了
//这里具体的正负号要根据你的轮子顺序来选取,这里我选的是以左上角为motor1,然后顺时针往上加

这样就基本实现往灯跑的能力,然而前提是,你必须要在看到灯的情况才能按程序跑。

那,要是看不到灯呢?

这里,当然要再加一部分程序了,当看不到灯时原地旋转,转个一圈肯定能到灯的正面,这时候,就可以开车了。

大体框架是这样,但细节性的东西还有许多问题,这将在第四篇文章里讲道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值