关于作者:本科大二在读,电气专业。基础不好,不喜勿喷,感谢访问本网站,如果能给你提供新思路就是我最大的荣幸!
说实话这次算准备的不算很认真,赛前也没有针对相关模块及时进行补充学习。不过、从赛前的材料准备清单来看,基本和去年的题目很类似了。吸取去年的教训,这次准备了一些封装十分完善的MCU(有手就会那种🤫。不过因为这次是省赛,故主办方对芯片进行了限制——采用TI的MCU。(啊啊啊啊真的头疼😣
首先我仅代表我的组员和我感谢比赛过程中帮助过我们的同学、指导老师、以及论坛上的网友们
关于题目
小车跟随行驶系统,设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3 ~ 1m/s可调,能在指定路径上完成行驶操作,行驶场地的路径如图1 所示。其中,路径上的A点为领头小车每次行驶的起始点和终点。当小车完成一次行驶到达终点,领头小车和跟随小车要发出声音提示。领头小车和跟随小车既可以沿着ABFDE圆角矩形( 简称为内圈 )路径行驶,也可以沿着ABCDE的圆角矩形( 简称为外圈 )路径行驶。
其实今年的题目就是去年和前年控制题目的结合版,识别路口->判断转向->蓝牙通信->循迹->附加功能。这种类型的题目方案很多,因为是黑线,可以红外传感,也可以摄像头,小车跟随可以光电传感,也可以超声波测距,甚至直接写在蓝牙里面也可以。TI MCU我们不是很熟,故尽量将算法写在摄像头了。
循迹算法
-
基本的巡线:采用星瞳科技的官方例程
-
起点路线的判断:
# Basic_speeds -> 0.3m/s -> 0.5m/s -> 0.6m/s -> 0.7m/s -> 0.9m/s -> 1.0m/s self.basic_speed_list = [25, 40, 48, 56, 64, 70] # Question Speed and Route lists self.ques_speed_list = [25, 40, 32, 70] self.ques_route_list = [[2], [2,2], [2,1,2], [2]]
这次将所有的配置参数提取到setting.py中构造Setting类来提高封装度,也便于修改参数,ques_route_list即是小车所要行驶的路线通过遍历这个二维列表即可以知道小车的路线,那么,关键就在于转弯路口的判断
-
转弯路口的判断:
特征点匹配:虽然和题目要求及其相似,但是我们也还没有尝试过,故暂不做考虑。
模板匹配:拍模板,识别出来会有反馈,因为采用模板匹配这个功能需要sensor采用灰度测试,而基本的线路拟合又是RGB565,如果二者交叉测试的话,又担心MCU处理不过来,故也没有考虑模板匹配
直线检测:遇到0°线段宽度大于设定值时则判断起停线,或者90°线段有检测到时判断起停线。我们组采用的是这种方法,因为看起来逻辑可行,有算法支撑,也不涉及到example的存储。但是参数整定真的好难!😢我们一直调到比赛结束也没有调的很好。
细节实现
- 小车路线的确定:题目中要求跟随小车的行驶完全由领头小车指挥控制,领头小车上有启动按键和设置按键,而跟随小车只有一个上电开关,不得有其他启动和操作按键。每一次行驶发车时,领头小车和跟随小车按照题目要求摆放在行驶路径的指定位置,跟随小车上电,处于等待接收领头小车指令的状态。领头小车一键启动行驶,直到整个行驶过程结束。故采用MSP430上的按键GPIO输出到OpenMV的固定端口上,再和Setting中设定的任务路线相匹配即可知道路线。
- PID调节:这部分星瞳科技快速上手部分有提供源码,这里不进行过多解释
- 蜂鸣器:普通GPIO即可
- 蓝牙:串口通信,传输的数字对应相应的任务(0-3),4代表停车信号。
- 转弯方式:这里其实考虑了好多方法,包括定点sleep、开环转弯、设定ROI区域、调节PID…实际采用的是重新设定ROI区域,但效果不是很理想,包括后面并道的时候会有误差,而且实际的PID参数的整定还和车的长度、宽度等因素有关,不恰当的PID、ROI等参数会导致车轮打滑。
反思总结
- 这次硬件和赛道很快到位,主要卡在了MCU的选择以及蓝牙通信上
- PID参数整定出现严重问题!机械地进行调参,没有结合实际车的长宽等硬件信息,过于理想化了。
- 启停线识别方案选择错误,最后也没有时间修改了,是我的错
- 软件封装有些晚了,应尽早确定方案后进行封装,将参数接口暴露。
不管成功或失败,曾经经历过,这四天拼搏的日子是我永远的记忆