平衡车直立PID调节总结

    苦战一周,终于使平衡小车站了起来,PID无疑是我从学习板子至今遇到最困难的东西了,并不是说它原理有多么复杂,只是想让小车的效果更佳,调参的过程无疑是漫长而艰难的。

    连续调了俩天的参数后,今天我的小车终于可以稳稳立起来,所以也就程序编写以及参数的整定来做一个小的总结。

    平衡车是一个闭环控制系统,要保持直立静止需要两级PID,直立环PD调节器依据IMU(惯性测量单元我使用的是MPU6050)的数据来控制小车的运动状态,速度环PI调节器依据编码器的数据来调节车轮的转速以及运动状态,使俩轮趋向静止的状态哦。若要控制方向还需要一个转向环,这个以后再做介绍。

    对于平衡车来说, 直立环是最为重要的,而PID的调节也是一级一级的来调节,所以我们从直立PD环开始调节。

    直立PD环代码如下

/**************************************************************************
函数功能:直立PD控制
入口参数:角度、角速度
返回  值:直立控制PWM
**************************************************************************/
int balance(float Angle,float Gyro)
{  
   float Bias,kp=410,kd=1.4;
	 int balance;
	 Bias=Angle-ZHONGZHI;       //===求出平衡的角度中值 和机械相关
	 balance=kp*Bias+Gyro*kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 
	 return balance;
}

    该函数入口参数为角度以及加速度,机械中值为小车不上电平衡时的角度,在调节直立环时,先将速度环的参数都置零使直立环单独工作,参数整定要做的俩件事是判断参数极性和判断参数的大小,首先我们判断Kp、Kd的极性,当倾角增大时PWM占空比应增大,所以显然它们都应该为正值,然后我们先确定Kp再确定Kd,Kp我们逐渐增大直至小车有明显低频震荡,注意,Kp的值越大,系统的反应越快,但是平衡曲线的震荡就较大,我们需要引入Kd参数来减缓震荡,定住Kd后从零逐渐增大Kd,直至小车对对角度变化十分敏感,且几乎没有震荡时,这时PD调节器的参数整定就完成了。

    我们将整定后的PD调节器的参数乘0.6得到最终的PD调节器参数,接下来我们就继续调节速度PI调节器。

    速度PI环代码如下

/**************************************************************************
函数功能:速度PI控制 修改前进后退速度,请修Target_Velocity,比如,改成60就比较慢了
入口参数:左轮编码器、右轮编码器
返回  值:速度控制PWM
**************************************************************************/
int velocity(int encoder_left,int encoder_right)
{  
    static float Velocity,Encoder_Least,Encoder,Movement;
	  static float Encoder_Integral;
	  float kp=-100,ki=-0.5;
	  //=============速度PI控制器=======================//	
		Encoder_Least =(Encoder_Left+Encoder_Right)-0;                    //===获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零) 
		Encoder *= 0.8;		                                                //===一阶低通滤波器       
		Encoder += Encoder_Least*0.2;	                                    //===一阶低通滤波器    
		Encoder_Integral +=Encoder;                                       //===积分出位移 积分时间:10ms
		Encoder_Integral=Encoder_Integral-Movement;                       //===接收遥控器数据,控制前进后退
		if(Encoder_Integral>10000)  	Encoder_Integral=10000;             //===积分限幅
		if(Encoder_Integral<-10000)	Encoder_Integral=-10000;              //===积分限幅	
		Velocity=Encoder*kp+Encoder_Integral*ki;                          //===速度控制	
		return Velocity;
}

    调节要使俩编码器和的值趋向于零,首先确定Kp、Ki参数的极性,先将直立环参数都置为零,当俩参数都为正时(Kp=50,Ki=0.2),转动一个电机另一个电机会向反方向转动,这样的结果是不正确的,小车将无法静止,我们要让小车停下来,小车需要行驶更快的速度去追小车,小车运动的速度越快,追的速度也越快,这是正反馈的效果。我们将参数改为负数时(Kp=-50,Ki=-0.2),转动一个车轮,俩车轮都开始转动,速度逐渐达到最大值,这样的结果是正确的,是典型的正反馈效果。

      在平衡车中Ki参数的大小为Kp的1/200,所以我们只需整定Kp即可,加入PD调节器,一同调节,找到使小车状态最好的参数即可。

      以上就是平衡车直立及速度环参数整定的一些经验,平衡车是我接触的第一个使用PID调节的项目,感觉还是很有难度的,但是看着参数改变而带来的显著改进以及随着优化效果逐渐优化带来的喜悦也是令人振奋的,在电赛控制类中,PID是极其重要的部分,以后我也会做更多的项目来练习编写程序以及整定参数的能力。

  • 68
    点赞
  • 578
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
以下是一个简单的PID控制平衡小车直立程序示例: ```python import time #定义PID控制器的参数 Kp = 10 Ki = 0.1 Kd = 3 #定义误差累积变量和上一次误差变量 error_sum = 0 last_error = 0 #定义小的初始速度和转向角度 velocity = 0 angle = 0 #定义小控制函数 def control(error): global error_sum, last_error, velocity, angle #计算每个参数的误差 P_error = error I_error = error_sum + error D_error = error - last_error #计算控制量 output = Kp * P_error + Ki * I_error + Kd * D_error #更新误差累积变量和上一次误差变量 error_sum += error last_error = error #计算小的速度和转向角度 velocity += output angle += velocity #限制速度和角度的范围 if velocity > 100: velocity = 100 elif velocity < -100: velocity = -100 if angle > 30: angle = 30 elif angle < -30: angle = -30 #返回小的速度和转向角度 return velocity, angle #模拟小的运动 while True: #获取小当前的角度 current_angle = get_angle() #计算误差 error = 0 - current_angle #调用控制函数获取速度和角度 velocity, angle = control(error) #控制运动 move(velocity, angle) #等待一段时间 time.sleep(0.01) ``` 在这个程序中,我们首先定义了PID控制器的参数,包括比例系数Kp、积分系数Ki和微分系数Kd。接着,我们定义了误差累积变量和上一次误差变量,并设置小的初始速度和转向角度。在控制函数中,我们首先计算每个参数的误差,然后计算控制量,并根据控制量更新误差累积变量和上一次误差变量。最后,我们限制速度和角度的范围,并返回小的速度和转向角度。在模拟小的运动过程中,我们首先获取小当前的角度,然后计算误差,并调用控制函数获取速度和角度。最后,我们控制运动,并等待一段时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值