自动驾驶控制算法——滑模控制(SMC)原理与建模

发布于:2025-08-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

自动驾驶控制算法——滑模控制(SMC)原理与建模

一、滑模控制概述与核心思想

1.1 什么是滑模控制?

滑模控制(Sliding Mode Control, SMC)**是一种面向**非线性、不确定系统鲁棒控制方法。它通过引入滑模面(sliding surface),将系统的状态“吸引”到该面并沿其滑动,从而实现期望的控制目标。

核心理念如下:

  • 设计一个滑模面:描述系统理想行为的“约束面”;
  • 设计一个控制律:驱使系统状态先“逼近”该面,然后“沿面滑动”至目标状态;
  • 实现控制目标时,系统对建模误差与外部扰动具有鲁棒性。

我们知道,自动驾驶中车辆必须在各种复杂环境下运行,比如:

  • 地面摩擦力变化(雨天、冰面);
  • 车辆参数误差(载重变化、转向模型不准确);
  • 突发扰动(风、碰撞、感知误差);

这些不确定性会让传统的 PID、LQR 控制器性能大打折扣。而滑模控制专门就是为了应对这种“不确定”和“干扰”场景。

1.2 滑模控制的核心思想(你只记这句话也行)

“我设计一条理想轨迹(滑模面),强制系统迅速靠近并贴着它走,哪怕它一开始偏得很远。”

可以类比为:
🚗一辆车行驶在山路上,如果把“滑模面”比作有护栏的安全车道,滑模控制就是一个粗暴但稳定的老司机——只要车一偏出轨道,就用力把它“推回来”。


1.3 它是怎么做到的?

两步:

  1. 构造滑模面 s ( x ) = 0 s(x) = 0 s(x)=0:就像给系统画一条“轨迹线”;
  2. 设计控制律 u ( x ) u(x) u(x):强制系统状态靠近并一直沿着这条线走。

1.2 滑模控制的闭环结构

滑模控制的闭环结构如图所示:

在这里插入图片描述

  • 系统误差 e ( t ) = x ( t ) − x d ( t ) e(t) = x(t) - x_d(t) e(t)=x(t)xd(t) 作为输入;
  • 控制器设计一个滑模面 s ( t ) s(t) s(t),并输出控制信号 u ( t ) u(t) u(t),使得 s ( t ) → 0 s(t) \to 0 s(t)0
  • 当系统状态落入滑模面后,将强制保持系统在该面上滑动直至终点;
  • 利用不变性原理确保滑模阶段系统稳定、鲁棒。

通俗易懂地说:

  1. 当前状态误差 → 计算滑模面 s ( x ) s(x) s(x)
  2. 判断是否偏离滑模面;
  3. 偏了就给控制量 u u u,把系统推回来;
  4. 系统状态逼近后就开始“滑动”,稳定地走到终点。

1.3 与 MPC / LQR / PID 的对比分析

特征项 PID 控制 LQR 控制 MPC 控制 滑模控制(SMC)
控制原理 当前误差反馈 最优反馈控制 滚动优化规划 滑模面强迫逼近 + 滑动行为
模型依赖性 中(只要求系统可控)
鲁棒性 中等-强 很强(可容忍参数不确定性)
约束处理能力 强(可显式约束) 一般(靠增益/边界定义间接控制)
控制器求解方式 显式公式 Riccati 方程 二次规划(QP) 控制律解析 + 饱和函数处理
实时性 弱(计算量大) 强(结构简单,适合嵌入式)
典型应用场景 工业自动化 航空航天 自动驾驶、机器人 自动驾驶、抗扰控制、非线性鲁棒控制

二、滑模控制器的数学建模(用于自动驾驶横向控制)

本节我们以自动驾驶中的车辆横向控制任务为例,从建模出发,逐步推导滑模控制器的设计方法。


2.1 车辆横向动力学建模(简化单轨模型)

考虑一辆自动驾驶车辆跟随参考轨迹行驶,其横向动力学可通过**Bicycle Model(单轨模型)**描述。

设定如下变量:

  • e y e_y ey:横向误差(车辆质心到轨迹的垂直距离);
  • e ψ e_\psi eψ:航向角误差(车辆朝向与轨迹切线夹角);
  • v x v_x vx:纵向速度(假设为常量);
  • δ \delta δ:前轮转角(控制输入);
  • L L L:车辆轴距;

线性化后简化模型如下:

{ e ˙ y = v x e ψ e ˙ ψ = v x L δ \begin{cases} \dot{e}_y = v_x e_\psi \\ \dot{e}_\psi = \dfrac{v_x}{L} \delta \end{cases} {e˙y=vxeψe˙ψ=Lvxδ

状态变量定义:

x = [ e y e ψ ] , u = δ x = \begin{bmatrix} e_y \\ e_\psi \end{bmatrix}, \quad u = \delta x=[eyeψ],u=δ

则状态空间模型为:

x ˙ = A x + B u , A = [ 0 v x 0 0 ] , B = [ 0 v x L ] \dot{x} = A x + B u, \quad A = \begin{bmatrix} 0 & v_x \\ 0 & 0 \end{bmatrix}, \quad B = \begin{bmatrix} 0 \\ \dfrac{v_x}{L} \end{bmatrix} x˙=Ax+Bu,A=[00vx0],B=[0Lvx]

让车辆精确贴着参考轨迹(例如道路中心线)行驶。

我们关心两个误差:

  • e y e_y ey:横向误差(车离道路中心有多远);
  • e ψ e_\psi eψ:航向误差(车的朝向偏了多少角度);

最终目标是让这两个误差都变成 0。

2.2 滑模面设计

滑模控制的第一步是构造滑模面

s = e ˙ y + λ e y = v x e ψ + λ e y s = \dot{e}_y + \lambda e_y = v_x e_\psi + \lambda e_y s=e˙y+λey=vxeψ+λey

其中 λ > 0 \lambda > 0 λ>0 是设计参数,用于调节系统响应速度与滑动面形状。

目标是强制系统进入并保持在 s = 0 s = 0 s=0 的平面上滑动,即使:

s ( t ) → 0 , 且 s ˙ ( t ) < 0 (稳定趋近) s(t) \to 0, \quad \text{且} \quad \dot{s}(t) < 0 \text{(稳定趋近)} s(t)0,s˙(t)<0(稳定趋近)

简单来说:

我们定义一个“判断偏离程度”的量 sss,称为滑模面:

s = e ˙ y + λ e y = v x e ψ + λ e y s = \dot{e}_y + \lambda e_y = v_x e_\psi + \lambda e_y s=e˙y+λey=vxeψ+λey

它的含义很简单:

只要 s = 0 s=0 s=0,说明车辆横向误差和方向误差之间达到了平衡,正好朝着目标轨迹移动。

我们目标是:

s ( t ) → 0 ⇒ 车辆会自动滑行到参考轨迹。 s(t) \to 0 \quad \Rightarrow \quad 车辆会自动滑行到参考轨迹。 s(t)0车辆会自动滑行到参考轨迹。


2.3 控制律设计

我们希望系统满足趋近条件,我们要求系统状态逼近滑模面,就要控制转角 δ \delta δ,满足:

s ˙ = − η ⋅ sign ( s ) , η > 0 \dot{s} = -\eta \cdot \text{sign}(s), \quad \eta > 0 s˙=ηsign(s),η>0

也就是说,系统状态无论偏到哪边,都要让它“加速度地”靠近 s = 0 s = 0 s=0 这条线:

s ˙ = v x e ˙ ψ + λ e ˙ y = v x ( v x L δ ) + λ v x e ψ \dot{s} = v_x \dot{e}_\psi + \lambda \dot{e}_y = v_x \left( \dfrac{v_x}{L} \delta \right) + \lambda v_x e_\psi s˙=vxe˙ψ+λe˙y=vx(Lvxδ)+λvxeψ

代入趋近条件:

v x ( v x L δ ) + λ v x e ψ = − η ⋅ sign v_x \left( \dfrac{v_x}{L} \delta \right) + \lambda v_x e_\psi = -\eta \cdot \text{sign} vx(Lvxδ)+λvxeψ=ηsign

解得控制律:

δ = L v x 2 ( − λ v x e ψ − η ⋅ sign ( s ) ) \delta = \dfrac{L}{v_x^2} \left( -\lambda v_x e_\psi - \eta \cdot \text{sign}(s) \right) δ=vx2L(λvxeψηsign(s))


2.4 为什么说滑模控制很“鲁棒”?

  • 因为它只关心“是否偏离滑模面”,而不是模型细节;
  • 不管外面有风、有载重变化、有非线性扰动——我只让系统逼近并滑动在滑模面上,谁来扰都不怕
  • 控制律中那一项 sign ( s ) \text{sign}(s) sign(s),相当于一种“强制纠偏机制”。

2.5 抖振问题与饱和函数改进

由于 sign ( s ) \text{sign}(s) sign(s) 是非连续函数,直接用会导致控制器输出剧烈切换(chattering),对执行机构(如转向系统)造成冲击。

可使用**饱和函数(saturation function)**替代:

sat ( s ϕ ) = { 1 s > ϕ s ϕ ∣ s ∣ ≤ ϕ − 1 s < − ϕ \text{sat}\left( \frac{s}{\phi} \right) = \begin{cases} 1 & s > \phi \\ \frac{s}{\phi} & |s| \le \phi \\ -1 & s < -\phi \end{cases} sat(ϕs)= 1ϕs1s>ϕsϕs<ϕ

δ = L v x 2 ( − λ v x e ψ − η ⋅ sat ( s / ϕ ) ) \delta = \dfrac{L}{v_x^2} \left( -\lambda v_x e_\psi - \eta \cdot \text{sat}(s/\phi) \right) δ=vx2L(λvxeψηsat(s/ϕ))

其中 ϕ \phi ϕ 是饱和带宽(通常较小),平衡抖振与响应速度。

意思是:

小偏差就“柔和”纠正(线性调节),大偏差才“强制”推回来(饱和控制)。

三、滑模控制的优化机制与发展方向

3.1 滑模控制为什么也需要优化?

虽然滑模控制本身设计就鲁棒、不依赖模型的精准参数,但在实际工程中,我们还希望它:

  • 控制更平滑(别抖动);
  • 收敛更快(响应快);
  • 更节能(控制量别太大);
  • 自动适应不同路况(比如转弯时更快收敛);

于是——
👉 我们不再满足于“只管它稳定”,而是想让它“又稳又好”,这就引入了“优化设计”的思想。


3.2 优化滑模控制的三种方式

我们总结出三类:

类别 优化点 本质思想
① 最优滑模面设计 优化滑模面 s = f ( x ) s = f(x) s=f(x) 的参数 控制系统性能更佳(收敛更快、控制更小)
② 自适应滑模控制 在线调节控制器增益 K ( t ) K(t) K(t) 系统运行时自己“调节力度”
③ 高阶滑模控制 控制信号连续性(避免抖动) 使用导数补偿,提高平滑性

3.3 最优滑模面设计:让系统“走得更好”

在基础滑模控制中,我们通常直接设定:

s = e ˙ y + λ e y s = \dot{e}_y + \lambda e_y s=e˙y+λey

但这个 λ \lambda λ 是人为拍脑袋选的。能不能让它自动“最优”?

解决方法:构造一个代价函数,然后最小化它

我们可以借鉴 LQR、MPC 的思路,引入一个性能指标:

J = ∫ 0 ∞ ( e y 2 ( t ) + ρ ⋅ u 2 ( t ) )   d t J = \int_0^\infty \left( e_y^2(t) + \rho \cdot u^2(t) \right) \, dt J=0(ey2(t)+ρu2(t))dt

  • 第一个项 e y 2 e_y^2 ey2:衡量跟踪误差;
  • 第二项 ρ u 2 \rho u^2 ρu2:控制能耗或平滑性;
  • ρ > 0 \rho > 0 ρ>0 是权重因子(就像 MPC 中的 Q , R Q, R Q,R);

目标:找到一组最优参数(如 λ ∗ \lambda^* λ, η ∗ \eta^* η),使得系统的整体误差最小。

这时滑模控制就从“鲁棒逻辑控制器”转变为“优化调参系统”。


3.4 自适应滑模控制(Adaptive SMC)

标准滑模控制中,控制律是:

u = − K ⋅ sign ( s ) u = -K \cdot \text{sign}(s) u=Ksign(s)

K K K 选得太小——系统靠不拢滑模面;
K K K 选得太大——控制器过于激进、抖动严重。

那怎么办?

👉 让系统自己“看情况”调整 KKK

控制律改成:

u = − K ( t ) ⋅ sign ( s ) , 其中  K ( t )  自动变化 u = -K(t) \cdot \text{sign}(s), \quad \text{其中 } K(t) \text{ 自动变化} u=K(t)sign(s),其中 K(t) 自动变化

例如:

K ˙ ( t ) = { γ , ∣ s ∣ > ϕ (远离滑模面,增大力度) − β , ∣ s ∣ ≤ ϕ (已靠近滑模面,减小力度) \dot{K}(t) = \begin{cases} \gamma, & |s| > \phi \quad \text{(远离滑模面,增大力度)} \\ -\beta, & |s| \le \phi \quad \text{(已靠近滑模面,减小力度)} \end{cases} K˙(t)={γ,β,s>ϕ(远离滑模面,增大力度)sϕ(已靠近滑模面,减小力度)

这种方式等于给控制器加了一点“智能”,能自动判断该强硬还是柔和。


3.5 高阶滑模控制:彻底解决抖动问题

滑模控制抖振(chattering)问题的本质是:

控制律中用了 sign ( s ) \text{sign}(s) sign(s),这是个不连续函数,导致控制输入剧烈跳变。

改进思路:

用控制的导数,设计控制信号连续性:

u ˙ = − k 1 s − k 2 ⋅ sign ( s ) ⇒ u ( t )  连续变化 \dot{u} = -k_1 s - k_2 \cdot \text{sign}(s) \Rightarrow u(t) \text{ 连续变化} u˙=k1sk2sign(s)u(t) 连续变化

最常见的结构是:

  • Super-Twisting 算法
  • Twisting + 反步设计
  • 也可以借助 Kalman 滤波器实现低通滤波。

这种改进叫做高阶滑模控制(Higher Order SMC),已在无人车、飞行器中广泛应用。


3.6 与 MPC 融合:预测 + 鲁棒二合一

你一定会问:滑模控制能不能和 MPC 一起用?

答案是 ✅ 可以的,而且是研究热点之一!

  • MPC 擅长处理约束、预测未来;
  • SMC 擅长处理非线性、干扰、模型不确定;

将 SMC 嵌入到 MPC 的“预测优化框架”中,可以设计出:
“滑模-MPC 控制器”,结合两者优点。


一句话总结本节

滑模控制可以从“鲁棒的控制器”升级为“性能优化器”,优化的不仅是控制律,还有行为、参数、自适应性,甚至能和预测控制融合使用。


你现在理解的知识体系应包括:

优化方向 优化内容 提升效果
最优滑模面设计 滑模参数(如 λ \lambda λ 更快更稳地收敛
自适应滑模控制 控制增益 K ( t ) K(t) K(t) 抗干扰时激进,靠近时柔和
高阶滑模控制 控制律的导数项 控制输入平滑、无抖动
SMC + MPC 结构融合 控制器结构 预测控制 + 鲁棒控制,面面俱到

四、滑模控制仿真与可视化

本节我们通过 Python 搭建一个滑模控制器仿真平台,用于验证其在轨迹跟踪任务中的表现,并可视化控制过程(状态误差收敛、滑模面逼近、控制输入变化等)。


4.1 控制对象模型:简化车辆横向动力学模型(线性化单轨)

使用如下状态空间模型(同前述):

{ e ˙ y = v x ⋅ e ψ e ˙ ψ = v x L ⋅ δ \begin{cases} \dot{e}_y = v_x \cdot e_\psi \\ \dot{e}_\psi = \dfrac{v_x}{L} \cdot \delta \end{cases} {e˙y=vxeψe˙ψ=Lvxδ

其中:

  • 状态:横向误差 e y e_y ey,航向角误差 e ψ e_\psi eψ
  • 控制输入:前轮转角 δ \delta δ
  • 假设:车辆以恒定速度 v x v_x vx 运行。

4.2 滑模控制律设计(饱和函数版)

滑模面:

s = v x e ψ + λ e y s = v_x e_\psi + \lambda e_y s=vxeψ+λey

控制律(平滑饱和函数):

δ = L v x 2 ( − λ v x e ψ − η ⋅ sat ( s / ϕ ) ) \delta = \frac{L}{v_x^2} \left( -\lambda v_x e_\psi - \eta \cdot \text{sat}(s/\phi) \right) δ=vx2L(λvxeψηsat(s/ϕ))

饱和函数定义为:

def sat(x, phi):
    if x > phi:
        return 1
    elif x < -phi:
        return -1
    else:
        return x / phi

4.3 Python 仿真代码(完整示例)

import numpy as np
import matplotlib.pyplot as plt

# ---------------------
# 参数设置
# ---------------------
v_x = 5.0      # m/s, 恒定速度
L = 2.5        # m, 轴距
lambda_ = 2.0  # 滑模面参数
eta = 3.0      # 控制强度
phi = 0.2      # 饱和带宽
dt = 0.01      # 仿真步长
T = 10         # 总时间
N = int(T / dt)

# ---------------------
# 初始状态
# ---------------------
e_y = 1.5      # 初始横向偏差(偏离中心1.5m)
e_psi = 0.4    # 初始航向角误差(约23度)
delta_log = []
s_log = []
ey_log = []
epsi_log = []

# ---------------------
# 仿真循环
# ---------------------
def sat(s, phi):
    return np.clip(s / phi, -1, 1)

for i in range(N):
    # 计算滑模面
    s = v_x * e_psi + lambda_ * e_y

    # 计算控制输入
    delta = (L / v_x**2) * (-lambda_ * v_x * e_psi - eta * sat(s, phi))

    # 状态更新(Euler积分)
    e_y_dot = v_x * e_psi
    e_psi_dot = v_x / L * delta
    e_y += e_y_dot * dt
    e_psi += e_psi_dot * dt

    # 记录
    delta_log.append(delta)
    s_log.append(s)
    ey_log.append(e_y)
    epsi_log.append(e_psi)

# ---------------------
# 可视化结果
# ---------------------
t = np.linspace(0, T, N)

plt.figure(figsize=(12, 8))

plt.subplot(3, 1, 1)
plt.plot(t, ey_log, label='Lateral Error $e_y$')
plt.plot(t, epsi_log, label='Heading Error $e_\\psi$')
plt.ylabel("Error")
plt.title("System State Errors")
plt.legend()
plt.grid()

plt.subplot(3, 1, 2)
plt.plot(t, s_log, label='Sliding Surface $s$')
plt.ylabel("s(t)")
plt.title("Sliding Surface Convergence")
plt.legend()
plt.grid()

plt.subplot(3, 1, 3)
plt.plot(t, delta_log, label='Control Input $\\delta$')
plt.xlabel("Time [s]")
plt.ylabel("Steering Angle [rad]")
plt.title("Control Input (Steering)")
plt.legend()
plt.grid()

plt.tight_layout()
plt.show()

5.4 可视化效果解释

在这里插入图片描述

图像 说明
图①:误差收敛图 展示 e y , e ψ e_y, e_\psi ey,eψ 随时间迅速收敛到 0,说明系统轨迹被成功拉回目标路径
图②:滑模面收敛图 滑模面 s ( t ) s(t) s(t) 收敛到 0,表明控制器成功将系统压进滑模面并保持滑动
图③:转向角控制量 控制输出逐步平滑收敛,说明引入饱和函数后抖振已消除,控制平稳

5.5 仿真输出对比图

图编号 内容 对比说明
图1 三类控制器的跟踪轨迹 看谁更贴近主轨迹/避障轨迹
图2 横向误差随时间变化曲线 比较误差收敛速度和误差范围
图3 控制输入(方向角)变化图 看谁控制更平稳、不抖动
图4 控制输入累积能量对比柱状图 看谁控制更省力
图5 切换轨迹响应时间与偏差图 比较在突发避障时的稳定性与响应

在这里插入图片描述

✅ 图1:轨迹跟踪对比

展示三种控制器与参考轨迹的贴合程度,MPC 贴合最好,其次为 SMC。


在这里插入图片描述

✅ 图2:横向误差曲线

显示横向误差随时间的变化,SMC 和 MPC 控制误差更小更稳定,LQR 有较多波动。


在这里插入图片描述

✅ 图3:控制输入变化(方向盘转角)

可视化不同控制器对转向控制的稳定性,SMC 控制动作偏大、但迅速;LQR 动作较激进,MPC 平稳。


在这里插入图片描述

✅ 图4:控制能耗对比

计算控制输入平方和作为能耗估计,MPC 最节能,SMC 稍高,LQR 能耗最大。


在这里插入图片描述

✅ 图5:避障响应与偏离程度

  • SMC 响应快,偏离小,适合突发避障;
  • LQR 反应慢且偏移大;
  • MPC 折中响应与偏离,整体性能较稳。

网站公告

今日签到

点亮在社区的每一天
去签到