精华内容
下载资源
问答
  • 轮机自动化控制讲座-第一章反馈控制系统实例.pptx
  • 主要是对非线性系统的各种控制方法,以及非线性控制运用的一些实例,对于学控制的人,帮助是非常大的,因为这些资料都是从国外著名大学研究生学习的教材。
  • 摘 要:针对一类具有非理想网络状况,如时变网络时滞、分组丢失和乱序等问题的基于动态输出反馈控制器的网络控制系统,建立了多时滞Lurie网络控制系统模型,应用Lyapunov-Krasovskii泛函方法,保留Lyapunov-...
  • 在数字电源的所有讨论中,必须区分两个关键的概念:功率控制和功率管理。...这包括电源系统配置、个别电源的控制和监视以及故障检测通信。电源管理功能并不是实时的,这些功能以一个比电源的开关频率慢的
  • 然而, 在许多实际系统中往往存在干扰不匹配的情况, 例如存在采样抖动的离散时间控制系统. 针对这一问题, 基于一类存在不匹配干扰的离散时间系统, 提出广义扩张状态观测器和相应的稳定化状态反馈控制器设计方法. ...
  • 针对一类采用线性分式模型描述的结构反馈不确定广义系统,当系统状态不可测时,讨论其基于输出反馈的鲁棒模型预测控制问题,采用变量替换方法以及线性矩阵不等式技术对含有输出反馈控制器增益矩阵的非线性不等式进行解...
  • 前面几篇博客介绍了卡尔曼滤波的一些基本算法,其实目标追踪,定位,传感器融合还有很多问题要处理,这些我们在以后的系列博客中在进一步细讲,现在我想给大家介绍一下无人驾驶汽车系统开发中需要的控制相关的理论和...

    前面几篇博客介绍了卡尔曼滤波的一些基本算法,其实目标追踪,定位,传感器融合还有很多问题要处理,这些我们在以后的系列博客中在进一步细讲,现在我想给大家介绍一下无人驾驶汽车系统开发中需要的控制相关的理论和技术,还是和第一篇说的那样,我想到哪就写到哪,追踪和定位等更高级的算法我在后面会继续写。所以感兴趣的同学可以关注我的博客,无人驾驶汽车系统入门系列博客会一直更新下去。

    这一篇主要讲控制的入门,为什么需要控制理论,以及最经典的PID控制,更高级的应用在实际系统中的控制算法我会在后面的文章中详述。编写不易,转载请注明出处:http://blog.csdn.net/adamshan/article/details/78458325

    为什么需要控制理论

    试想有如下场景,当你驾驶一辆汽车通过这个弯道的时候,假设你已经知道你要开的路线,那么你会怎么去操作控制你的车呢?

    这里写图片描述

    显然,如果你不是专业的选手的话,你无法做到一步到位的控制,你需要一边观察车辆相对于你想要开的路线的相对偏差,一边调整你的方向盘的角度和油门踏板的力度,这种基于环境反馈的控制我们称为 反馈控制 。反馈控制是现代控制理论的基础,这是反馈控制的一般思路:

    这里写图片描述

    我们希望我们控制的对象(无人车)能够按照我们希望(规划好)的路径行驶,我们会将环境当前给我们的反馈(我们当前的位置)和参考线进行比较,得到我们当前偏离参考线的距离(误差),基于这个误差,我们设计一定的算法来产生输出信号,使得这个误差不断的变小,这样的过程就是反馈控制的一般过程。那么我们如何基于这个误差来产生控制指令呢?我们最直观的感觉就是要让误差在我们的控制下逐渐变小直到为0:

    这里写图片描述

    0误差就意味着车一直在你想让它开的路径上开。如何减少误差就是我们这几篇博客要向大家介绍的内容。

    为了了解反馈控制,我先向大家介绍 PID控制,PID控制是目前利用最为广泛的控制理论,我们以它为出发点讨论控制理论。

    比例,积分和导数

    PID就是指 比例(proportion)积分(integral)导数(derivative),这三项表示我们如何使用我们的误差来产生控制指令,整个流程如下:

    这里写图片描述

    首先是根据反馈和参考值求出误差,这里的误差根据具体的情况可以是各种度量,比如说控制车辆按照指定的路径形式,那么就是车辆当前位置和参考线的距离,控制车辆的速度在设定的值,那么就是当前速度和设定速度的差值,求出误差以后,再根据误差求比例,积分和微分三项,其中 Kp , Ki , 和 Kd 是三项的系数,它们决定着这三项对最后输出的影响的比重。将 P,I,D 三项求和作为最后的输出信号。我们分别讨论这三项的意义。

    P控制

    考虑一个简单的情况,假设我们希望无人车按照图中绿线行驶,但是我们的车在如图所示的位置:

    这里写图片描述

    那么我们要转多少度角呢?如果都按照固定的角度转(如下图),那么车的轨迹将如图中所示:

    这里写图片描述

    那么显然坐这样的车是不舒服的。一个直观的解决方法就是使用比例控制。如图所示,当偏差大的时候,我们偏转更多的角度,当偏差小的时候,则偏转小一点。

    这里写图片描述

    那么这就是P control(比例控制)这里我们使用 CTE(Cross Track Error) 作为偏差度量 ,CTE就是我们到参考线的距离。那么这个时候转角就变成了:

    steering angle=Kpe(t)

    其中的 e(t) 就是在t时刻的CTE,在P控制中系数 Kp 会直接影响到实际的控制效果,在合理的数值范围内 Kp 越大控制的效果越好(越快速的回到参考线附近),但是,当本身位置和参考线相距很远且 Kp 系数较大的时候,就会出现车辆失去控制的情况:

    这里写图片描述

    所以说,如果 Kp 参数设计合理的话,P控制要比固定控制要更好,但是还是不能控制的很好,因为P控制的车辆容易0值的影响,如图所示:

    这里写图片描述

    此时车辆虽然在参考线上,但是并不是我们希望的状态(它在下一刻就会偏离),但是对于P控制而言,这是理想状态,此时控制转角为0,因此,P控制会一次又一次的超过参考线(overshot),为了矫正这种overshot,我们需要考虑一个额外的误差项——CTE变化率

    PD控制

    CTE的变化率描述了我们的无人车向着参考线方向移动的有多快,如果我们的无人车一直都完美的在参考线上运动的话,那么我们的CTE变化率就为0。那么这一项(描述误差的变化率)就可以用导数来表示,那么,现在我们的控制输出就变成了比例项和导数项求和的形式:

    steering angle=Kpe+Kdd e(t)dt

    其中的 Kd 就是导数项的系数,它的大小决定了CTE变化率对于反馈控制的影响。此时我们的控制叫做PD控制,在PD控制中,我们有两个系数需要调整,直观上来看,增大 P 系数将会增大无人车向着参考线方向运动的倾向;增大 D 系数将会增大无人车快速向参考线方向的运动的“抵抗力”从而使得向参考线方向的运动变得更加平滑。使用过大的 P 系数,过小的 D 系数的系统我们称之为 欠阻尼的(underdamped),这种情况的无人车将沿着参考线震荡前进,反之,如果P系数过小,D系数过大,那么我们称之为 过阻尼的(overdamped),这将使得无人车要较长的时间才能纠正其误差。合适地选择 P D参数可以使无人车能快速回到参考线上的同时很好的维持在参考线上运动。

    PD控制似乎已经能够胜任良好的反馈控制了,但其实还不够,PD控制器可以保证正常的控制的需求,但是当环境存在扰动的时候,比如说下面这种情况:

    这里写图片描述

    车在受力发生轻微偏移以后,由于PD控制中下 P 项倾向于向参考线方向运动,而 D 项则尝试抵消这种倾向,造成无人车始终都无法沿着参考线运动,这个问题叫做 steady state error 为了解决这个问题,我们再引入一项—— 积分项

    PID控制

    我们将积分项也就如到我们的控制输出函数中,这个时候,无人车的转角就可以表示为:

    steering angle=Kpe+Kdd e(t)dt+Kit0e(t)dt

    其中 Ki 就是积分项系数,积分项在我们这个例子中其实很好理解,本质就是车的实际路线到参考线的图形的面积,加入积分项以后,控制函数会尽可能使车辆路线的积分尽可能小(也就是使车辆路线和实际运动参考线之间形成的形状的面积尽可能小),那么也就避免了steady state这种情况了。

    同样的,这里的积分项系数的大小也会影响我们整个控制系统的稳定性,过大的 Ki 会使控制系统“震荡”地运行,过小的 Ki 又会使控制的车辆在遇到扰动以后(处于steady state)要很久才能回到参考线上,这在某些情况下势必会使车辆处于一个危险的境况。

    PID控制就是由这三项共同决定的,还有其他应用于无人驾驶汽车的高级控制算法,但是他们都和我们介绍的PID控制的原理相似。

    我们发现其实PID实现确实不难,但是三个系数的选择却很难,那么如何选择PID系数呢?我们可以在我们的控制循环中通过一定的算法不断尝试,下面我提供给大家一种寻找参数的算法:

    这里写图片描述

    具体的算法见我的C++代码实例。

    PID C++代码

    pid.cpp

    #include <limits>
    #include <iostream>
    #include "PID.h"
    
    //using namespace std;
    
    PID::PID() {}
    
    PID::~PID() {}
    
    void PID::Init(double Kp, double Ki, double Kd) {
        parameter.push_back(Kp);
        parameter.push_back(Ki);
        parameter.push_back(Kd);
    
        this->p_error = 99999999.;
        this->d_error = 0.0;
        this->i_error = 0.0;
    
        //twiddle parameters
        need_twiddle = false;
    
        step = 1;
        // let the car run at first 100 steps, then in the next 3000 steps add the cte^2 to the total_error
        val_step = 100;
        test_step = 2000;
    
        for (int i = 0; i < 3; ++i) {
            // init the change rate with the value of 0.1*parameter
            changes.push_back(0.1 * parameter[i]);
        }
        index_param = 0;
    
        best_error = std::numeric_limits<double>::max();
        total_error = 0;
        // fail to make the total_error better times
        fail_counter = 0;
    }
    
    void PID::UpdateError(double cte) {
        if(step == 1){
            p_error = cte;
    
        }
        d_error = cte - p_error;
        p_error = cte;
        i_error += cte;
    
        if(need_twiddle){
            if(step % (val_step + test_step) > val_step){
                total_error += (cte * cte);
            }
    
            if(step % (val_step + test_step) == 0){
                std::cout<<"==============  step "<<step<<" =============="<<std::endl;
                std::cout << "P: "<< parameter[0]<<" I: "<<parameter[1]<<" D: "<<parameter[2]<<std::endl;
                if (step == (val_step + test_step)){
                    if(total_error < best_error){
                        best_error = total_error;
    
                    }
                    parameter[index_param] += changes[index_param];
                } else{
                    if(total_error < best_error){
                        best_error = total_error;
                        changes[index_param] *= 1.1;
                        IndexMove();
                        parameter[index_param] += changes[index_param];
                        fail_counter = 0;
                    } else if(fail_counter == 0){
                        parameter[index_param] -= (2*changes[index_param]);
                        fail_counter++;
                    } else{
                        parameter[index_param] += changes[index_param];
                        changes[index_param] *= 0.9;
                        IndexMove();
                        parameter[index_param] += changes[index_param];
                        fail_counter = 0;
                    }
                }
    
                std::cout << "best_error: "<< best_error<<" total_error: "<<total_error<<std::endl;
                std::cout << "change_index: "<<index_param<<" new_parameter: "<<parameter[index_param]<<std::endl;
                std::cout <<  std::endl;
                total_error = 0;
            }
        }
        step++;
    }
    
    double PID::TotalError() {
        return -parameter[0] * p_error - parameter[1] * i_error - parameter[2] * d_error;
    }
    
    void PID::IndexMove() {
        index_param++;
        if(index_param >=3){
            index_param = 0;
        }
    }

    pid.h

    #ifndef PID_H
    #define PID_H
    
    #include <cmath>
    #include <vector>
    
    class PID {
    private:
        int step;
        std::vector<double> changes;
        double best_error;
        double total_error;
        int index_param;
    
        int val_step;
        int test_step;
    
        int fail_counter;
    
        void IndexMove();
    
        bool need_twiddle;
    
    public:
        /*
        * Errors
        */
        double p_error;
        double i_error;
        double d_error;
    
        /*
        * Coefficients, the order is P, I, D
        */
        std::vector<double> parameter;
    
        /*
        * Constructor
        */
        PID();
    
        /*
        * Destructor.
        */
        virtual ~PID();
    
        /*
        * Initialize PID.
        */
        void Init(double Kp, double Ki, double Kd);
    
        /*
        * Update the PID error variables given cross track error.
        */
        void UpdateError(double cte);
    
        /*
        * Calculate the total PID error.
        */
        double TotalError();
    };
    
    #endif /* PID_H */

    用法

    在你的实际控制循环中,调用:

    PID pid;
    pid.Init(0.3345, 0.0011011, 2.662); //your init parameters
    
    for (in your control loop) {
      pid.UpdateError(cte);
      steer_value = pid.TotalError();
    }
    展开全文
  • 一个运动控制系统实例

    千次阅读 2017-08-10 13:54:25
    运动控制系统的构成有很多方式,你可以使用嵌入式系统、专用运动控制PLC、工控机+运动控制卡、专用数控装置等等。运动控制卡控制一般采用的都是工控机+运动控制卡(IPC)的方式,这样有搭建系统比较灵活,可扩展性强...

    运动控制系统的构成有很多方式,你可以使用嵌入式系统、专用运动控制PLC、工控机+运动控制卡、专用数控装置等等。运动控制卡控制一般采用的都是工控机+运动控制卡(IPC)的方式,这样有搭建系统比较灵活,可扩展性强等优点。

    下面是一个完整的运动控制卡运动控制系统硬件组成和接线及信号传输示意图。


    这里写图片描述

    整个运动控制系统按信号流通顺序,由PC->运动控制卡->运动控制卡卡转接板->电机驱动器->电机(编码器)->运动模组(限位传感器)构成。图中红色线为信号传输示意图。

    对于一个控制系统来说,都有驱动电路和控制电路两路电。

    图中,驱动电路主要用于给驱动器供电,处理后输出电机驱动电以供电机正常工作,这里不同的驱动器要求不一样(220V或380V),这里为了简单使用220V。

    图中,控制电路主要控制整个系统:

    1.交流接触器控制主驱动回路的通断(可采用直流接触器24V或交流接触器220V,这里用220V)
    2.电机驱动器控制电路供电(不同的驱动器要求不一样,直流24V或交流220V,这里为了简单使用220V)
    3.转接板供电(转接板是将PMAC的信号分流,可使用官方转接板或自行设计的转接板,220V变压后输出15V给转接板供电)
    4.图中的限位传感器供电,220V变压后输出24V给转接板供电。(这里只是示意,实际中信号线和

    展开全文
  • 建立连续情形广义系统新的正实引理. 通过对线性矩阵不等式(LM I) 的...实状态反馈控制的充分必要条件, 构造了保持系统稳定性的正实控制器设计方法. 数值实例表明, 该求解控制器的 方法简单方便, 具有实际意义.</p>
  • 研究一类由任意有限多个线性子系统组成的切换系统的H∞ 状态反馈控制问题.利用Lyapunov函数方法,给出由线性矩阵不等式(LMI)表示的控制器存在的充分条件, 并设计了相应的子控制器和切换策略. 最后给出一个数值仿真...
  • 第一章:控制系统分析设计案例1.1. 控制系统的分析1.1.1. 控制系统的仿真分析1.1.2. 闭环传递函数1.2. 闭环传递函数的响应分析1.2.1. 阶跃响应曲线1.2.2. 冲激响应曲线1.2.3. 斜坡响应1.3. 控制系统的稳定性分析...

    1.1. 控制系统的分析

    1.1.1. 控制系统的仿真分析

    建立系统数学模型,要根据系统的实际结构,抓住主要因素,略去次要因素,使数学模型能够准确反映系统的动态本质,还要能够简化计算,简化问题
    在这里插入图片描述
    在这里插入图片描述
    系统仿真实际上就是对系统模型的求解

    1.1.2. 闭环传递函数

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.2. 闭环传递函数的响应分析

    在这里插入图片描述

    1.2.1. 阶跃响应曲线

    在这里插入图片描述

    1.2.2. 冲激响应曲线

    在这里插入图片描述

    1.2.3. 斜坡响应

    在这里插入图片描述

    1.3. 控制系统的稳定性分析

    系统的稳定性使自动控制系统设计的基本要求,保持稳定是基本任务

    1.3.1. 状态空间实现

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.3.2. 稳定性

    在这里插入图片描述

    展开全文
  • 针对一类具有未知控制方向的随机时滞系统设计自适应神经输出反馈控制器.首先,利用状态观测器估计不可测量的系统状态;其次,选择合适的Lyapunov-Krasovskii函数消除未知延迟项对系统的影响,利用Nussbaum-type函数处理...
  • 研究具有已知动态特性但未知初始条件的持续外界扰动的线性离散系统最优控制问题. 给出了前馈2反馈 最优控制律的存在唯一性条件, 并提出了最优控制律的设计算法. 通过降维扰动观测器解决了前馈2反馈最优控制律...
  • 今天学习了Simulinl混合仿真系统,实际的系统常常是混合系统(即系统中有连续信号也有离散信号)。...现在通过一个实例来进行系统的总结一下。下面的例子来自教材《基于MATLAB7.x+SIMULINK_STATEFL...

    今天学习了Simulinl混合仿真系统,实际的系统常常是混合系统(即系统中有连续信号也有离散信号)。在对这类系统进行仿真时必须考虑连续信号和离散信号采样时间之间的匹配问题。Simulink中的变步长连续求解器充分考虑了上述问题。所以在对混合系统进行仿真分析时,应该使用变步长连续求解器现在通过一个实例来进行系统的总结一下。下面的例子来自教材《基于MATLAB7.x+SIMULINK_STATEFLOW系统仿真、分析及设计》。

      例:汽车行驶控制系统是应用很广的控制系统之一,控制的目的是对汽车速度进行合理的控制。它是一个典型的反馈控制系统。

    使用汽车速度操纵机构的位置变化量设置汽车的指定速度;测量汽车的当前速度,求取它与指定速度的差值;由差值信号产生控制信号驱动汽车产生相应的牵引力以改变并控制汽车速度直到达到指定速度。

    汽车行驶控制系统包含三部分机构
    •第一部分,速度操纵机构的位置变换器。位置变换器是汽车行驶控制系统的输入,其作用是将速度操纵机构的位置转换为相应的速度,速度操纵机构的位置和设定速度间的关系为: Vg=50x+45  x=(0~1)
    •第二部分,离散PID控制器。离散PID控制器是汽车行驶控制系统的核心部分。其作用在于根据汽车当前速度与设定速度的差值,产生相应的牵引力。其数学模型为:
    积分环节:x(n)=x(n-1)+u(n)
    微分环节:d(n)=u(n)-u(n-1)
    控制器输出:y(n)=P*u(n)+I*x(n)+D*d(n)
    其中P,I,D分别是PID控制器的比例、积分和微分控制参数。
    •第三部分,汽车动力机构
    汽车动力机构是行驶控制系统的执行机构。其功能是在牵引力的作用下改变汽车速度,使其达到设定的速度。牵引力与速度之间的关系为F=ma+bv
    其中v是汽车速度,F是汽车的牵引力,a是加速度,m是汽车质量,b是阻力因子。 

     

    用simulink进行建模如下:

     

    利用这个模型又研究了PID控制中P,I,D这三个参数对控制的变量的影响。实验的结果如下:

    只对P参数进行调节P 参数由1增加到30

     

    只对I参数进行调节,P由0.25减小到0.005

    由上面的实验可以直观的看出PID控制中P和I参数对对控制的变量的影响。P和I都能使得受控变量的波动变小,但是P要增大才能实现信号的稳定,而且只是减小信号的幅值;I要减小才能实现信号的稳定,而且在减小信号幅值的同时也会延迟信号达到稳定所用的时间。至于D参数,在试验中发现其影响很不明显。

    展开全文
  • 多变量反馈控制——分析与设计》(第2版)以严谨易读的方式介绍了鲁棒多变量控制系统的分析和设计。着重讲述实际的反馈控制,而不是一般的系统理论,力求使读者能够深刻了解反馈控制的优势和不足。  第2版涵盖了本...
  • 网络控制系统(NCS)的事件触发控制器的简单示例: 开发事件触发控制以减少网络控制系统中的通信负载。 这意味着系统输出或执行器信号仅在违反事件触发条件时才通过网络传输,该条件被设计为可以确保一定的控制性能...
  • 对于一类状态无法测量的非线性系统,当系统的输出被异步采样时,通过引入状态观测器,提出了一种输出反馈分布式模型预测控制算法。 证明了估计状态和实际系统状态的误差是有界的。 并且保证闭环系统的估计状态最终被...
  • 液位串级控制系统,串级控制定义、控制模型建立、应用举例。
  • 针对网络控制系统中存在数据传输时延和数据包丢失,以及由被控对象和控制器之间的不同步给系统所带来的稳定性问题,提出了一种状态反馈控制器设计方法。采用带有延时的被控对象模型和Lyapunov泛函,得到了时滞相关稳定...
  • 在直接数字域设计中,我们常常需要用到PID算法,而PID算法投入单片机使用时,往往需要硬件的支持,在调试时非常麻烦。本文通过Matlab仿真的手段实现PID,方便了开发者对系统的设计和实时调试。
  • 前馈控制与反馈控制

    千次阅读 2019-03-14 11:49:00
    前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根据扰动作用的大小进行控制,以补偿扰动作用对被控变量的影响。前馈控制系统运用得当,可以使被控...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎...
  • 基于与延迟反馈控制法相似的原理, 提出了一种新的混沌系统控制方法——预测反馈控制法.... 最后借助于实例模拟总结了预测反馈控制法的一些重要特性, 这对该方法的深 入理解及应用提供了重要的指导作用.</p>
  • 针对一类高频增益符号未知,仅有输出可测的非线性大系统提出了一种模糊自适应Backstepping分散控制方法。在backstepping递推设计中,采用模糊逻辑系统逼近未知非线性函数,利用Nussbaum增益方法解决未知高频增益符号...
  • 这项研究的重点是具有随机数据包丢失和时间延迟的网络控制系统的输出反馈保证成本控制问题。 本研究中考虑的工厂的特征在于不确定的线性离散时间系统, 其中在建模为统一的多个马尔可夫链的前向控制器到执行器和反馈...
  • 本文针对一类非线性纯反馈系统的自适应神经输出反馈控制问题进行了研究。 首先构造状态观察器以估计不可测量的状态变量。 径向基函数(RBF)神经网络(NNs)用于近似未知的非线性函数,而后推自适应技术则用于构造...
  • 在δ算子域内应用动态规划理论, 设计网络控制系统的最优状态反馈和输出反馈控制律,得到的线性二次型高斯控制器可对系统中的随机长时延进行动态补偿.最后通过实例仿真验证了上述最优控制方案的可行性和有效性.
  • 摘要:本文介绍一种基于MCS-98单片机的交流调压调速系统实例。图1是交流调压器调速系统组成的框图,该系统采用三相交流电源经反向并联的三组晶闸管加到交流电动机的定子上,利用相位控制改变加在定子绕组上的电压...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,890
精华内容 19,956
关键字:

反馈控制系统实例