参加了两届全国大学生智能车竞赛百度智慧交通组,两届比赛分别以“封狼居胥”和“丝绸之路”为主题,本博客以丝绸之路为主介绍比赛中 WWW队的比赛解决方案,以及最终比赛中出现的问题。
!!!!!!机械结构不加以介绍,只介绍算法和解决方案,可以参考今年官方小车或我队小车
目录
场地
比赛任务(按照行车轨迹)
1.采购货物
共五种颜色,随机选择两种颜色的物块,A颜色物块三个,B颜色物块一个,共四个,智能车将机械爪定位到B颜色物块处,伸出机械爪后抓取到B颜色机械爪
1.1难点
物块前后定位
识别B物块中点,当摄像头和B物块的相对位置差距在某一个范围内时(B物块可以用目标识别的方式在图像帧中用一个结果框将其框出,其包含框的大小,框的左右上下边界坐标),结束小车前后定位。
B物块的识别
这里有两种方式去做
一种是直接使用深度学习的方法去做,进行目标识别,使得目标框中的所有物块都被圈出,并且A颜色物块标注为颜色A,B颜色物块标签为颜色B,这样的话可以直接识别出我们的B物块,并进行定位。
(我们的方法:使用深度学习和掩膜MASK相互结合进行颜色识别,并找出异常颜色(B颜色),首先所有的物块都将被打标签为“purchase”,识别出四个或三两个purchase之后,定位到这些purchase目标框在图像帧中的位置,并将目标框缩小到70%保证框出的物块尽量只包含自身的颜色信息,然后比较这些物块的三通道RGB颜色在颜色空间中的欧式距离判断异常颜色)
detect(self,image)中含有该处识别物块的代码,已经标注
2.文化交流(举旗)
基本没有遇到问题,主要是机械结构方面,使用了三个舵机负责三个不同目标的举旗任务,关键要看懂底层的下位机和执行机构的通信即可
3.守护丝路(识别好人与坏人,并攻击坏人头部)
难点1:
1-目标识别数据集的好坏,要求队员在采集数据时有大规模数据,而且数据的好坏也会影响识别的好坏
官方使用labelme进行标注,但是其实可以直接使用labelimg进行标注,直接转化为所需的VOC格式文件,然后将数据灌入训练器,这里的目标识别使用的是ssd模型,具体模型内容可以查看训练用的python文件中。
难点2:
2-升降台上下过程结束的时机
下降时,使用一个限位开关,当限位开关碰到车子底盘时候让升降机电机停止
上升时,使用一个磁敏,然后在四个位置放置磁铁,每次磁敏和磁铁之间磁力最大时记一次数,所以,每计四次算为上升一圈,我们根据上升的圈数来确定上升高度,而不采用上升时间(由于上升路程和时间与速度有关,速度也可能是一个变量,所以,用上升圈数来计算时能获得更加精准的定位)
4.放歌友谊(将车停入路旁的停车区)
方案:
(包含原地右转90°,后退一定距离,原地左转90°)使用开环控制时,转弯的角度和转弯的速度是由程序预先设定的,所以在实际运行过程中很有可能因为转弯速度的不同,定时时间的不准,导致小车停止位置的不准确
而我们采用霍夫变换的检测方式,检测车道直线,从而在小车原地右转时可以在直线斜率为0附近时结束右转过程
5.翻山越岭(小车穿过跷跷板)![](https://i-blog.csdnimg.cn/blog_migrate/a4a996927f805000a154ffad4fb2fa71.png)
我的方案:检测到跷跷板后确定进入翻山越岭的任务中,然后检测上图跷跷板上中间的黑线,由于该黑线为纯黑,与周围像素差异较大,所以可以采用霍夫变换或者直接使用掩膜MASK进行提取黑色像素点,然后定位黑色点的均值坐标(x0,y0),另一方面,获得黑色的这条线的斜率,我们的调整目标有两个:
1.使得黑色点均值坐标始终位于整个图像的中点
2.使得斜率始终是一个很大的值
所以调整时:设置一个基准速度,然后设置四个模式,左转,右转,原地左转,原地右转,所以我们的调整策略就是,首先通过原地左转或右转使得直线斜率为一个很大的值,这样小车车身位姿就已经调正;随后检测此时的黑色点均值坐标的x轴坐标,如果该坐标位于中点附近某个范围则停止调整加速冲过,否则根据x轴坐标的偏差(先左转,后右转调正,随后稍向后退,这样可以使得小车在赛道上的向左向右移动)
重复上述步骤即可成功调正位姿
6.以物易物(1.放入采购的货物B;2.夹取到识别的货物)
难点:如何确定检测到的货物的位置是在上层还是下层
其实说简单也简单,只需要确定检测到货物的纵坐标,如果比较小的话认为位于上层,比较大的话认为位于下层,然后其他的控制只需要明白夹取的过程即可