深入浅出PID控制算法(一)——连续控制系统的PID算法及MATLAB仿真

1、连续系统的PID控制算法

PID控制:将误差信号e(t)通过比例(p),积分(I)和微分(D)线性组合构成控制输出进行控制,其输出信号为:

在这里插入图片描述

对此式进行拉普拉斯变换,得到模拟(连续系统)PID调节器的传递函数为:

在这里插入图片描述

  • Kp——比例系数
  • Ti——积分时间常数
  • Td——微分时间常数
  • e(t)——偏差
  • u(t)——控制量

2、PID控制的MATLAB仿真

模拟PID控制系统框图:
在这里插入图片描述
假设其中 G ( s ) G_{(s)} G(s)为二阶负反馈控制系统的开环传递函数为:

在这里插入图片描述

2.1、单P控制仿真

输出与输入偏差成比例,即直接将误差信号放大或缩小。比例控制的传递函数为:

G(s)=Kp

取不同的比例系数,绘制系统的单位阶跃响应曲线:

Gs = tf(2,conv([3,1],[2,1]));           %Gs是传递函数,conv是多项式乘法,[3 1][2 1]是多项式系数的向量
Kp = [0.5,2,5,10];                      %取不同的比例系数,行向量

for m = 1:4                                 
    sys = feedback(Kp(m)*Gs,1);         %feedback(G,H),(G,H需事先设定)
                                        %其中G是传递函数,H为反馈函数,表示一个控制系统G,对其进行负反馈H(要求正反馈用-H)。这里前面写上比例环节与系统的串联,后面的1表示负反馈
    step(sys);                          %求阶跃响应,可以用形如step(feedback(G,H))
    hold on;
end

在这里插入图片描述
结论:从图中可以看出,随着KP值的增大,系统响应速度加快,但系统的超调也随着增加,调节时间也随着增长。当KP增大到一定值后,闭环系统将趋于不稳定。
存在稳态误差(稳定时不为1(阶跃输入))。增大比例系数可提高系统的开环增益,减小系统的稳态误差,从而提高系统的控制精度,但这会降低系统的相对稳定性,甚至可能造成闭环系统的不稳定。因此,在系统设计中,比例控制一般不单独使用。

2.2、PD控制仿真

输出与输入偏差的微分成比例,即与偏差的变化速度成比例。微分控制(与比例控制同时使用)的传递函数为:

G(s)=Kp(1+TdS)

取不同的微分系数,绘制系统的单位阶跃响应曲线:

Gs = tf(2,conv([3,1],[2,1]));
Kp = 10;
Td = [0,0.4,1,4];
for m = 1:4
  G1 = tf([Kp*Td(m),Kp],[0,1]);            %这个地方要注意 (Kp*Td(m)*S+Kp)/1=Kp(1+TdS)
  sys = feedback(G1*Gs,1);                 %前面是微分环节与系统的串联,负反馈
  step(sys); hold on;
end

在这里插入图片描述
结论:随着Td值的增大,系统超调量逐渐减小,动态特征有改善。

自动控制系统在克服误差的调节过程中,可能会出现振荡甚至不稳定。原因是存在有较大惯性或有滞后的组件,其具有抑制误差的作用,其变化总是落后于误差的变化。在控制器中仅引入比例项是不够的,比例项的作用仅是放大误差的幅值,而微分项能预测误差的变化趋势。这样,具有比例+微分的控制器,就能提前使抑制误差的控制作用等于零,甚至为负值,从而避免被控量的严重超调,改善动态特性。

微分控制反映误差的变化率,只有当误差随时间变化时,微分控制才会对系统起作用,而对无变化或缓慢变化的对象不起作用。另外,微分控制对纯滞后环节不能起到改善控制品质的作用,反而具有放大高频噪声信号的缺点。

2.3、PI控制仿真

输出与输入偏差的积分成比例,即与误差的积累成比例。积分控制(与比例控制同时使用)的传递函数为:

G(s)=Kp(1+1/Ti*1/s)

取不同的积分系数,绘制系统的单位阶跃响应曲线:

Gs = tf(2,conv([3,1],[2,1])); 
Kp = 2;
Ti = [3,6,12,24];
for m = 1:4
  G1 = tf([Kp,Kp/Ti(m)],[1,0]);              %这里也是(KpS+Kp/Ti)/s
  sys = feedback(G1*Gs,1);
  step(sys); hold on;
end

在这里插入图片描述
结论:加入积分控制后,消除了系统稳态误差,但随着TI值的增大,达到稳态的过渡时间也逐渐加长。

积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即使误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大,使稳态误差进一步减小,直到等于零,但会使系统稳定性降低,稳定时间加长。

2.4、PID控制仿真

传递函数为:

G(s)=Kp(1+1/T⋅1/s+TdS)

取适当的比例、积分、微分系数,绘制系统的单位阶跃响应曲线:

Gs = tf(2,conv([3,1],[2,1]));

Kp = 100;                                %取固定比例系数
Ti = 2.2;
Td =7;

   G1 = tf([Kp*Td,Kp,Kp/Ti],[0,1,0]);     %(Kp*Td*S^2+Kp*s+Kp/Ti)/s=Kp(Tds+1+1/STi)
    sys = feedback(G1*Gs,1);
    step(sys);
    hold on;

在这里插入图片描述
结论:PID控制通过积分作用消除误差,而微分控制可缩小超调量、加快系统响应,是综合了PI控制和PD控制长处并去除其短处的控制。

对PID参数的简单理解

比例控制Kp: 能提高系统的动态响应速度,迅速反映误差,从而减少误差,但是不能消除误差,简单来说就是越大越快越小越慢但是可能会超调或者过慢有很多弊端,并且太大了会不稳定。

Ki为积分控制作用: 一般就是消除稳态误差,只要系统存在误差积分作用就会不断积累,输出控制量来消除误差,如果偏差为零这时积分才停止,但是积分作用太强会使得超调量加大,甚至使系统出现震荡,那么问题来了,这个积分作用太强太弱是啥意思呢,我的理解是:积分作用就相当与容错率高的意思,你容错太多了才开始调节那不就是超调量太大了么,反之你容错率低,刚刚误差一点你就马上进行调节,这样不就容易引起震荡了嘛,所以不管怎么说这个积分调节都有点滞后的意思在里面,不管你容错多少这个误差都发生了,那么有没有办法对这种误差进行预测呢,就是需要微分环节了。

Kd为微分控制: 微分显然与变化率有关,你可以把它理解为导数,它可以减小超调量来克服震荡,使系统稳定性提高,同时加快响应速度,使系统更快有更好的动态性能,这就像个“预言家”,它可以根据变化率来判断系统快要上升还是下降来提前改变系统的控制量这就与积分作用形成互补,这样一来系统就几乎完美了。

3、Matlab-PID调节器

在较新版本MATLAB中的 “应用程序”中,有诸多的调节器,用起来简直太方便了,简单介绍一下PID调节器,我的是R2014b:
在这里插入图片描述
在已知被控对象开环传函的情况下,对单位负反馈中的PID进行调节,使得单位阶跃响应达到最佳。

  • 点击Plant下的Import输入被调节对象的传函,传函是从matlab 工作区中选的,可以传入多个一起调节;

  • Type可以用来改变PID的类型(P/I/PI/PD/PID/PDF/PIDF);

  • Domain可以选择是时域调节还是频域调节,时域调节是调节response time(响应时间)和transient behavior(暂态特性),频域调节是调节bandwidth(带宽)和phase margin(相角裕度)。点击图标可以加快或者减慢调节;

  • show parameter可以看控制器的参数(窗口的最下端也有)和曲线的特性(超调量,稳定性等等);

  • Export选中想要获得的PID参数,可以输出到工作区中;

  • 点击曲线上的点可以显示该点的横纵坐标。

在这里插入图片描述

<think>好的,用户想在Gazebo中实现机械狗的仿真环境,涉及手写建模与配置。首先,我需要整理相关步骤,确保涵盖URDF模型编写、Gazebo插件配置、控制器设置等关键点。 用户提供的引用中提到,他们通过ROS的话题通信控制模型,提到了对Gazebo参数配置的不熟悉。因此,在回答中需要详细说明URDF的结构,尤其是Gazebo的插件部分,如传输插件和控制器配置,这些是让模型在Gazebo中正确运行的关键。 接下来,我应该分步骤解释如何创建URDF文件,包括关节和连杆的定义,以及添加Gazebo所需的惯性属性和传输插件。例如,需要解释<gazebo>标签的使用,以及如何为每个关节配置<transmission>来连接到ROS控制器。 然后,控制器的配置部分需要说明YAML文件的内容,比如joint_state_controller和position_controller的设置,指导用户如何加载这些控制器。此外,用户可能对启动文件的编写不太熟悉,所以需要提供launch文件的示例,包括加载URDF到参数服务器和启动Gazebo的节点。 最后,用户可能遇到Gazebo参数配置的问题,比如模型位置偏移或控制器无法启动,这部分需要给出常见问题及解决方法,帮助他们排查错误。同时,相关问题部分可以引导用户进步学习运动学理论和Gazebo的深入教程,以加强他们的理论基础和实操能力。</think>在Gazebo中实现机械狗仿真的手写建模与配置需要以下关键步骤: ### 、创建URDF模型 1. 编写基础机械结构: ```xml <robot name="quadruped"> <!-- 定义基座连杆 --> <link name="base_link"> <inertial> <mass value="5"/> <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/> </inertial> <visual>...</visual> <collision>...</collision> </link> <!-- 定义腿部关节 --> <joint name="hip_joint" type="revolute"> <parent link="base_link"/> <child link="thigh_link"/> <axis xyz="0 0 1"/> <limit effort="100" velocity="2.0" lower="-1.57" upper="1.57"/> </joint> </robot> ``` 需为每个关节添加对应的连杆和惯性参数,建议采用模块化设计[^1]。 ### 二、Gazebo插件配置 ```xml <!-- 添加Gazebo颜色插件 --> <gazebo reference="base_link"> <material>Gazebo/Orange</material> </gazebo> <!-- 配置传输插件 --> <transmission type="SimpleTransmission" name="hip_joint_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="hip_joint"> <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> </joint> <actuator name="hip_joint_motor"> <mechanicalReduction>1</mechanicalReduction> </actuator> </transmission> ``` 每个驱动关节都需要配置对应的transmission插件。 ### 三、控制器配置(controllers.yaml) ```yaml joint_state_controller: type: joint_state_controller/JointStateController publish_rate: 50 hip_controller: type: effort_controllers/JointPositionController joint: hip_joint pid: {p: 100.0, i: 0.01, d: 10.0} ``` 需为每个关节配置独立的PID参数,建议先通过仿真调试确定合适值。 ### 四、启动文件配置 ```xml <launch> <!-- 加载URDF到参数服务器 --> <param name="robot_description" textfile="$(find quadruped)/urdf/quadruped.urdf"/> <!-- 启动Gazebo --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="paused" value="false"/> </include> <!-- 生成机器人模型 --> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model quadruped"/> <!-- 加载控制器 --> <rosparam file="$(find quadruped)/config/controllers.yaml" command="load"/> <node name="controller_spawner" pkg="controller_manager" type="spawner" args="joint_state_controller hip_controller"/> </launch> ``` ### 常见问题处理 1. **模型位置偏移**:检查URDF中joint的origin设置 2. **控制器无法启动**:确认transmission插件配置正确性 3. **关节抖动**:调整PID参数,建议初始值P=100,I=0.1,D=10 4. **碰撞异常**:验证collision标签的几何参数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值