智能车制作——速度环PID

  做了智能车写这个做个记录,各位大佬勿喷。

PID控制器

  PID 控制器(比例-积分-微分控制器)是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法。通俗的说,它可以给出使执行器(电机)快速准确到达目标的“指导方案”。

反馈

  反馈是指将系统输出量通过恰当的检测装置,返回到输入端,与输入量进行比较,并以某种方式改变输入,进而影响系统功能的过程。

开环与闭环

  在智能车控制中开环意味着电机的PWM是我们自己随便给的一个固定值:而闭环系统的电机PWM是PID控制器的输出。

PID组成

  PID 实际上是一个作用于闭环系统的控制算法,由三个部分组成,分别是 P 比例环节,I 积分环节,D 微分环节。
在这里插入图片描述

比例环节

  PID 比例控制器实际上就是个放大倍数可调的放大器,即△P=Kp×e,式中Kp为比例增益,即Kp可大于1,也可小于1;e为控制器的输入,也就是测量值与给定值之差,又称为偏差。
  PID 比例控制有个缺点,就是会产生余差,要克服余差就必须引入积分作用。

积分环节

  控制器的积分作用就是为了消除自控系统的余差而设置的。所谓积分,就是随时间进行累积的意思,即当有偏差输入e存在时,积分控制器就要将偏差随时间不断累积起来,也就是积分累积的快慢与偏差e的大小和积分速度成正比。只要有偏差e存在,积分控制器的输出就要改变,也就是说积分总是起作用的,只有偏差不存在时,积分才会停止。

微分环节

  微分项主要是用来加快系统反应的,但如果微分作用过强,则可能由于变化太快二引起自身震荡。

PID代码理解

{
本次误差 = 目标值-实际值
P输出 =Kp 本次误差
I输出 += Ki
本次误差
D输出 =Kd *(本次误差-上次误差)
ID输出 = P输出+I输出+D输出
上次误差 = 本次误差
}
  注意要进行 积分限幅,即将积分项做一个最大最小限制

位置式与增量式

  上面的PID理解也就是位置式PID,下面是增量式PID的理解
{
本次误差 = 目标值-实际值
P输出 =Kp (本次误差-上次误差)
I输出 = Ki
本次误差
D输出 =Kd (本次误差-2上次误差+上上次误差)
ID输出 += P输出+I输出+D输出
上上次误差=上次误差
上次误差 = 本次误差
}
即:

void Left_Speed_Control()
{
  float Left_Speed_Erro = 0.0 ;       //左电机误差
  Left_Speed_Erro     = Speed_Goal - Left_Encoder ;   //Left_Encoder :编码器反馈值
  Left_Speed_PID.OUT += (Left_Speed_PID.P * (Left_Speed_Erro - Left_Speed_Lasterro)  +
		  	  	  	  	 Left_Speed_PID.I * Left_Speed_Erro +
						 Left_Speed_PID.D * (Left_Speed_Erro - 2 * Left_Speed_Lasterro + Left_Speed_Preverro));
  Left_Speed_OUT      =  Range_protect((int)Left_Speed_PID.OUT,-9000,9000);   //输出限幅
  Left_Speed_Preverro = Left_Speed_Lasterro ;
  Left_Speed_Lasterro = Left_Speed_Erro ;
}

  增量式与位置式主要区别:
    1、位置式PID的积分项是以前所有的误差和,容易产生大的累积误差,而增量式仅与最近几次有关,影响小
    2、位置式PID需要进行积分限幅和输出限幅,而增量式PID只需要输出限幅。

速度环位置式与增量式调参

  在调位置式速度环时我们先加大Kp值,同时令Ki、Kd为0,查看编码器值和目标值的差值,当反馈回来的编码器值在目标值上下震荡时加入Ki值即可。
  通过上面的代码理解我们可以知道增量式的I就是位置式的P,因此对于增量式我们先加I,再加P,实际现象中当我们的i给很小时电机都能达到目标值。

  我们通过调参要达到的效果是:可以明显看到波形趋于平滑且编码器上下震荡范围小,当我们突然改变目标速度时,编码器值能很快且平滑到达改变后的目标值。

### 关于智能车控制中的速度环PI控制器 #### 速度环PI控制器概述 在智能车控制系统中,速度环PI(比例积分)控制器是一种常用的闭环控制策略。该控制器能够有效调节电机转速,使其跟踪设定的目标速度。通过调整比例(P)和积分(I)参数,可以优化系统的动态响应特性,确保快速加速和平稳减速。 #### PI控制器的工作原理 PI控制器由两部分组成:比例项和积分项。比例项根据当前误差(即期望值与实际测量之间的差异)成正比地调整输出;而积分项则累积过去的误差,用于消除静态偏差。具体来说: - **比例系数 (Kp)** 影响系统对瞬态变化的反应灵敏度; - **积分时间常数 (Ti)** 或者说积分增益 Ki=1/Ti 决定了历史误差积累的速度以及最终达到稳定状态所需的时间长度。 对于智能车辆而言,在设计速度环路时通常会先配置好硬件接口,比如初始化电机、驱动器及编码器等组件[^1]。接着便是精心挑选适合应用场景下的P-I参数组合,这往往依赖于实验测试与经验总结相结合的方式来进行微调直至获得满意的性能表现[^3]。 #### 实现方法示例 下面给出一段简单的Python伪代码片段作为参考,展示了如何利用基本的比例积分运算逻辑来构建一个简易版的速度环PI控制器: ```python class SpeedController: def __init__(self, kp, ki): self.kp = kp # Proportional gain self.ki = ki # Integral gain self.integral = 0 # Accumulated error over time def update(self, setpoint, measured_value, dt): error = setpoint - measured_value self.integral += error * dt output = self.kp * error + self.ki * self.integral return output # Example usage of the speed controller class controller = SpeedController(kp=1.5, ki=0.8) target_speed = 100 # Desired RPM or other units depending on your application current_speed = read_encoder() # Function to get current motor speed from encoder dt = calculate_time_step() control_signal = controller.update(target_speed, current_speed, dt) apply_control(control_signal) # Send control signal to motor driver ``` 此段代码定义了一个`SpeedController`类,它接受两个参数——kp 和ki 来初始化对象实例,并提供了一个名为update的方法用来计算新的控制指令。当应用这个模型时,需要定期调用update 函数并将最新的目标速度和测得的实际速度传递给它,从而得到下一步应该施加给马达的动作量。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值