悬架mpc控制程序模型 2自由度 4自由度 7自由度

在汽车动力学控制领域,悬架系统的精准控制至关重要。模型预测控制(MPC)因其能有效处理多变量、有约束的复杂系统控制问题,在悬架控制中得到了广泛应用。今天咱们就来聊聊悬架MPC控制程序模型中2自由度、4自由度和7自由度模型的那些事儿。

2自由度悬架MPC控制模型

2自由度悬架模型相对简单,通常考虑车身垂直运动和俯仰运动。它把汽车简化为一个具有两个自由度的刚体系统,主要聚焦于车身的垂直振动和俯仰振动,忽略了一些次要因素。

以下是简单的Python代码示例来初步模拟2自由度悬架MPC控制(此处仅为示意,实际应用更为复杂):

import numpy as np
import matplotlib.pyplot as plt


# 定义系统参数
m_s = 1000  # 簧载质量
m_u = 100  # 非簧载质量
k_s = 20000  # 悬架弹簧刚度
k_t = 200000  # 轮胎刚度
c_s = 1000  # 悬架阻尼系数


# 状态空间方程离散化
dt = 0.01
A = np.array([[1, dt, 0, 0],
              [-(k_s / m_s), -(c_s / m_s), k_s / m_s, c_s / m_s],
              [0, 0, 1, dt],
              [k_s / m_u, c_s / m_u, -(k_s + k_t) / m_u, -c_s / m_u]])
B = np.array([[0],
              [1 / m_s],
              [0],
              [-1 / m_u]])


# MPC参数
N = 10  # 预测时域
Q = np.diag([100, 1, 100, 1])  # 状态权重矩阵
R = np.diag([1])  # 控制输入权重矩阵


# 初始化
x = np.array([[0], [0], [0], [0]])  # 初始状态
u_list = []
x_list = []


# MPC控制循环
for i in range(100):
    H = np.zeros((N * 4, N * 4))
    f = np.zeros((N * 4, 1))
    for k in range(N):
        Ak = np.linalg.matrix_power(A, k + 1)
        Bk = np.zeros((4, 1))
        for j in range(k + 1):
            Bk = Bk + np.linalg.matrix_power(A, k - j) @ B
        Hk = Ak.T @ Q @ Ak
        fk = Ak.T @ Q @ np.array([[0], [0], [0], [0]])
        if k > 0:
            H[4 * k:4 * (k + 1), 4 * (k - 1):4 * k] = Ak.T @ Q @ np.linalg.matrix_power(A, 1)
        H[4 * k:4 * (k + 1), 4 * k:4 * (k + 1)] = Hk
        f[4 * k:4 * (k + 1), :] = fk
        if k < N - 1:
            H[4 * k:4 * (k + 1), (k + 1) * 1:(k + 2) * 1] = -Bk.T @ Q @ Ak
    H = H + np.block([[np.zeros((N * 4, N)), np.zeros((N * 4, N))],
                      [np.zeros((N, N * 4)), R * np.eye(N)]])
    f = np.vstack((f, np.zeros((N, 1))))
    u_opt = np.linalg.solve(H, -f)
    u = u_opt[0]
    x = A @ x + B * u
    u_list.append(u)
    x_list.append(x)


# 绘图
time = np.arange(len(u_list)) * dt
plt.figure()
plt.plot(time, np.array(u_list))
plt.xlabel('Time (s)')
plt.ylabel('Control Input (N)')
plt.title('2 - DOF Suspension MPC Control Input')
plt.show()

代码分析:首先定义了系统的物理参数,如簧载质量、非簧载质量、弹簧刚度和阻尼系数等。然后对状态空间方程进行离散化,这一步很关键,因为MPC是基于离散时间系统进行控制的。接着设置MPC的参数,像预测时域、状态权重矩阵和控制输入权重矩阵。在控制循环中,通过构建Hessian矩阵H和向量f来求解最优控制输入u,这个过程其实就是在预测时域内最小化代价函数。最后将控制输入和系统状态记录下来并绘图展示。2自由度模型虽然简单,但能初步揭示悬架系统在垂直和俯仰方向上的动力学特性,为更复杂模型的研究打下基础。

4自由度悬架MPC控制模型

4自由度悬架模型在2自由度的基础上进行拓展,一般会增加两个车轮的垂直运动自由度。这样的模型更贴近实际情况,能考虑到左右车轮在不同路面激励下的响应差异。

代码示例(同样是简化示意):

import numpy as np
import matplotlib.pyplot as plt


# 系统参数
m_s = 1000
m_u1 = 100
m_u2 = 100
k_s1 = 20000
k_s2 = 20000
k_t1 = 200000
k_t2 = 200000
c_s1 = 1000
c_s2 = 1000


# 状态空间方程离散化
dt = 0.01
A = np.array([[1, dt, 0, 0, 0, 0],
              [-(k_s1 + k_s2) / m_s, -(c_s1 + c_s2) / m_s, k_s1 / m_s, c_s1 / m_s, k_s2 / m_s, c_s2 / m_s],
              [0, 0, 1, dt, 0, 0],
              [k_s1 / m_u1, c_s1 / m_u1, -(k_s1 + k_t1) / m_u1, -c_s1 / m_u1, 0, 0],
              [0, 0, 0, 0, 1, dt],
              [k_s2 / m_u2, c_s2 / m_u2, 0, 0, -(k_s2 + k_t2) / m_u2, -c_s2 / m_u2]])
B = np.array([[0],
              [1 / m_s],
              [0],
              [-1 / m_u1],
              [0],
              [-1 / m_u2]])


# MPC参数
N = 10
Q = np.diag([100, 1, 100, 1, 100, 1])
R = np.diag([1, 1])


# 初始化
x = np.array([[0], [0], [0], [0], [0], [0]])
u = np.array([[0], [0]])
u_list = []
x_list = []


# MPC控制循环
for i in range(100):
    H = np.zeros((N * 6, N * 6))
    f = np.zeros((N * 6, 1))
    for k in range(N):
        Ak = np.linalg.matrix_power(A, k + 1)
        Bk = np.zeros((6, 2))
        for j in range(k + 1):
            Bk = Bk + np.linalg.matrix_power(A, k - j) @ B
        Hk = Ak.T @ Q @ Ak
        fk = Ak.T @ Q @ np.array([[0], [0], [0], [0], [0], [0]])
        if k > 0:
            H[6 * k:6 * (k + 1), 6 * (k - 1):6 * k] = Ak.T @ Q @ np.linalg.matrix_power(A, 1)
        H[6 * k:6 * (k + 1), 6 * k:6 * (k + 1)] = Hk
        f[6 * k:6 * (k + 1), :] = fk
        if k < N - 1:
            H[6 * k:6 * (k + 1), (k + 1) * 2:(k + 2) * 2] = -Bk.T @ Q @ Ak
    H = H + np.block([[np.zeros((N * 6, N * 2)), np.zeros((N * 6, N * 2))],
                      [np.zeros((N * 2, N * 6)), R * np.eye(N * 2)]])
    f = np.vstack((f, np.zeros((N * 2, 1))))
    u_opt = np.linalg.solve(H, -f)
    u = u_opt[0:2]
    x = A @ x + B @ u
    u_list.append(u)
    x_list.append(x)


# 绘图
time = np.arange(len(u_list)) * dt
plt.figure()
plt.plot(time, np.array(u_list)[:, 0], label='Control Input 1')
plt.plot(time, np.array(u_list)[:, 1], label='Control Input 2')
plt.xlabel('Time (s)')
plt.ylabel('Control Input (N)')
plt.title('4 - DOF Suspension MPC Control Input')
plt.legend()
plt.show()

代码分析:这里在系统参数部分增加了两个非簧载质量、两组弹簧刚度和阻尼系数,以分别描述左右车轮相关参数。状态空间方程矩阵A和输入矩阵B维度也相应增加。MPC参数中的权重矩阵Q和R根据新的状态和控制输入维度进行调整。控制循环中构建Hessian矩阵H和向量f的过程与2自由度类似,但维度和计算复杂度有所上升。通过这个模型,可以更好地模拟左右车轮不同激励下悬架系统的响应,对改善车辆行驶平顺性和操控稳定性有重要意义。

7自由度悬架MPC控制模型

7自由度悬架模型进一步细化,除了车身的垂直、俯仰和侧倾运动,还包括四个车轮的垂直运动。这是一个更全面且复杂的模型,能更精确地反映车辆在实际行驶过程中的各种动力学行为。

悬架mpc控制程序模型 2自由度 4自由度 7自由度

由于7自由度模型代码较为复杂,这里给出主要思路。在状态空间方程中,状态变量会增加到7个,包括车身侧倾角度、侧倾角速度等。系统参数不仅要考虑前后左右车轮的参数,还需要考虑与侧倾相关的参数,如侧倾刚度等。MPC控制过程同样是在预测时域内通过调整控制输入来最小化代价函数,代价函数会综合考虑车身姿态、车轮动载荷等多方面因素。

7自由度模型虽然计算量大,但能为悬架系统的优化设计和精确控制提供更丰富的信息。它可以考虑到车辆在转弯、制动等复杂工况下悬架系统的动态响应,从而实现更高级的车辆动力学控制策略。

从2自由度到4自由度再到7自由度的悬架MPC控制模型,每一步的拓展都是对车辆悬架系统理解的深化,为实现更高效、舒适和安全的车辆行驶控制提供了有力的工具。在实际应用中,需要根据具体的需求和计算资源来选择合适的模型,不断优化悬架控制策略,提升车辆的整体性能。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐