一.比赛说明
1.本届智能车竞赛也到此结束了,虽然留有遗憾,国奖的实力但是由于种种因素还是差强人意,但是有一些自己备赛时候的心得和想法,不想因时间的流逝而淹没。
2.身为软件组,在拿到一个赛题后,了解本组别的完赛要求,接着就要学习所需要外设的例程,拿越野组来说:电机、舵机、GPS模块、按键、显示屏、硅麦等等,然后就要结合各种算法组装成一个工程,最后就是调试阶段,根据小车的运行轨迹来发现各种问题并且给出相应的解决方法,将解决方法用代码写出来。
二.整体架构
整个工程是由状态机(学长教的)以及各种标志位串在一起,状态机是由事件标志位、事件、状体组成。
假设现在状态为STOP状态,在代码中给一个START标志位,根据状态转换表的第一行可以跳转到START状态,就会执行在START状态下的各种代码。
每一种状态都会有初始化、执行、扫描函数。当第一次进入一个状态后,会先执行他的初始化函数,接着是执行函数,接着是扫描函数,如果标志位和此时状态和下一状态在状态转换表内没有,就会一直在本状态的执行函数内。
1.起步状态:
由于一开始要把陀螺仪和GPS坐标同步,所以有两种方法,一种是车头对北,另一种是我在用的,先跑一段直线,然后把GPS航向角给到陀螺仪的初值。
所以在此状态我会设置一个1.5s的定时器,以固定速度和固定角度跑直线,当1.5s结束后定时标志位置1,此状态结束,将GPS航向角给到陀螺仪的初值。跳转到下一状态:加速状态。
2. 加速状态:
加速和减速有一个心得就是不要猛的减速,这样会导致车超调,且不能准确减速到目标速度,这个我会在后面的速度决策写出来。
此状态我分了三个状态,大弯道、小弯道、小于45°的直道(根据目标角度和此时角度之差区别的)
每个状态的速度都不一样,让速度和目标角度和此时角度之差的绝对值呈线性变化。在比赛阶段,由于地上都是积水,所以弯道降速尤为重要。
在此状态最重要的一个东西就是,直道判断,当目标角度和此时角度之差小于7°且保持200ms,给个直道的标志位,将GPS航向角重新赋值给陀螺仪,因为陀螺仪在短时间很精确,但是长时间就会出现很大的积分误差,特别在大转弯。所以这个直道处理就可以将陀螺仪积分清零,且GPS航向角是非常准确的,这样对小车的路径是有明显的矫正。当GPS距离小于7时进入减速状态
3.减速状态
减速不要直接给个目标速度或者直接开环给负占空比,我是每个周期减去0.3左右,速度曲线如下图所示,可以使小车平稳的过渡减速状态。
这里在说一下声音距离:因为我发现GPS本身是飘所以GPS距离是不太准确的,所以我利用车头的一个硅麦,将1024us内的ADC的绝对值累加起来再×0.001,可以得到声音强度,离信标近则大,离信标远则小。有些人可能会怕电机加减速会很有噪声影响,但是我使用声音强度是在车降速以后再使用,所以影响不大。
当小车速度降低到设定速度后200ms且声音强度大于7时会进入下一状态:声音状态
4. 声音状态
我是用0核心结算声音角度,然后用ips传到1核心。
至于怎么传不止一个数据,其实很简单,如下图
声音状态下时,以声音角度为此时值,0(车头方向)为目标值,传到PID进行计算然后给到舵机。
在调试过程中,我发现倒车状态特别容易影响,因为声音角度结算周期较长,所以我直接把倒车给删了,加上大翅膀,很有用,节省时间。
当lora变化时,则进入加速状态,由此不断循环。
lora放在100ms的中断里,放在主循环或者10ms的中断会出现切换有问题。