基于强化学习方法的PID参数整定

前言

PID控制器在工业界应用非常广泛,但是PID的参数调节一般需要人工根据经验法来试。对于有经验的工程师来说,一般试几次就可以获得满足调节的参数。然而对于新手工程师却很难确定一套比较好的参数。

这里我们采用强化学习的方法来调节PID参数。

这个例子展示了如何使用双延迟深度确定性策略梯度(TD3:twin-delayed deep deterministic policy gradient)强化学习算法来调整PI控制器。整定控制器的性能与使用Control System Tuner app整定的控制器的性能进行了比较。在SIMULINK中使用Control System Tuner app来整定控制器需要Simulink Control Design软件。

对于具有少量可调参数的相对简单的控制任务,基于模型的整定技术与基于无模型的RL方法相比,具有更快的整定过程,可以获得较好的结果。然而,RL方法更适合于高度非线性系统或自适应控制器整定。

为了便于控制器比较,两种整定方法都使用线性二次型高斯(LQG)目标函数。

此示例使用强化学习(RL) agent来计算PI控制器的增益。并使用神经网络控制器替换PI控制器。

环境模型

环境模型是water tank模型,该控制系统的目标是保持水箱中的水位与参考值相匹配。

打开模型

open_system('watertankLQG');

在这里插入图片描述
该模型考虑了具有方差 E ( n 2 ( t ) ) = 1 E\left(n^2 \left(t\right)\right)=1 E(n2(t))=1的过程噪声。

为了在保持水位的同时最大限度地减少控制力u,本例中的控制器使用以下LQG标准。

J = l i m T ⇒ ∞ E ( 1 T ∫ 0 T ( ( r e f − y ) 2 ( t ) + 0 . 01 u 2 ( t ) ) d t ) J=\underset{T\Rightarrow \infty }{\mathrm{lim}} E\left(\frac{1}{T}\int_0^T \left({\left(\mathrm{ref}-y\right)}^2 \left(t\right)+0\ldotp 01u^2 \left(t\right)\right)\mathrm{dt}\right) J=TlimE(T10T((refy)2(t)+0.01u2(t))dt)

要在此模型中模拟控制器,必须以秒为单位指定模拟时间Tf和控制器采样时间Ts。

Ts = 0.1;
Tf = 10;

利用控制系统调节器整定PI控制器

要使用Control System Tuner(控制系统整定器)在Simulink中调整控制器,必须将控制器块指定为调整块,并定义调整过程的目标。

在本例中,使用Control System Tuner打开保存的会话ControlSystemTunerSession.mat。本例子将WatertankLQG模型中的PID控制器块指定为调整块,并包含一个LQG整定目标。

controlSystemTuner("ControlSystemTunerSession")

在Tuning条上,点击Tune,来整定控制器。

分别把比例和微分参数调到9.8和1e-6

Kp_CST = 9.80199999804512;
Ki_CST = 1.00019996230706e-06;

创建环境以训练agent

定义模型来训练强化学习的agent,并改进water tank模型,需要以下步骤:

  1. 除去PID控制器
  2. 加入强化学习agent的模块
  3. 创建观测向量 [ ∫ e    d t e ] T    {\left\lbrack \begin{array}{ccc} \int e\;\mathrm{dt} & e & \end{array}\right\rbrack }^{T\;} [edte]T e = r − h e=r-h e=rh h h h是水箱的高度, r r r是参考高度。把观测信号和强化学习agent模块连接起来。
  4. 定义强化学习的回报函数为LQG cost的负值,即 R e w a r d = − ( ( r e f − h ) 2 ( t ) + 0 . 01 u 2 ( t ) ) \mathrm{Reward}=-\left({\left(\mathrm{ref}-h\right)}^2 \left(t\right)+0\ldotp 01u^2 \left(t\right)\right) Reward=((refh)2(t)+0.01u2(t))。强化学习的agent最大化回报,即是最小化LQG cost。

符合上述描述的模型是 rlwatertankPIDTune.slx。

mdl = 'rlwatertankPIDTune';
open_system(mdl)

在这里插入图片描述
创建环境接口对象。为此,请使用本例末尾定义的localCreatePIDEnv函数:

[env,obsInfo,actInfo] = localCreatePIDEnv(mdl);

输出环境的观测量和动作量的维度值:

numObservations = obsInfo.Dimension(1);
numActions = prod(actInfo.Dimension);

修复随机种子以保证结果复现:

rng(0)

创建TD3 agent

给定观察结果,TD3 agent决定使用参与者表示采取哪个操作。要创建执行元,首先使用观察输入和动作输出创建深度神经网络。

可以将PI控制器建模为具有一个具有误差和误差积分观测的完全连接层的神经网络。
u =    [ ∫ e    d t e ] ∗ [ K i K p ] T    u=\;\left\lbrack \begin{array}{ccc} \int e\;\mathrm{dt} & e & \end{array}\right\rbrack *{\left\lbrack \begin{array}{ccc} K_i & K_p & \end{array}\right\rbrack }^{T\;} u=[edte][KiKp]T
注:

  • u 是actor neural network的输出
  • K p Kp Kp K i Ki Ki神经网络权重的绝对值
  • e = r − h e=r-h e=rh h h h是水箱的高度, r r r是水箱的参考高度

梯度下降优化可以使权值变为负值。若要避免负权重,可以将普通的fullyConnectedLayer替换为fullyConnectedPILayer。

initialGain = single([1e-3 2]);
actorNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','state')
    fullyConnectedPILayer(initialGain, 'Action')];
actorOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'state'},'Action',{'Action'},actorOptions);

TD3 agent使用两个批评值函数表示来近似给定观察和行动的长期奖励。要创建批评者,首先创建一个具有两个输入(观察和动作)和一个输出的深度神经网络。
要创建批评者,请使用本例末尾定义的localCreateCriticNetwork函数。对这两种批评表示使用相同的网络结构。

criticNetwork = localCreateCriticNetwork(numObservations,numActions);
criticOpts = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);

critic1 = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation','state','Action','action',criticOpts);
critic2 = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation','state','Action','action',criticOpts);
critic = [critic1 critic2];

使用以下选项配置agent:

  1. 设置agent使用控制器的取样时间Ts
  2. 设置mini-batch大小为128
  3. 设置经验buffer长度为1e6
  4. 将exploration model和目标策略平滑模型设置为使用方差为0.1的高斯噪声。

使用rlTD3AgentOptions指定TD3 agent选项:

agentOpts = rlTD3AgentOptions(...
    'SampleTime',Ts,...
    'MiniBatchSize',128, ...
    'ExperienceBufferLength',1e6);
agentOpts.ExplorationModel.Variance = 0.1;
agentOpts.TargetPolicySmoothModel.Variance = 0.1;

使用指定的actor representation、critic repesention和agent创建TD3 agent:

agent = rlTD3Agent(actor,critic,agentOpts);

训练agent

要训练agent,首先指定以下训练条件:

  1. 每个训练的episode最多1000个,每个episode最多100个时间步长。
  2. 在Episode Manager中显示训练进度(设置Plots选项),并禁用命令行显示(设置Verbose选项)。
  3. 当agent在连续100个episode中获得的平均累计奖励大于-355时,停止训练。则可以认为agent可以控制水箱中的水位。
maxepisodes = 1000;
maxsteps = ceil(Tf/Ts);
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes, ...
    'MaxStepsPerEpisode',maxsteps, ...
    'ScoreAveragingWindowLength',100, ...
    'Verbose',false, ...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-355);

使用train函数训练agent是一个计算量很大的过程,需要几分钟才能完成。要在运行此例子时节省时间,可以通过将doTraining设置为false来加载预先训练的agent。要自己训练agent,请将doTraining设置为true。


if doTraining
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load('WaterTankPIDtd3.mat','agent')
end

在这里插入图片描述

验证训练好的Agent

通过仿真验证学习到的Agent与模型的一致性:

simOpts = rlSimulationOptions('MaxSteps',maxsteps);
experiences = sim(env,agent,simOpts);

PI控制器的积分和比例增益是执行器表示的绝对值权重。要获得权重,首先从actor中提取可学习的参数。

actor = getActor(agent);
parameters = getLearnableParameters(actor);

获得控制器增益:

Ki = abs(parameters{1}(1));
Kp = abs(parameters{1}(2));

将从RL agent中获得的增益应用于原始PI控制块,并运行阶跃响应仿真。

mdlTest = 'watertankLQG';
open_system(mdlTest);
set_param([mdlTest '/PID Controller'],'P',num2str(Kp))
set_param([mdlTest '/PID Controller'],'I',num2str(Ki))
sim(mdlTest)

提取用于仿真的阶跃响应信息、LQG cost和稳定裕度:

rlStep = simout;
rlCost = cost;
rlStabilityMargin = localStabilityAnalysis(mdlTest);

将使用控制系统调节器获得的增益应用于原始PI控制块,并运行阶跃响应仿真:

set_param([mdlTest '/PID Controller'],'P',num2str(Kp_CST))
set_param([mdlTest '/PID Controller'],'I',num2str(Ki_CST))
sim(mdlTest)
cstStep = simout;
cstCost = cost;
cstStabilityMargin = localStabilityAnalysis(mdlTest);

比较控制器的控制效果

绘制各系统的阶跃响应:

figure
plot(cstStep)
hold on
plot(rlStep)
grid on
legend('Control System Tuner','RL','Location','southeast')
title('Step Response')

在这里插入图片描述
分析两个系统的阶跃响应仿真结果:

rlStepInfo = stepinfo(rlStep.Data,rlStep.Time);
cstStepInfo = stepinfo(cstStep.Data,cstStep.Time);
stepInfoTable = struct2table([cstStepInfo rlStepInfo]);
stepInfoTable = removevars(stepInfoTable,{...
    'SettlingMin','SettlingMax','Undershoot','PeakTime'});
stepInfoTable.Properties.RowNames = {'Control System Tuner','RL'};
stepInfoTable

在这里插入图片描述
分析两个仿真结果的稳定性:

stabilityMarginTable = struct2table([cstStabilityMargin rlStabilityMargin]);
stabilityMarginTable = removevars(stabilityMarginTable,{...
    'GMFrequency','PMFrequency','DelayMargin','DMFrequency'});
stabilityMarginTable.Properties.RowNames = {'Control System Tuner','RL'};
stabilityMarginTable

在这里插入图片描述
比较两个控制器的累积LQG cost。RL调整的控制器产生稍微更优的解决方案。

rlCumulativeCost  = sum(rlCost.Data)

得到:rlCumulativeCost=-375.9135

cstCumulativeCost = sum(cstCost.Data)

cstCumulativeCost=-376.9373

两个控制器都会产生稳定的响应,控制器使用Control System Tuner进行调整会产生更快的响应。然而,RL整定方法产生更高的增益容限和更优化的解决方案。

一些函数的定义

创建water tank强化学习agent的函数:

function [env,obsInfo,actInfo] = localCreatePIDEnv(mdl)

% Define the observation specification obsInfo and action specification actInfo.
obsInfo = rlNumericSpec([2 1]);
obsInfo.Name = 'observations';
obsInfo.Description = 'integrated error and error';

actInfo = rlNumericSpec([1 1]);
actInfo.Name = 'PID output';

% Build the environment interface object.
env = rlSimulinkEnv(mdl,[mdl '/RL Agent'],obsInfo,actInfo);

% Set a cutom reset function that randomizes the reference values for the model.
env.ResetFcn = @(in)localResetFcn(in,mdl);
end

在每个episode开始时随机化参考信号和水箱的初始高度:

function in = localResetFcn(in,mdl)

% randomize reference signal
blk = sprintf([mdl '/Desired \nWater Level']);
hRef = 10 + 4*(rand-0.5);
in = setBlockParameter(in,blk,'Value',num2str(hRef));

% randomize initial height
hInit = 0;
blk = [mdl '/Water-Tank System/H'];
in = setBlockParameter(in,blk,'InitialCondition',num2str(hInit));

end

用于线性化和计算SISO水箱系统的稳定裕度的函数:

function margin = localStabilityAnalysis(mdl)

io(1) = linio([mdl '/Sum1'],1,'input');
io(2) = linio([mdl '/Water-Tank System'],1,'openoutput');
op = operpoint(mdl);
op.Time = 5;
linsys = linearize(mdl,io,op);

margin = allmargin(linsys);
end

创建critic网络的函数:

function criticNetwork = localCreateCriticNetwork(numObservations,numActions)
statePath = [
    featureInputLayer(numObservations,'Normalization','none','Name','state')
    fullyConnectedLayer(32,'Name','fc1')];
actionPath = [
    featureInputLayer(numActions,'Normalization','none','Name','action')
    fullyConnectedLayer(32,'Name','fc2')];
commonPath = [
    concatenationLayer(1,2,'Name','concat')
    reluLayer('Name','reluBody1')
    fullyConnectedLayer(32,'Name','fcBody')
    reluLayer('Name','reluBody2')
    fullyConnectedLayer(1,'Name','qvalue')];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);

criticNetwork = connectLayers(criticNetwork,'fc1','concat/in1');
criticNetwork = connectLayers(criticNetwork,'fc2','concat/in2');
end
<think>好的,我现在需要回答用户关于强化学习PID控制中的应用和实现方法的问题。首先,我得回顾一下用户提供的引用资料,确保回答准确并符合要求。 用户提供的三个引用都涉及强化学习(特别是Q-learning)与PID控制器的结合,用于自适应控制,尤其是在水下机器人(AUV)中的应用。引用1和2提到了QLearning和强化学习算法,引用3详细描述了Simulink模型和实现步骤。 接下来,我需要按照用户的结构要求来组织回答。用户希望结构清晰,分步骤解决问题,并生成相关问题。同时,必须使用中文,数学公式行内用$...$,独立公式用$$...$$,并且正确使用LaTeX语法。此外,回答中引用的段落需要自然地添加引用标识,如[^1]。 首先,我应该介绍强化学习PID控制中的基本应用框架。强化学习的智能体(即PID控制器)通过与环境互动,调PID参数(Kp, Ki, Kd)以优化控制性能。状态可能包括误差e(t)和误差变化率de/dt,动作是参数量,奖励函数基于控制效果,如误差和超调量。 然后,详细说明实现步骤,分点列出。例如,状态空间设计、动作空间义、奖励函数设计、学习算法选择(如Q-learning)、训练流程等。每个步骤需要结合引用内容,比如引用2提到状态-动作对存储在经验池,引用3提到Simulink模型的构建。 接着,应用案例部分可以引用用户提供的AUV和电机控制的例子,引用1和3中的内容。同时,需要比较传统PID强化学习自适应PID的优势,如动态适应能力和抗干扰性,如引用3所述。 注意事项部分,应提到训练时间、参数敏感性和稳性验证,这些可能来自一般知识,但需结合引用中的内容,如引用3提到的理解理论基础的重要性。 最后,生成相关问题,需围绕实现方法算法选择、挑战、实验验证和与传统方法的比较展开。 需要检查数学公式是否正确使用LaTeX,例如状态向量、奖励函数公式等。确保引用标识正确对应,例如引用1、2、3分别对应提供的资料。 可能需要注意避免直接复制引用内容,而是进行转述,并确保信息准确。同时,保持语言口语化,避免使用专业术语过多,但必要时需正确使用。 现在,组织这些内容,确保每个部分清晰,符合用户的要求,并正确引用资料。检查是否有遗漏的要点,比如是否涵盖了状态、动作、奖励的设计,以及具体的实现步骤和应用案例。确认生成的问题相关且具有针对性,帮助用户进一步探索主题。</think>### 强化学习PID控制器中的应用与实现方法 #### 1. 基本应用框架 强化学习通过动态调PID参数($K_p, K_i, K_d$)实现自适应控制。智能体(控制器)以系统误差$e(t)$、误差变化率$\frac{de}{dt}$等作为**状态输入**,输出参数量作为**动作**,通过奖励函数评估控制效果[^2]。核心关系可表示为: $$ \Delta K = f(s_t), \quad s_t = [e(t), \frac{de}{dt}] $$ 其中$\Delta K$为参数量,$f$为强化学习策略函数[^3]。 #### 2. 实现步骤详解 1. **状态空间设计** - 基础状态:误差$e(t)$、误差积分$\int e(t)dt$、误差微分$\frac{de}{dt}$ - 扩展状态:可加入控制量$u(t)$、系统输出变化率等 - 状态归一化:确保各维度量纲统一[^1] 2. **动作空间义** - 离散动作:$\Delta K_p \in \{-0.1, 0, +0.1\}$等固步长调 - 连续动作:使用Actor-Critic网络输出任意调量 - 约束条件:设置参数变化范围$K_{min} \leq K \leq K_{max}$[^3] 3. **奖励函数设计** - 基础奖励项: $$ r = -(\alpha e^2 + \beta u^2 + \gamma |\Delta u|) $$ 其中$\alpha,\beta,\gamma$为权重系数 - 惩罚项:超调量超过阈值时追加负奖励 - 时域指标:加入调节时间惩罚项[^2] 4. **学习算法选择** | 算法类型 | 适用场景 | 特点 | |----------------|-------------------------|-----------------------| | Q-Learning | 离散动作空间 | 需设计状态离散化规则[^1] | | DDPG | 连续动作空间 | 需要较大经验池 | | PPO | 高维状态空间 | 训练稳性好 | 5. **训练流程** ```mermaid graph TD A[初始化PID参数] --> B[采集状态s_t] B --> C{选择动作a_t} C --> D[执行参数] D --> E[计算奖励r_t] E --> F[存储经验<s,a,r,s'>] F --> G[采样训练网络] G --> H{收敛?} H -->|否| B H -->|是| I[部署控制器] ``` #### 3. 典型应用案例 1. **AUV深度控制**[^1] - 状态变量:深度误差、俯仰角速度 - 奖励函数:$r = -0.5e^2 - 0.3\dot{e}^2 - 0.2u^2$ - 结果:相比固PID,超调量减少42%,抗流干扰能力提升 2. **电机转速控制**[^3] - 使用DDPG算法连续调参 - 状态包含电流谐波分量 - 响应时间缩短35%,负载突变恢复时间减少60% #### 4. 优势对比 | 指标 | 传统PID | 强化学习PID | |------------------|-----------------|------------------| | 参数自适应能力 | 无 | 动态在线调 | | 抗干扰性 | 依赖前馈补偿 | 自主适应扰动 | | 非线性系统适用性 | 需复杂 | 通过训练自动适应 | | 实现成本 | 低 | 需要训练阶段 | #### 5. 实现注意事项 1. **训练数据充分性**:需覆盖系统所有工作区间 2. **探索-利用平衡**:使用ε-greedy策略时,衰减率设计需满足: $$ \epsilon(t) = \epsilon_{init} \cdot e^{-kt} $$ 3. **稳性验证**:需通过Lyapunov函数分析保证闭环稳性 4. **硬件部署**:将训练好的策略网络转换为C代码实现实时控制[^3]
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值