PID算法

PID 算法介绍

PID算法,即比例-积分-微分控制算法,是一种广泛应用于工业控制系统中的反馈控制策略。它通过三个部分的组合来调节控制器的输出,以提高系统的稳定性和响应速度。以下是PID控制算法的三个主要组成部分:

  1. 比例控制(Proportion)

    • 响应当前的误差(设定点与实际点之间的差距)。
    • 控制输出与误差成正比,比例系数为 K p K_p Kp
    • 优点:能够快速减小误差。
    • 缺点:可能导致稳态误差。
  2. 积分控制(Integral )

    • 针对过去的误差进行累积,以消除稳态误差。
    • 控制输出与误差的积分成正比,积分系数为 K i K_i Ki
    • 优点:消除了稳态误差。
    • 缺点:可能导致系统过冲或响应速度变慢。
  3. 微分控制(Differential)

    • 根据误差的变化率进行预测,提供额外的阻尼作用。
    • 控制输出与误差的变化率成正比,微分系数为 K d K_d Kd
    • 优点:提高系统的稳定性,减少过冲。
    • 缺点:对噪声敏感,可能导致控制输出波动。

PID控制公式

PID控制器的输出可以用以下公式表示:
u ( t ) = K p ⋅ e ( t ) + K i ∫ 0 t e ( τ ) d τ + K d d e ( t ) d t u(t) = K_p \cdot e(t) + K_i \int_{0}^{t} e(\tau) d\tau + K_d \frac{de(t)}{dt} u(t)=Kpe(t)+Ki0te(τ)dτ+Kddtde(t)

  • u ( t ) u(t) u(t) 是控制器的输出。
  • e ( t ) e(t) e(t) 是当前误差,即目标值与当前值的差。
  • K p K_p Kp K i K_i Ki K d K_d Kd是各部分的增益参数。

应用

PID控制广泛应用于温度控制、速度控制、压力控制等各种自动化系统中。通过适当调整 K p K_p Kp K i K_i Ki K d K_d Kd 值,可以使控制系统达到所需的响应性能。

C# 算法代码

代码解释

  1. PIDController 类

    • 包含 PID 控制器的逻辑。
    • 构造函数接受三个参数:比例增益(Kp)、积分增益(Ki)和微分增益(Kd)。
  2. Compute 方法

    • 输入:目标值(setpoint)、测量值(measuredValue)和时间间隔(deltaTime)。
    • 计算当前的误差。
    • 更新积分值,累加误差。
    • 计算当前误差的变化率(微分)。
    • 计算并返回控制输出。
/// <summary>
/// PID控制器
/// </summary>
public class PIDController
{
    private float _kp; // 比例增益  
    private float _ki; // 积分增益  
    private float _kd; // 微分增益  

    private float _previousError; // 上一个误差值  
    private float _integral; // 积分值  

    // 构造函数,初始化PID参数  
    public PIDController(float kp, float ki, float kd)
    {
        _kp = kp;
        _ki = ki;
        _kd = kd;
    }

    /// <summary>
    /// 计算控制输出的方法
    /// </summary>
    /// <param name="setPoint">目标值</param>
    /// <param name="measuredValue">测量值</param>
    /// <param name="deltaTime">时间间隔</param>
    /// <returns>结果数据</returns>
    public float Compute(float setPoint, float measuredValue, float deltaTime)
    {
        // 计算当前误差  
        var error = setPoint - measuredValue; 
        
        // 更新积分值  
        _integral += error * deltaTime; 
        
        // 计算误差的变化率(微分)  
        var derivative = (error - _previousError) / deltaTime; 
        
        // 计算控制输出 P+I+D
        var output = _kp * error + _ki * _integral + _kd * derivative;
        
        // 更新上一个误差值  
        _previousError = error;
        
        // 返回计算的控制输出  
        return output; 
    }
}
  1. Uav 类(Unity脚本)
    • 将挂载对象移动到目标高度。
using UnityEngine;

public class Uav: MonoBehaviour
{
    public float targetHeight = 10f; //目标高度
    private PIDController _pidController;

    [Range(0, 1f)] public float kp = 1.0f; // 比例增益
    [Range(0, 1f)] public float ki = 0.1f; // 积分增益
    [Range(0, 0.1f)] public float kd = 0.01f; // 微分增益

    void Start()
    {
        _pidController = new PIDController(kp, ki, kd);
    }

    void Update()
    {
        var outHeight = _pidController.Compute(targetHeight, transform.position.y, Time.deltaTime);
        //更新高度
        transform.position += new Vector3(0, outHeight, 0) * Time.deltaTime;
    }
}
  1. C#控制台示例
using System;
// 示例代码
class Program
{
    static void Main(string[] args)
    {
        // 创建PID控制器实例,设置增益值
        PIDController pid = new PIDController(1.0, 0.1, 0.01);

        double setpoint = 100; // 目标值
        double measuredValue = 20; // 系统当前值
        double deltaTime = 0.1; // 时间间隔(秒)

        for (int i = 0; i < 100; i++)
        {
            // 计算控制器输出
            double output = pid.Compute(setpoint, measuredValue, deltaTime);
            Console.WriteLine($"控制输出: {output}");

            // 模拟系统响应,更新当前值(这里只是一个简单模拟,你可以替换为真实系统更新逻辑)
            measuredValue += output * deltaTime; // 假设控制输出直接影响当前值

            // 等待一段时间(比如100毫秒)以模拟下一个循环
            System.Threading.Thread.Sleep((int)(deltaTime * 1000));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又来077

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值