智能车的探索与思考(三)

摩托组校赛失利,相关的研究也就暂时搁置了,没再去修。后续在学长的帮助下,更换组别,重新开始,我们非常感谢学长的帮助,让我们有机会继续参与比赛。

新的组别是MicroPython组,对我们来说比较大的挑战一个是队友不会python语言,而我们整体的时间只剩一个月。另一个是库函数不多,有些功能没有函数,要自己写,有些参数不知道具体作用么,要去试。还有一个最头疼的,调试结果没有直观的展示:上位机用不了、屏幕不灵敏、按键用不出来,只有车连着电脑时候才看得到数据,动起来之后只能观察小车运动去推测,然后修改。

完赛

学长的代码中给了CCD处理、电机PID控制函数、舵机控制函数,学长在此基础上引导我们写出了完赛的基本思路:通过CCD二值化结果完成边界寻线,以中线误差加到舵机控制上,实时修正,完成了小车慢速直行、转弯等基本功能。

                medium_line=(left_line+right_line)//2                

err=medium_line-64
        a=int(5679-k*err)
        #更新 PWM 输出,使舵机动
        pwm_servo.duty_u16(a) 

其中k为参数,通过简单调整,确定放向后调整大小,k值越大,小车对赛道中线的反应越明显,即转向幅度越大。

提速过程中,车速越快转弯时需要的k值越大,但直线同时会变抖,为此引入新的参数。

                   a=int(5679-servo_kp*err+servo_ki*(err-last_err)+gyro_z*servo_kd)

kd的引入通过获取车身角速度,目的是对小车抖动幅度进行抑制,使得kp可以进一步增大,速度较快时转弯更稳定。ki的引入,增强p、d控制下直线的稳定性。

我们也尝试过动态参数,即设定直线、弯道不同赛道元素下的不同参数,但因为调参难度较大、时间不足,最终选择提高泛用性,只用一套舵机参数。

赛道识别方面,特殊元素(直线、弯道之外)包括十字、坡道、障碍、环岛,起初针对英飞凌镜头组的开源项目进行学习,并对其中的识别、判断、控制函数进行从C语言到python的移植,学习并使用了两个星期,期间也了解过其他ccd组的循迹思路,但结果都没有很理想,多数情况不如原来什么特殊识别都不加的程序,因此最后一周决定自己写。

在多次的调试无果后,我们发现许多功能难以实现的原因在于单片机性能有限,有时候带不动,因此许多复杂的算法都需要舍弃,数组也不能定义太多。整理重组之下,得到了较为精简的代码。

通过遍历与跳变点判断,实现终点停车。

主控部分,通过中线误差完成舵机控制。

思路分享

最终的完赛代码为CCD循迹,尽量减少芯片运行负担,较简洁,算上注释不到两百行。

数据处理,在二值化和动态阈值之间,最终选择了动态阈值算法,原因有两个,一是动态阈值调试时应受反光影响小,二是循环次数少,可以少定义一个数组。动态阈值的缺点是稳定性略差,容易抖,需要更好的参数控制。

电机控制,因时间有限,未能在参赛之前写出,基本思路就是将电机占空比和误差挂钩,两边电机占空比上加减一个数,形成差速帮助小车转弯。在小车达到一定速度之后才有必要进行,速度较慢时三个参数就足够。

舵机控制,即上文提到的pid控制方式,引入误差、误差的差、角速度三个因素,调整参数。不同速度、直道弯道的最佳参数均有差异,但在一定速度范围内,一套参数也能用,调参压力小。

赛道判断,结合我们的调试经验,中线循迹的优点在于除了环岛都能跑,不写赛道判断的时候,已经能做到不加环岛完赛,但也导致环岛识别很难。为了稳妥完赛,最终比赛时没有加入环岛判断,这里分享一种环岛判断思路。入环岛时,赛道突然变宽,一侧丢线,此时保持直行;两侧不丢线、路宽逐渐变宽时,附一条虚拟的边界线,使小车转弯;从入环岛起算,通过陀螺仪记录小车转动角度,角度到360度时,关闭环岛判断,即可出环岛,注意区分左右圆环。

加入环岛调试中出现的问题

1.十字误判,十字中也有丢线,可通过更具体的边线范围对十字和环岛区分,环岛不丢线的一侧边界比十字的两侧丢线的边界线更靠近中线。

2.抖动误判,进入之前如果出现严重抖动,可能会来不及转进环岛就过去了,调好参数,使小车通过其余元素的稳定性更高,或者多放几次,总会有稳定的时候。

3.出环岛失误,这个问题是我们最终无法完成的原因,或许是陀螺仪问题,也或许是计时器问题,总之同一个函数下,小车转一圈的角度积分值每次都不一样,判断不了,进去了环岛只能靠抖动出来,最终放弃。

改进思路

如果可以使用双CCD循迹,对赛道的判断可以更精确,远端、近端双中线轮流使用,效果会更好。出环岛的方式除了物理计时、记录角度距离等数据外,或许可以用摄像头判断,但单CCD下我们目前没有思路。提速方面,大致两个阶段,加入差速控制可以进一步提速,达到摩擦力的极限后加入负压风扇,继续调参数可实现更快。

以上即我们最终完赛思路的分享,欢迎大家来一起讨论,期待大佬给出更多改进建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值