卓晴老师公开的直立车方案是众多司机的入门教程,但直立车已经出现很多届了,控制方案也演变的多种多样,传统方案和新出现的方案相比已经略显吃力,简单介绍一下我使用的方案。
直立控制使用串级PID,外环角度,内环角速度,只需要通过传感器采集一个轴的数据即可。角度环10ms进行一次控制,角速度环2ms控制一次,外环输出先加一个限幅才传给内环,实测效果非常稳定,不会震荡,也不会出现明显的反应滞后。很多人问过我单环和串级的区别在哪里,我不是控制相关专业,也没有学过相关课程,只是凭我实际调试的效果感觉,串级和单环应该是殊途同归的,只是串级的参数更容易整定,且串级在每一级之间都可以做限幅或者其他特殊处理,串级PID几乎已经成了现在四轴飞行器的标配。
速度控制是传统方案最难搞的一部分,直立车不同于四轮,四轮的速度控制为负反馈调节,符合正常人的程序控制思路,但直立车的速度控制为正反馈调节,不能用通用的方式来控制。直立车的速度控制要通过调整车子的角度来改变,车身前倾,重心靠前,车子要保持平衡必然会加快电机转动,如果在平衡状态下要主动完成前倾的过程,就需要先让电机略微的减速,也就是说要加速,先减速。减速也是同理,要减速,先加速。传统方案就会出现直立环和速度环孰强孰弱的纠结问题,速度控制对于直立控制是一个干扰。
速度环采用串级PID将完全避免了这种问题,只需要将速度环的结果叠加在平衡角度上即可,速度差直接对应了一个平衡角度,不需要再考虑复杂的正反馈过程,傻瓜式操作一步到位,简单又好用。
转向控制,曾经有大神在论坛上开帖子说直立车的转向才是它的核心,我越来越表示同意。卓老师的传统方案中仅用简单的比例来控制转向,慢速的时候也就凑合用吧,一旦速度上来以后就会发现太难调了,速度、电池电压、角度全都会影响转向效果,要想更好的控制转向只能另寻他法。
动态前瞻、动态PID、模糊控制、棒棒法结合PID,各种各样的方法都有,我则想出了一种技术报告上从未出现过的方案,而我这个方案在最开始提出的时候被很多人否定过,我第一次在逐飞群里说的时候被北科大佬否定了,被诸葛大神也否定过,跟自己的老学长们说了,最后被怼的是体无完肤,被所有学长持统一意见的全盘否定。。。。。。但我最终坚持了自己的想法并且取得了成功,应该是一开始我没能给学长们表达清我的意思吧。直接使用陀螺仪控制转向。如果使用传统方案控制转向,假设摄像头采集并处理完一帧图像用时20ms,那么控制频率就是50Hz,个人感觉这个频率太低了,而使用陀螺仪的角速度进行转向,我就可以做到500Hz甚至1KHz,转向的连贯性和柔和性将大大提升。使用传感器数据作为外环,陀螺仪Z轴角速度作为内环可以明显的提升转向效果,响应速度也比传统方案快很多,几乎不需要做任何的特殊处理。
最后说下MPU6050,这款陀螺仪在第十二届才被允许使用,其自带了DMP,最高频率200Hz,足够我们的直立控制,也可以选择自己读取原始数据再做姿态解算。测试了几种常用的姿态解算算法,发现均会不同程度的受快速加减速的影响,而自带的DMP变现优异,在快速加减速的时候角度仍非常稳定正确,最后使用了DMP直接读取角度。但发现一个问题一直未能搞明白,一旦开启DMP以后,无论如何设置频率和低通滤波,输出的角速度都跟不使用DMP时不太一样,同样的参数无法使用,只能重新调参,网上也没有找到合理的解答,且DMP库不开源,暂且认为DMP会强制开启什么内部的滤波吧。