滑模控制(Sliding Mode Control)算法详解
一、基本原理
滑模控制(Sliding Mode Control, SMC)是一种变结构控制方法,通过设计一个滑模面(Sliding Surface),迫使系统状态在有限时间内到达该面,并在滑模面上沿预定轨迹滑动至平衡点。其核心特点是强鲁棒性,能够有效抑制参数不确定性、模型误差和外部扰动。
关键步骤:
-
滑模面设计:
定义滑模面 ( s(t) = 0 ),通常选择误差及其导数的线性组合。
例如,对二阶系统:
[
s(t) = \dot{e}(t) + \lambda e(t) \quad (\lambda > 0)
]
其中 ( e(t) = x_{\text{desired}} - x(t) )。 -
控制律设计:
设计控制输入 ( u(t) ),使得系统状态在有限时间内收敛到滑模面,并保持滑动。
控制律一般形式:
[
u(t) = u_{\text{eq}}(t) + u_{\text{sw}}(t)
]- 等效控制 ( u_{\text{eq}} ):抵消系统动态,保证在滑模面上滑动。
- 切换控制 ( u_{\text{sw}} ):抑制扰动,通常包含符号函数 ( \text{sign}(s) )。
-
稳定性分析:
通过李雅普诺夫函数证明 ( \dot{V}(s) \leq -\eta |s| ),确保有限时间收敛。
二、分类
-
传统滑模控制
- 控制律包含不连续项(如符号函数),易引起抖振(高频振荡)。
- 示例:
[
u(t) = K \cdot \text{sign}(s)
]
-
高阶滑模控制
- 通过高阶导数平滑抖振,如超螺旋算法(Super-Twisting Algorithm)。
- 示例(二阶滑模):
[
u(t) = -k_1 |s|^{1/2} \text{sign}(s) + v, \quad \dot{v} = -k_2 \text{sign}(s)
]
-
终端滑模控制
- 引入非线性滑模面,实现有限时间收敛。
- 示例:
[
s(t) = \dot{e} + \beta e^{q/p} \quad (\beta > 0, , q < p \text{为正奇数})
]
三、代码实现(Python)
以二阶系统为例,设计传统滑模控制器。
python">import numpy as np
import matplotlib.pyplot as plt
class SlidingModeController:
def __init__(self, lambda_, K, dt):
self.lambda_ = lambda_ # 滑模面参数
self.K = K # 切换增益
self.dt = dt # 采样时间
self.prev_error = 0.0
def compute(self, desired, actual, actual_derivative):
error = desired - actual
error_derivative = (error - self.prev_error) / self.dt
self.prev_error = error
# 滑模面 s = error_derivative + lambda * error
s = error_derivative + self.lambda_ * error
# 控制律: u = K * sign(s)
u = self.K * np.sign(s)
return u
# 系统模型(二阶系统)
def system_model(x, dx, u, dt):
# 假设系统动力学: ddx = -2*dx - 3*x + u + 扰动
ddx = -2 * dx - 3 * x + u + 0.5 * np.sin(10 * x) # 加入扰动
dx_new = dx + ddx * dt
x_new = x + dx_new * dt
return x_new, dx_new
# 参数初始化
lambda_ = 2.0
K = 5.0
dt = 0.01
controller = SlidingModeController(lambda_, K, dt)
# 仿真
desired = 1.0
x, dx = 0.0, 0.0
time = np.arange(0, 10, dt)
x_history = []
for t in time:
u = controller.compute(desired, x, dx)
x_new, dx_new = system_model(x, dx, u, dt)
x, dx = x_new, dx_new
x_history.append(x)
# 绘图
plt.plot(time, x_history, label='Actual')
plt.plot(time, [desired]*len(time), 'r--', label='Desired')
plt.xlabel('Time (s)')
plt.ylabel('Position')
plt.legend()
plt.show()
四、在卫星姿态控制中的使用示例
场景
控制卫星三轴姿态(俯仰角、偏航角、滚动角),使其跟踪目标姿态角。
动力学模型(以俯仰轴为例):
[
J \ddot{\theta} = u + d(t)
]
- ( J ):转动惯量
- ( \theta ):俯仰角
- ( u ):控制力矩
- ( d(t) ):外部扰动(如太阳辐射压力)。
滑模控制设计
-
定义误差:
[
e = \theta_{\text{desired}} - \theta
] -
滑模面:
[
s = \dot{e} + \lambda e \quad (\lambda > 0)
] -
控制律:
[
u = J \left( \ddot{\theta}_{\text{desired}} + \lambda \dot{e} \right) - K \cdot \text{sign}(s)
]
(包含等效控制和切换项)
代码片段(简化)
python">class SatelliteSMController:
def __init__(self, lambda_, K, J, dt):
self.lambda_ = lambda_
self.K = K
self.J = J
self.dt = dt
self.prev_error = 0.0
def compute(self, theta_desired, theta, dtheta):
error = theta_desired - theta
error_derivative = (error - self.prev_error) / self.dt
self.prev_error = error
s = error_derivative + self.lambda_ * error
u_eq = self.J * (0 + self.lambda_ * error_derivative) # 假设目标角加速度为0
u_sw = -self.K * np.sign(s)
u = u_eq + u_sw
return u
# 卫星姿态动力学仿真
J = 100.0 # 转动惯量
dt = 0.01
controller = SatelliteSMController(lambda_=1.5, K=50, J=J, dt=dt)
theta, dtheta = 0.0, 0.0
theta_desired = np.deg2rad(30) # 目标30度
for _ in range(1000):
u = controller.compute(theta_desired, theta, dtheta)
ddtheta = (u + 10 * np.sin(2 * np.pi * 0.1 * _ * dt)) / J # 控制输入 + 扰动
dtheta += ddtheta * dt
theta += dtheta * dt
五、关键问题与改进
-
抖振抑制:
- 使用饱和函数 ( \text{sat}(s/\phi) ) 替代符号函数。
- 采用高阶滑模(如超螺旋算法)。
-
参数选择:
- ( \lambda ) 决定滑模面收敛速度。
- ( K ) 需大于扰动上界。
六、总结
- 优点:强鲁棒性,适用于复杂扰动和模型不确定性场景(如航天器、无人机)。
- 缺点:抖振可能影响执行机构寿命。
- 应用扩展:结合自适应控制、模糊逻辑,进一步提升性能。