/*********************废话***************************/
校内选拔结束了,刷l两夜调出来3m,比赛时电池充电器无奈被别人拿了,最后妥妥差零点几秒无缘华北
出来倒是很开心,进了华北必然改啊加啊,最后又是一通重整参数。从一个小白走到3m,比赛对我来说已经随意了。也说一句,自己的车只能自己做,别人说的只能听个思路,多看看报告真心有用。
发帖一周后不再回复,所以都写出来了,大神求清喷,视频没录但是我胡扯也没什么乐趣···另外 自己的车只能自己做,别人说的只能听个思路
如果有没有说到的请大家提醒,我会修改帖子让大家都看到
/*********************end 废话***********************/
/*********************说明***************************/
xs128-光电 前瞻60cm 控制周期20ms ccd 舵机50hzd
/*********************电机调试***********************/
轨迹调好拼的就是电机了!我们电机没太调,感谢开始的时候调到一组还行的PID值
首先电机一定是增量式PID的,电机是相当于带负载的,而且有较大摩擦,不能像舵机可以给定打角(即位置式)一样给什么速度就什么速度。电机一定要给i值的,因为电机要消除静差。电机我写没什么算法,就是偏离的小给高速大了给低速,有很多组都是给一个速度跑,照样3m的飞起,轨迹好嘛···说一下这个给的速度,不能最高最低差很多,除非你写了连续的或者很吊的算法,过弯快速减速那就是漂移才那么干,飘着跑绝对没有沿线跑快,直道加速弯道减速基本跑不过弯道不减直道不加,看着加速快,呵呵···调好轨迹了就是火车和汽车比,就是加速跑,又不会飘出去怕毛啊!
/**************************舵机调试*******************************/
恩,重点来了····
比赛前一天晚上12:00还2m的我们就是靠这个狂拽炫酷掉炸天的
首先,搞清楚PID的输入量再调PID,我们的输入是算出的车中心和赛道的偏移量
然后我就调了···调啊调,调啊调,调啊调···TMD别人都上2m了我还在调!我感觉直接调是不行的,别人告诉你,用PID啊,于是你就用,但是你知道要什么样的PID吗?你知道输入是你想的那个吗?你知道算出来的方向是车子应该去的地方吗?我小白的时候调累了就在论坛上搜“PID怎么调”"PID三个量的意义",但并没有注意到这些问题。看了几次快车的视频是北科去年的报告突然就明白了,要么是我输入量有问题,要么他们用的不是一套PID,要么我就是个逗逼还调毛啊···输入量我觉得没问题,然后开始调动态PID,照着北科的二次函数来,发现比之前好多了,原话是这样的
(1)在KI置零的情况下,我们通过合理调节Kp,发现车能够在直线高速行驶时仍能保持车身非常稳定,没有震荡,基本没有必要使用KI参数;
(2) 微分项系数KD使用定值,原因是舵机在一般赛道中都需要较好的动态响应能力;
(3) 对Kp,我们使用了二次函数曲线,Kp随中心位置与中心值的偏差呈二次函数关系增大
前两句照搬加上自己调个二次P,就那么愉快的上了2m!?,当时距离比赛还有四天,啊呀好开心继续调,后来发现在弯道上反应还是慢,开始无脑刷论坛,路上看妹子,无比焦虑。比赛前一天晚上发现,啊呀要比赛了,赶紧刷一夜,调了半夜开始爆粗口:"这二次根本不能满足我!!!"就是那么一句话灵感来了···
前三行忽略···
其实是这样,在车速很快的情况下,考验的是舵机在该打角的时候打正确的角,我在90度弯推车的时候一推快了就发现车打角过于连续导致系统反应慢,典型的情况就是猛一推车子舵机打死滑出去,那么我应该在偏差小的时候给更小的P,偏差大时给更大的P,二次显然满足不了,那么三次?呵呵xs处理器果断嘲笑我。于是就在二次上做手脚吧,做之前拿50cm的圆弯试了一下(在那个弯调出来其他弯就不在话下),估计一下在什么偏差时该给角,在这个偏差之前直接给特别小的P然后再接上二次函数变成连续,微微那么一调,我靠就那么3m了?!
可能有人注意到我没说D值的事,其实前面说了D给定值保证动态响应就行了,给个略抖的值足以笑傲各种弯加障碍物光电小S:调完动态P加D比较大的情况下完美直线冲过去。
十字过不了?十字全白,补个线就行,速度快了补线都不用。如果再过不了就调P吧,80%的原因都是在不该给大转角时给大了,轨迹好关键体现在一个过弯灵活,2m一下不要拿赛道有灰当借口。2m以上,至少把轮子擦了,不然轨迹再好也是飘。
在这把B车轮子说了,今年B车轮子*&%%$##**···我是用湿抹布擦的,后来用过宽透明胶带反绑赛道跑上一段,效果绝佳,但是要勤换,听说正式比赛不允许这样。
/*********************CCD 提取赛道*******************/
ccd:曝光20ms 龙邱的,不知道为什么第一点会跳,其他的都挺好,余弦效应貌似比蓝宙小点,调一下焦距甚至看的出中间贴了白胶带的电磁线···不过对比度大了带来问题大家都懂得。
着重说一下CCD二值化(或者说边沿检测),二值化和边沿检测其实是一样的,我调的时候因为没有仔细研究龙邱CCD采样,所以我就是在这扯淡,大神可以略过···一下这里对比一下:
二值化:如果波形不好真是难写算法,但是二值化出来的结果对提线来说更容易,但是会多几遍循环,还有就是二值化比较稳,我写出来的边沿检测能用但是特别不稳。二值化用静态很容易受光线影响,动态在后面会提供几个可用的办法。
边沿检测:我觉得大神都用边沿呢···本人比较菜,写出来一个可以用的不知为何特别调,静止放地舵机偶尔会抖,写边沿是因为CCD看到的起跑线图都这样
<ignore_js_op>
···我就不能忍了
不知道其他CCD有没有这样,不过,有这样的同学,赶紧加偏振片吧···我感觉调CCD的黑暗时期顿时被偏振片照明了!图像电压会变暗,需要软件放大,出来的波形让任何算法都相形见绌···当然,如果你们没被CCD坑的话就更好了···
二值化出来赛道外也是黑的(蓝色)
最后上算法:
//算法1(加偏振片最终使用)
white = ADVwhite - 25; //ADVwhite,ADVblack是开始采集的赛道白色AD值和开始的ADVmin
black = ADVblack + 10;
if(ADVmin > white){
for(i=0;i<128;i++) {
way=128;
}
}
else if(ADVmax < black){
for(i=0;i<128;i++) {
way=0;
}
}
else{
Delta = (ADVwhite - ADVblack)*0.7+ADVmin;
for(i=0;i<128;i++) {
if(ADV1<Delta)
way=0;
else
way=128;
}
}
//算法2
for(i=0;i<128;i++) { //Delta是给定的
Sum += ADV1;
}
Average = Sum/128;
for(i=0;i<128;i++) {
if((Average-ADV1)>Delta)
way=0;
else
way=128;
}
边沿我就不贴出来嘲讽了···
其实在图像上不用太纠结,看报告也没发现用特别的算法处理的,我感觉我花在这个上的时候太多太多了···还写了几个能用的算法,如果有同学需要留邮箱艾特我
/****************************光电赛道提取*********************/
应该这么叫吗?就是根据二值化算出来车身位置
我们在车放在起跑线那两秒开机等待时间采视野中赛道宽度,根据求黑线的偏差和赛道宽的一半计算车偏离中心的位置
每次从上次的车身位置向左右找黑线,这样就避免了右边线到左边线的问题
/**********************人字,起跑线,坡道,机械,pcb****************/
我们是这样,识别-舵机打死同时减特大的速度-定时(因为没有时间就先这样了)-正常程序
这样的效果很好,在人字最多耽误一秒加上加减速就2s吧,生生甩过来
我们一个ccd识别,其实完全可以做到,二值化好的话人字是个很特殊的图像。有组用竖着的CCD检测,识别的还行但是存在很多毛病和不可控性。如果到了国赛那种一个贴一个弯的话,真心蛋疼···不过我不用想那么多了啊哈哈。
起跑线:8路红外或者可见光对管,目测可见光的更好
坡道因为前瞻元=远,加上下来一个急弯能在上坡时看到,摔的有够惨,后来根据上坡时赛道变窄写个个特殊处理,但是会和人字有冲突,想着比赛后加个陀螺仪(比赛里没人字),看来也不用浪费钱了(做车有点烧···)
机械?一定要稳!我们几次重大突破都是什么杆会转啊,CCD老是不结实会歪啊,舵机跑着跑着掉了啊,左右轮子轮距不一样啊,舵机中值跑的是转弯怎么坑的事,唉···都是泪
pcb 自己画的,哥们还有用BTS的别用了,那温度我跑完一圈都不敢摸,MOS吧