电路笔记 控制(PID):Proportional–integral–derivative controller 比例-积分-微分控制器与仿真

news2024/9/20 9:30:44
  • PID控制(Proportional-Integral-Derivative Control)是一种常用的反馈控制算法,广泛应用于自动控制系统中。PID控制器通过对比例、积分和微分三项的计算,生成控制输出来调节系统的行为,以使其达到期望的目标值。

PID控制器的三个组成部分

  1. 比例控制(P - Proportional Control):

    • 比例控制部分根据当前误差值 e ( t ) e(t) e(t) 进行调节。它产生的控制输出与误差成正比:
      P ( t ) = K p ⋅ e ( t ) P(t) = K_p \cdot e(t) P(t)=Kpe(t)
    • K p K_p Kp比例增益,决定了系统对误差的响应速度和幅度。
    • 优点:能够快速响应误差变化。
    • 缺点:仅使用比例控制可能导致稳态误差,即系统可能无法完全达到目标值。
  2. 积分控制(I - Integral Control):

    • 积分控制部分根据误差的累积来调节控制输出,目的是消除稳态误差:
      I ( t ) = K i ⋅ ∫ 0 t e ( τ ) d τ I(t) = K_i \cdot \int_0^t e(\tau) d\tau I(t)=Ki0te(τ)dτ
    • K i K_i Ki积分增益,决定了系统对累积误差的修正力度。
    • 优点:可以消除稳态误差,使系统达到目标值。
    • 缺点:积分控制可能导致系统反应过慢或产生积分饱和(即积分项积累过多,导致输出过大)。
  3. 微分控制(D - Derivative Control):

    • 微分控制部分根据误差的变化率来调节控制输出,主要用于预测误差的变化趋势并进行提前修正:
      D ( t ) = K d ⋅ d e ( t ) d t D(t) = K_d \cdot \frac{de(t)}{dt} D(t)=Kddtde(t)
    • 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 \cdot \int_0^t e(\tau) d\tau + K_d \cdot \frac{de(t)}{dt} u(t)=Kpe(t)+Ki0te(τ)dτ+Kddtde(t)
其中:

  • u ( t ) u(t) u(t)控制器的输出,用于调节系统。
  • e ( t ) = r ( t ) − y ( t ) e(t) = r(t) - y(t) e(t)=r(t)y(t)系统的误差 r ( t ) r(t) r(t) 是目标值, y ( t ) y(t) y(t) 是实际输出。

调节PID控制器的参数

  • K p K_p Kp(比例增益):
    • 增大 K p K_p Kp会使系统对误差更加敏感,响应更快,但可能导致系统不稳定和振荡。
  • K i K_i Ki(积分增益):
    • 增大 K i K_i Ki 可以消除稳态误差,但可能导致系统过调,反应变慢。
  • K d K_d Kd(微分增益):
    • 增大 K d K_d Kd 可以减小系统的振荡和过冲,但对噪声敏感,需要谨慎设置。

c语言代码实现

  • PID控制器的C代码示例
#include <stdio.h>

// 定义PID结构体
typedef struct {
    float Kp;          // 比例增益
    float Ki;          // 积分增益
    float Kd;          // 微分增益
    float prev_error;  // 上一次的误差
    float integral;    // 误差的积分
} PIDController;

// 初始化PID控制器
void PID_Init(PIDController *pid, float Kp, float Ki, float Kd) {
    pid->Kp = Kp;
    pid->Ki = Ki;
    pid->Kd = Kd;
    pid->prev_error = 0;
    pid->integral = 0;
}

// 计算PID控制输出
float PID_Compute(PIDController *pid, float setpoint, float measured_value, float dt) {
    // 计算误差
    float error = setpoint - measured_value;

    // 计算比例项
    float P_out = pid->Kp * error;

    // 计算积分项
    pid->integral += error * dt;
    float I_out = pid->Ki * pid->integral;

    // 计算微分项
    float derivative = (error - pid->prev_error) / dt;
    float D_out = pid->Kd * derivative;

    // 保存当前误差以供下次使用
    pid->prev_error = error;

    // 计算最终的控制输出
    float output = P_out + I_out + D_out;

    return output;
}

int main() {
    // 创建一个PID控制器
    PIDController pid;
    
    // 初始化PID控制器参数(Kp, Ki, Kd)
    PID_Init(&pid, 1.0, 0.1, 0.01);

    // 设定目标值(setpoint)
    float setpoint = 100.0;

    // 当前测量值
    float measured_value = 90.0;

    // 时间步长(假设为0.1秒)
    float dt = 0.1;

    // 计算PID控制器的输出
    float output = PID_Compute(&pid, setpoint, measured_value, dt);

    // 输出结果
    printf("PID Output: %f\n", output);

    return 0;
}

python仿真

# 代码来自:https://ethanr2000.medium.com/using-pid-to-cheat-an-openai-challenge-f17745226449
# 系统建模方程 https://ctms.engin.umich.edu/CTMS/index.php?example=InvertedPendulum&section=SystemModeling
# sudo apt-get install python-opengl
# pip install gym==0.16.0
# pip install pillow==9.0.0 原因:https://github.com/MannLabs/alphapept/issues/561
# pip install imagio # 用于保存结果,使用的numpy版本为1.20.1
import imageio
import gym

env = gym.make("CartPole-v1")
observation = env.reset()

Kp = 135
Ki = 96.5
Kd = 47.5

force = 0
integral = 0

writer = writer = imageio.get_writer('output.gif',  mode='?') # https://imageio.readthedocs.io/en/stable/reference/userapi.html
for _ in range(100):
    img = env.render(mode = "rgb_array")  # 捕捉当前帧的图像
    writer.append_data(img)

    env.render()
    observation, reward, done, info = env.step(force)

    velocity = observation[1]
    angle = observation[2]
    angular_velocity = observation[3]

    integral = integral + angle

    F = Kp*(angle) + Kd*(angular_velocity) + Ki*(integral)

    force = 1 if F > 0 else 0
    if done:
      observation = env.reset()
      integral = 0

env.close()
writer.close()

效果

  • 实际运行比这个gif展示的更稳定,摆动速度也是不同的
    在这里插入图片描述

CG

  • https://github1s.com/m-lundberg/simple-pid/blob/master/simple_pid/pid.py#L101-L161
  • pip install mujoco # mujoco是和gym同类的仿真工具
  • https://mujoco.readthedocs.io/en/latest/python.html
  • https://github.com/openai/mujoco-py?tab=readme-ov-file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用人类反馈优化文本摘要质量

人工智能咨询培训老师叶梓 转载标明出处 精准评估和提升模型生成文本的质量&#xff0c;尤其是自动文摘的质量&#xff0c;成为了一个日益突出的挑战。传统的评估方法&#xff0c;如ROUGE指标&#xff0c;虽然在一定程度上能够衡量摘要的相关性&#xff0c;但往往无法全面反映…

Java算法:最大间距

前言 在处理数据密集型应用时&#xff0c;提高查询性能显得尤为关键。 解决最大间隔问题——即确定一组数值中最宽的相邻元素距离——是此类任务中的一大挑战。 该问题不仅在算法竞赛中常见&#xff0c;也是软件工程师面试的一个焦点&#xff0c;解决方法多样&#xff0c;包…

【B题第三套完整论文已出】2024数模国赛B题第三套完整论文+可运行代码参考(无偿分享)

基于多阶段优化的电子产品质量控制与成本管理研究 摘要 随着现代制造业和智能化生产的发展&#xff0c;质量控制和生产优化问题成为工业管理中的重要研究课题。本文针对电子产品生产过程中质量控制和成本优化中的问题&#xff0c;基于系统优化和决策分析思想&#xff0c;通过…

【C++ Primer Plus习题】12.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "Cow.h" u…

空气能热泵热水器

空气能热泵热水器压缩机把低温低压气态冷媒转换成高压高温气态&#xff0c;压缩机压缩功能转化的热量为q1&#xff0c;高温高压的气态冷媒与水进行热交换&#xff0c;高压的冷媒在常温下被冷却、冷凝为液态。这过程中&#xff0c;冷媒放出热量用来加热水&#xff0c;使水升温变…

机器学习数学公式推导之降维

文章目录 降维线性降维-主成分分析 PCA损失函数SVD 与 PCoASVD 的基本形式SVD 的计算p-PCA 小结 P22 (系列五) 降维1-背景 本文参考 B站UP: shuhuai008 &#x1f339;&#x1f339; 降维 我们知道&#xff0c;解决过拟合的问题除了正则化和添加数据之外&#xff0c;降维就是最…

数据链路层与ARP协议

一.认识识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内 容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等; 以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等; 以太网是当前应用…

【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

2024年【金属非金属矿山(露天矿山)安全管理人员】考试题及金属非金属矿山(露天矿山)安全管理人员最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员考试题参考答案及金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&#xf…

Java魔板游戏软件(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【第0007页 · 数组】数组中重复的数据(如何实现数组的原地修改)

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0007页 数组中重复的数据 今天&#xff0c;我们来看一个在实际工作中运用不多&#xff0c;但是对于一些算法题还是有必要的奇技淫巧——数组的原地修…

基于开源链动 2 + 1 模式、AI 智能名片与 S2B2C 商城小程序的用户忠诚度计划

摘要&#xff1a;本文深入探讨了在商业环境中执行用户忠诚度计划的创新途径。通过整合开源链动 2 1 模式、AI 智能名片以及 S2B2C 商城小程序等先进元素&#xff0c;从提供福利、解决问题和创造赚钱机会三个核心方面展开详细阐述。研究表明&#xff0c;这些新技术和新模式的有…

LLM大模型:将爬虫与大语言模型结合

摘要 Web自动化是一种重要技术&#xff0c;通过自动化常见的Web操作来完成复杂的Web任务&#xff0c;可以提高运营效率并减少手动操作的需要。 传统的实现方式&#xff0c;比如包装器&#xff0c;当面对新的网站时&#xff0c;面临着适应性和可扩展性的限制。 另一方面&…

国内短剧系统怎么搭建以及都需要那些资质?

聊到国内短剧&#xff0c;相信大家都不陌生&#xff0c;在各大短视频平台可谓是火的一批&#xff0c;您或许有想加入进来的想法&#xff0c;或是已经有规划还未实现的&#xff0c;请停下脚步&#xff0c;耐心看完该文章&#xff0c;相信一定会对你有所帮助的。本文介绍短剧平台…

C语言中结构体struct和联合体union的区别

C语言 文章目录 C语言前言一、什么是结构体二、什么是联合体三、结构体和联合体的区别 前言 一、什么是结构体 在C语言中&#xff0c;结构体指的是一种数据结构&#xff0c;是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等&#xff0c;用以实现较复杂的数…

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章&#xff0c;专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构&#xff0c;它最经典的应用就是给定一个序列&#xff0c;找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…

SnapGene 5.3.1下载安装教程百度网盘分享链接地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 SnapGene介绍 SnapGene 5.3.1下载安装教程百度网盘分享链接地址&#xff0c;SnapGene 是一款由美国公司开发&#xff08;后被收购&#xff09;的分子生物学软件&#xff0c;…

Deepspeed框架学习笔记

DeepSpeed 是由 Microsoft 开发的深度学习优化库,与PyTorch/TensorFlow等这种通用的深度学习框架不同的是,它是一个专门用于优化和加速大规模深度学习训练的工具,尤其是在处理大模型和分布式训练时表现出色。它不是一个独立的深度学习框架,而是依赖 PyTorch 等框架,扩展了…

Vue 向标签中传入 this

我曾经问过 chatgpt 这个问题&#xff0c;chatgpt 说不行&#xff01; 但是&#xff0c;chatgpt 说的就算吗&#xff1f; 来试试吧&#xff1a; https://andi.cn/page/621733.html 当然是可以的&#xff01;

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_6【二十五】

目前很多软件都需要票票才可以使用完全的功能。纯免费的功能性app已经很少见了。 今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。每个使用修改方法不一定适用于所有app。只是给你…