✅作者简介:大家好我是:麦克斯科技,希望一起努力,一起进步!
个人主页:麦克斯科技
系列专栏:两轮平衡小车制作保姆式教程
️非常欢迎大家在评论区留言交流,互相学习!
提前声明:博客中给出的代码经过多个项目测试,实测能用,性能稳定,请大家放心使用!
本系列博客将从硬件到软件详细介绍“如何制作一辆两轮自平衡小车”,笔者毫无保留,以最通俗易懂的语言,以最简单的实现方案,分享自己从0到1制作平衡小车的全过程,相信跟着我的教程,大家也能顺利制作一台属于自己的平衡车。系列专栏:两轮平衡小车制作保姆式教程
首先,给大家提前交个底,其实制作一台平衡小车并不难,用到的主要模块就是陀螺仪,而最主要的控制算法就是PID算法,而且平衡小车对陀螺仪与PID算法的掌握程度要求并不是很高,所以适合初学者来作为项目练手。
该系列教程一共分为4个板块,分为《硬件选型》、《软件模块》、《直立环、速度环、转向环》、《调参保姆级教程》,4个板块条理清晰,层次分明,简明扼要,请大家跟着我开始学习吧!
直立环、速度环、转向环的所有代码都在上一篇博客,在看这篇博客前,建议大家先学习:两轮平衡小车制作保姆式教程(3)——直立环、速度环、转向环
(1)机械中值就是小车直立状态下的绕x轴的俯仰角pitch,对这个机械中值的要求不是特别高,因为在速度环的作用下,小车在一定范围内的机械中值下都能保持平衡(加入速度环后,机械中值的影响不是很大),没必要按网上那种两边倒下的值加起来取平均值的方法来取机械中值。
(2)我们除了要用到绕x轴方向的俯仰角外,还需要绕z轴方向的偏航角来使小车的平衡性能更好。
err=Car_zero-Angle; //期望值-实际值,这里期望小车平衡,因此期望值就是机械中值
pwm_zhili=zhili_Kp*err+Gyro*zhili_Kd;//计算平衡控制的电机PWM
直立的要求是小车往哪边倒,小车就往哪边加速前进,使小车得以平衡。
先给一个大的P值,例如P=100,在单独的直立环作用下,倾倒小车,观察小车的运动状态,正确Kp极性下,运动状态是小车往哪边倒,轮子就往哪边转,改变P值的正负使小车的运动状态达到要求。
(1)先把Kp设成一个小的值,若发现轮子不转,则是Kp的值过小。
(2)将Kp的值增大,小车向前倾斜,小车会向前运动;小车向后倾斜,小车会向后运动,但是直立不起来,是因为小车反应得太慢了,原因还是Kp过小。
(3)继续增大Kp,可以看到小车有接近平衡的趋势,但是还是平衡不起来,原因是Kp的值还是小了些。
(4)继续增大Kp,可以看到小车有明显的平衡趋势,平衡效果不错。
(5)根据工程经验,我们要继续增大Kp,直到松手让小车直立时出现低频振荡。
(6)小车出现低频振荡后,根据工程经验,在增大一点Kp后可以引入Kd分量。这里再增大一点Kp,小车出现明显低频振荡,效果符合,此时应快速关闭电源,不能让低频振荡持续太久。
Kd作用是辅助Kp的效果,使小车反应更迅速,达到好的直立效果。
先将直立环Kp置为0,将Kd给一个稍微大一点的值,例如;Kd=100;正确Kd极性下,运动状态是小车往哪边倒,轮子就往哪边转。
(1)恢复Kp的值,先将Kd设成一个较小的值,例如Kd=1;可以看到小车的平衡效果其实比较好,可以做到稳定平衡。但是按照工程实践,我们需要继续增大Kd寻找Kd的临界值,直到小车出现高频振荡。
(2)小车出现高频振荡时,需要迅速关闭电源,避免因为反馈电流过大导致电机驱动或者电池烧毁。
(3)小车出现小范围的高频振荡时,再增大Kd,可以看到小车出现明显的高频振荡。此时,可以停止调节直立环了。
按照工程实践,给直立环的Kp和Kd都乘上0.6(因为我们是按振荡的现象来调的,所以直这里乘以0.6可以让小车平衡)。
小车可以较长时间直立,但是需要手动去干预小车的运动状态,使他维持平衡。但是没有速度环的加持,小车不能够自己在大范围空间内保持长时间直立。
speed_feedback[0]=smartcar_imu.left_motor_speed_cmps;//获取左轮实际值
speed_error[0]=v_target_l-speed_feedback[0];
speed_error[0]=constrain_float(speed_error[0],-speed_err_max,speed_err_max);
speed_integral[0]+=speed_ki*speed_error[0];
speed_integral[0]=constrain_float(speed_integral[0],-speed_integral_max,speed_integral_max);
speed_output[0]=speed_integral[0]+speed_kp*speed_error[0];
speed_output[0]=constrain_float(speed_output[0],-speed_ctrl_output_max,speed_ctrl_output_max);
(1)关闭直立环
(2)给速度环Kp先设立一个比较大的值,给速度环一个目标值,正确的Kp极性下,轮子是正常快速转动的,否则,小车轮子不转。
根据工程实践,速度环的Ki = 1/200*Kp,所以后面我们速度环的Kp与Ki可以一起调。
给Kp一个较小的值,Ki一个更小的值,比Kp小一个数量级,更改Ki的极性观察轮子转动情况,正确的转动情况是,用手将轮子往一个方向转动,小车会按这个方向慢慢增大到最大转速,会出现小范围的振荡属于正常现象,错误极性下,轮子会按手转动的反方向转动,不会按原方向转动到最大。
速度环的Ki = 1/200*Kp,我们只需要调节Kp即可。
(1)打开直立环,在直立环基础上调速度环,以小车的平衡效果为调参的基准。
(2)先将Kp设成一个小的值,可以看到在速度环的加持下,小车的直立效果更好。
(3)但是反馈的效果依旧很慢,所以我们要继续增大速度环Kp。
(4)调节到合适的Kp,小车可以很好保持平衡,同时还具备一定抗击打能力,可以较长时间直立。
(5)但是小车在自己的平衡之中会出现旋转,同时在原地平衡时也会出现短期振荡现象。
(1)小车可以很好保持平衡,同时还具备一定抗击打能力,可以较长时间直立。
(2)原地平衡时也会出现短期振荡现象可以通过增大直立环的Kd和减小速度环的Kp来抵消这个情况,慢慢调整可以达到一个好的效果,这个比较麻烦,需要长时间的耐心。
(3)旋转的情况我们可以通过加入转向环来抑制。
转向环若是为了让小车保持一个方向上的原地静止,所以不需要Kp,仅加入Kd即可。
if(Set_turn==0)
{
PWM_Out=zhuan_Kd*Gyro_Z; //没有转向需求,Kd约束小车转向
}
if(Set_turn!=0)
{
PWM_Out=zhuan_Kp*Set_turn; //有转向需求,Kp为期望小车转向
}
将直立环和速度环关闭,将Kd设为100。正确Kp极性下小车的运动状态是,顺时针转动小车,轮子产生的作用可以抵抗小车顺时针转动,产生对抗旋转的扭矩。
(1)开启直立环和速度环
(2)从小到大调整Kd的值,合适的Kd可以使小车在平衡过程中不发生水平方向的转动
(3)若有平衡过程中小车有旋转趋势,说明Kd的值还是过小,则需要继续增大Kd的值。
(4)若小车出现明显的高频振荡,说明Kd过大了。
拿起小车检测思路是当轮子以较大速度旋转一段时间后,关闭电机;
放下小车的检测思路是当俯仰角过大时关闭电机。
系列专栏:
两轮平衡小车制作保姆式教程