4. 位置伺服系统PD控制
任务目标
构建一个位置伺服系统(双积分对象)的PD控制器,通过整定比例增益Kp与微分增益Kd,使系统对单位阶跃位置指令的响应满足:无超调且稳态误差为零。采用Python实现仿真,通过临界阻尼条件确定参数范围,并验证闭环性能。
被控对象与控制器结构
位置伺服系统简化为双积分模型(等效为惯量负载,忽略摩擦):
P(s) = 1 / (J·s²),取 J = 1 kg·m²
PD控制律(位置环+速度内环等效):
C(s) = Kp + Kd·s
闭环传递函数为:
G(s) = (Kp + Kd·s) / (s² + Kd·s + Kp)
特征方程 s² + Kd·s + Kp = 0。无超调条件为阻尼比 ζ ≥ 1,即 Kd ≥ 2√Kp。稳态误差为零由系统I型特性保证(开环含积分环节)。
完整实现代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lti, step
# 系统参数
J = 1.0 # 转动惯量 (kg·m²)
Kp = 100.0 # 比例增益
Kd = 22.0 # 微分增益(满足 Kd ≥ 2√Kp = 20,取22留裕量)
# 闭环传递函数: G(s) = (Kd·s + Kp) / (s² + Kd·s + Kp)
num = [Kd, Kp]
den = [1, Kd, Kp]
sys = lti(num, den)
# 阶跃响应仿真
t_end = 2.0
t = np.linspace(0, t_end, 2000)
t_out, y_out = step(sys, T=t)
# 性能指标计算
final_value = y_out[-1]
overshoot = (np.max(y_out) - final_value) / final_value * 100
# 稳态误差(2%准则)
idx_settle = np.where(np.abs(y_out - final_value) < 0.02 * final_value)[0]
settle_time = t_out[idx_settle[0]] if len(idx_settle) > 0 else None
# 输出结果
print(f"稳态值: {final_value:.4f}")
print(f"超调量: {overshoot:.2f}%")
print(f"2%调节时间: {settle_time:.4f} s" if settle_time else "未达到2%准则")
# 绘制阶跃响应
plt.figure(figsize=(8, 5))
plt.plot(t_out, y_out, 'b-', linewidth=2, label='PD控制响应')
plt.axhline(y=1.0, color='gray', linestyle='--', linewidth=1)
plt.axhline(y=1.02, color='red', linestyle=':', linewidth=1)
plt.axhline(y=0.98, color='red', linestyle=':', linewidth=1)
plt.xlabel('时间 (s)')
plt.ylabel('位置输出')
plt.title(f'位置伺服PD控制阶跃响应 (Kp={Kp}, Kd={Kd})')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim([0, t_end])
plt.ylim([0, 1.2])
plt.show()
运行方式与依赖
需要安装:numpy、scipy、matplotlib。运行命令:
pip install numpy scipy matplotlib
python pd_position_control.py
参数整定与验证方法
整定规则:先根据期望响应速度选择Kp(此处取100),再由无超调条件 Kd ≥ 2√Kp 确定Kd下限。取Kd=22(略大于临界值20)可保证无超调同时保留一定快速性。
验证步骤:
- 运行代码,观察输出超调量是否为0.00%;
- 检查稳态值是否趋近1.0(稳态误差为零);
- 观察图形曲线是否单调上升无振荡,且最终收敛到1.0。
通过条件:超调量=0%且稳态值=1.0000(误差<0.1%)。若出现超调,增大Kd;若响应过慢,增大Kp并同步调整Kd。
参数影响验证
将Kd改为15(小于临界值20)重新运行,可观察到约4.5%的超调,验证阻尼条件Kd ≥ 2√Kp的正确性。将Kp改为400并取Kd=40(临界值),系统仍无超调但响应更快,说明整定规则可扩展。
图中绿色区域为满足无超调条件的参数组合(Kd ≥ 2√Kp),蓝色点为当前案例参数(Kp=100, Kd=22),紫色点为扩展验证参数(Kp=400, Kd=40),均位于无超调区域内。
常见问题
- 出现超调:Kd取值小于临界值,增大Kd至满足
Kd ≥ 2√Kp。 - 稳态误差不为零:检查系统是否包含积分环节(本模型开环含1/s²,I型系统保证阶跃无静差)。若实际系统含摩擦,需在前向通道加入积分项。
- 响应振荡:Kp过大导致闭环带宽过高,适当降低Kp并同步调整Kd。