Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】ROS:PID控制算法原理与仿真实现示例

【C++】ROS:PID控制算法原理与仿真实现示例

作者头像
DevFrank
发布于 2024-07-24 07:06:58
发布于 2024-07-24 07:06:58
77201
代码可运行
举报
运行总次数:1
代码可运行

😏1. PID介绍

PID(比例-积分-微分)算法是一种经典的控制算法,常用于控制系统中的反馈控制。它根据当前误差的大小和变化率,计算输出信号来调节控制器的行为,以使系统稳定并达到期望的目标。

PID 算法由三个部分组成:

  1. 比例项(Proportional):该项与当前误差成正比,通过乘以一个比例系数来得到输出信号。比例项的作用是对系统的偏差进行直接补偿,但可能会导致过度调节和震荡。
  2. 积分项(Integral):该项与误差的累积量成正比,通过乘以一个积分系数来得到输出信号。积分项的作用是消除系统的稳态误差,因为它积累了系统历史上产生的误差,并且可以持续地进行补偿。
  3. 微分项(Derivative):该项与误差的变化率成正比,通过乘以一个微分系数来得到输出信号。微分项的作用是预测误差的未来变化趋势,以便提前调整控制器的输出,从而使系统响应更加平滑和稳定。

PID 算法的输出信号计算公式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output = Kp * Error + Ki * (Error) dt + Kd * d(Error)/dt

其中,Kp、Ki 和 Kd 分别是比例、积分和微分系数,Error 是当前误差,∫(Error) dt 是误差的积分,d(Error)/dt 是误差的导数。

PID 算法的主要思想是根据当前误差、误差的变化以及误差的积分情况来综合调节控制器的输出信号。通过合理选择和调整比例、积分和微分系数,可以使系统的响应快速而稳定地收敛到期望状态,并具有较小的超调和震荡。

实际工程中需要根据系统特性对参数进行调试和优化,以获得最佳的控制效果(稳定性、快速性和准确性)。

😊2. C++实现示例

PID控制原理C++实现示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
//#include "matplotlibcpp.h" // 如果配了matplotlibcpp,可以画图表示

//namespace plt = matplotlibcpp;

class PIDController {
public:
    PIDController(double kp, double ki, double kd)
            : kp_(kp), ki_(ki), kd_(kd), integral_(0.0), previous_error_(0.0) {}

    /**
    * @brief 计算PID控制器的输出
    * @param setpoint 设定值
    * @param feedback 反馈值
    * @param dt 时间间隔
    * @return
    */
    double compute(double setpoint, double feedback, double dt) {
        double error = setpoint - feedback; // 误差,比例项使得控制系统能够迅速响应并逼近设定值
        integral_ += error * dt; // 累积误差,积分项用于补偿系统的稳态误差,即长时间内无法通过比例项和微分项完全纠正的误差
        double derivative = (error - previous_error_) / dt; // 误差的导数,微分项帮助控制系统更快地响应变化,并减小超调和震荡
        double output = kp_ * error + ki_ * integral_ + kd_ * derivative; // 控制量计算
        previous_error_ = error;
        return output;
    }

private:
    double kp_;
    double ki_;
    double kd_;
    double integral_;
    double previous_error_;
};

int main() {
    double setpoint = 10.0;
    double feedback = 0.0;
    double dt = 0.1;

    // 创建一个PID控制器对象
    PIDController pid(0.5, 0.2, 0.1);

    // 存储时间和控制量的向量
    //std::vector<double> time;
    //std::vector<double> control;

    // 模拟控制循环
    for (int i = 0; i < 100; ++i) {
        // 计算控制量
        double output = pid.compute(setpoint, feedback, dt);

        // 模拟反馈过程
        feedback += output * dt;

        // 记录时间和控制量
        //time.push_back(i * dt);
        //control.push_back(output);

        // 输出控制量和反馈值
        std::cout << "Control: " << output << " Feedback: " << feedback << std::endl;
    }

    // 绘制曲线
    //plt::plot(time, control);
    //plt::xlabel("Time");
    //plt::ylabel("Control");
    //plt::title("PID Control Output");
    //plt::show();

    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# CMakeLists.txt
cmake_minimum_required(VERSION 3.19)
project(clion)

set(CMAKE_CXX_STANDARD 11)

include_directories("D:/Miniconda3")
include_directories("D:/Miniconda3/include")
include_directories("D:/Miniconda3/Lib/site-packages")
include_directories("D:/Miniconda3/Lib/site-packages/numpy/core/include")
link_directories(./)

add_executable(clion main.cpp)

target_link_libraries(clion
        -LD:/Miniconda3 -lpython38
        )

😆3. ROS实现示例

为了便于验证,我找了一下github上基于Turtlebot3机器人的PID算法示例,链接:https://github.com/kadupitiya/ROS-TurtleBot-PID

核心计算跟上述C++示例差不多,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double PIDImpl::calculate( double setpoint, double pv )
{
    // error
    double error = setpoint - pv;

    // Proportional portion
    double Pout = _Kp * error;

    // Integral portion
    _integral += error * _dt;
    double Iout = _Ki * _integral;

    // Derivative portion
    double derivative = (error - _pre_error) / _dt;
    double Dout = _Kd * derivative;

    // Total output
    double output = Pout + Iout + Dout;

    // Limit to max/min
    if( output > _max )
        output = _max;
    else if( output < _min )
        output = _min;

    // Save error to previous error
    _pre_error = error;

    return output;
}

代码实现效果如下:(原代码里PID参数设置会有画龙,我修改了一下D值,看着还行)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double dt = 0.1, maxT = M_PI, minT = -M_PI, Kp = 0.3, Ki = 0.05, Kd = 0.1; // modify Kd
double dtS = 0.1, maxS = maxSpeed, minS = 0.0, KpS = 0.08, KiS = 0.01, KdS = 0.005;

以上。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入解析PID控制算法:从理论到实践的完整指南
大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。
芯动大师
2025/05/19
6810
PID控制算法原理,并用python实现演示
PID:比列(Proportion),积分(Integral),微分(Differential)
小末快跑
2019/07/03
21.8K0
如何用PID算法,操控无人机悬停?
做控制时,大家经常会有这样的感受“代码很丰满,现实很骨感”,这是因为将计算机指令转移到实际硬件时,由于物体的惯性以及各种非理想化的因素影响,往往会出现实际与预期不符合的情况。
用户2366192
2023/09/02
9260
如何用PID算法,操控无人机悬停?
电机控制进阶——PID速度控制
之前的几篇文章(电机控制基础篇),介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。
xxpcb
2021/06/24
3.7K0
电机控制进阶1——PID速度控制
之前的几篇文章(电机控制基础篇),介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。
xxpcb
2021/06/22
3.5K0
PID横向控制和仿真实现
PID是一种常见的控制算法,全称为Proportional-Integral-Derivative,即比例-积分-微分控制器。PID控制器是一种线性控制器,它将设定值与实际值进行比较,根据误差的大小,控制器会相应地调整系统的比例、积分和微分系数,以减小误差。
艰默
2024/01/11
4590
PID横向控制和仿真实现
PID算法原理、调整规律及代码
比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
小锋学长生活大爆炸
2020/08/13
2.7K0
PID算法原理、调整规律及代码
基于Python编写的pid控制器
我是学数学的,不是学自动化的,啥啥的自动控制,啥啥的信号系统,我啥也不懂,在恶补。
云深无际
2021/09/14
1.2K0
基于Python编写的pid控制器
PID 控制器在工业自动化中的应用及参数调整方法
在工业自动化领域中,PID(比例-积分-微分)控制器是一种常用的控制算法,它通过调节输出信号,使被控对象的实际值尽可能接近设定值。PID 控制器的应用广泛,从简单的温度控制到复杂的过程控制都可以采用 PID 算法实现。本文将介绍 PID 控制器的作用与重要性,并编写一个简单的 PID 控制代码,然后解释代码的功能。此外,还将介绍 PID 参数调整的几种常用方法,以及该代码在不同应用场景下的修改部分。
剑指工控
2024/05/22
1.3K0
PID 控制器在工业自动化中的应用及参数调整方法
matlab利用模糊算法控制PID参数实现模糊控制
模糊算法与PID控制的结合是一种智能控制策略,能够通过模糊逻辑动态调整PID参数,提升系统对非线性、时变性或不确定性过程的适应能力。
用户4006703
2025/06/05
3220
深入浅出PID控制算法(三)————增量式与位置式PID算法的C语言实现与电机控制经验总结
说实话整定口诀对于初学者来说,其实根本就看不懂,只有从实际整定过程中才能慢慢发觉其中的奥秘。
全栈程序员站长
2022/09/07
9.6K0
深入浅出PID控制算法(三)————增量式与位置式PID算法的C语言实现与电机控制经验总结
在 FPGA 上快速构建 PID 算法
《优秀的IC/FPGA开源项目》是新开的系列,旨在介绍单一项目,会比《优秀的 Verilog/FPGA开源项目》内容介绍更加详细,包括但不限于综合、上板测试等。两者相辅相成,互补互充~
碎碎思
2022/11/14
1.5K0
在 FPGA 上快速构建 PID 算法
PID控制算法仿真_连续控制系统的充分必要条件
PID控制是将误差信号e(t)的比例(P),积分(I)和微分(D)通过线性组合构成控制量进行控制,其输出信号为:
全栈程序员站长
2022/08/03
9950
PID控制算法仿真_连续控制系统的充分必要条件
基于STC51实现的智能温控系统
随着科技的发展和智能化趋势的深入,智能家居和自动化控制系统越来越受到人们的重视。在工业生产、实验室环境控制、家庭养殖、温室种植等多个领域,精确的温度控制对于维持理想的环境条件、提高生产效率、保障产品质量至关重要。传统的温度控制系统往往功能单一,操作复杂,且缺乏足够的智能化和灵活性。因此,设计一款基于微控制器的智能温控系统,以实现高效、精准的温度控制,同时具备良好的用户交互界面和自适应调节能力,成为了当前技术发展的一个重要方向。
DS小龙哥
2025/05/27
1080
PLC 编程中常用的控制算法:优化自动化控制的关键
自动化控制系统是工业生产中不可或缺的重要组成部分。作为自动化控制系统的核心,PLC (可编程逻辑控制器)凭借其编程灵活性、可靠性和经济性,广泛应用于各种工业领域。PLC编程中的控制算法是实现自动化控制的关键所在,直接决定了控制系统的性能和效果。本文将介绍几种在PLC编程中常用的控制算法,结合具体案例和ST编程示例,帮助读者深入理解这些算法的工作原理及其在实际生产中的应用。
剑指工控
2024/07/05
1K0
PLC 编程中常用的控制算法:优化自动化控制的关键
一文搞懂 | PID控制算法
PID 算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID算法已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。
混说Linux
2022/07/14
1.8K0
一文搞懂 | PID控制算法
一文搞懂PID控制算法
PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID算法已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。
不脱发的程序猿
2021/01/20
7.9K0
PID控制算法的C语言实现
最近在学习PID算法,在了解了算法的套路以后,就要进行实验。如何用C语言实现呢?在网络搜索发现了一篇很好的博客,不过里面的数据又臭又长。在这里转载过来,重下新整理了一下。(原文链接)整理中发现,原文参考的博文已无法访问
全栈程序员站长
2022/09/06
3.8K0
PID控制算法的C语言实现
python实现PID
最近捣鼓ROS的时候,发现github上有人用python实现了PID,虽然可能执行效率不高,但是用python写工具的时候还是很方便的。从github上把代码搬下来,简单分析一下
py3study
2020/01/10
2.6K0
漫谈PID,聊聊实现与调参原理
PID控制器是工业过程控制中广泛采用的一种控制器,其中,P、I、D分别为比例(Proportion)、积分(Integral)、微分(Differential)的简写;将偏差的比例、积分和微分通过线性组合构成控制量,用该控制量对受控对象进行控制,称为PID算法 。
芯动大师
2025/05/15
1100
漫谈PID,聊聊实现与调参原理
相关推荐
深入解析PID控制算法:从理论到实践的完整指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验