基于分布式驱动电动汽车的路面附着系数估计,分别采用无迹卡尔曼滤波和容积卡尔曼滤波对电动汽车四个车轮的路面附着系数进行估计。 本模型参考sci二区顶刊,开发了分布式驱动电动汽车路面附着系数估计的进阶版本,可在高速,低速下,对开路面,对接路面四种组合工况下对路面附着系数进行准确估计估计。 该模型利用无迹卡尔曼滤波,容积卡尔曼滤波对路面附着系数分别进行估计,容积卡尔曼和无迹卡尔曼均由S- function编写,可比较二种滤波的估计效果。 下图分别是路面附着系数初始状态为1和0时的估计效果,由此可见,两种算法具有较快的收敛速度和较高的估计精度,且不受初始状态的影响。

在电动汽车的研究领域中,准确估计路面附着系数对于车辆的安全与性能优化至关重要。今天就来聊聊基于分布式驱动电动汽车的路面附着系数估计,这里采用了无迹卡尔曼滤波(Unscented Kalman Filter, UKF)和容积卡尔曼滤波(Cubature Kalman Filter, CKF)两种方法。

基于分布式驱动电动汽车的路面附着系数估计,分别采用无迹卡尔曼滤波和容积卡尔曼滤波对电动汽车四个车轮的路面附着系数进行估计。 本模型参考sci二区顶刊,开发了分布式驱动电动汽车路面附着系数估计的进阶版本,可在高速,低速下,对开路面,对接路面四种组合工况下对路面附着系数进行准确估计估计。 该模型利用无迹卡尔曼滤波,容积卡尔曼滤波对路面附着系数分别进行估计,容积卡尔曼和无迹卡尔曼均由S- function编写,可比较二种滤波的估计效果。 下图分别是路面附着系数初始状态为1和0时的估计效果,由此可见,两种算法具有较快的收敛速度和较高的估计精度,且不受初始状态的影响。

这个模型可是参考了 sci 二区顶刊开发的进阶版本,厉害之处在于,无论是高速、低速行驶,还是面对对开路面、对接路面这四种不同工况组合,都能精准地估计路面附着系数。

滤波算法实现

无迹卡尔曼滤波(UKF)

无迹卡尔曼滤波是通过UT变换来近似状态和协方差的传递。在代码实现上,主要步骤如下(这里以简单的 Python 伪代码示例):

import numpy as np

# 定义状态转移矩阵
F = np.array([[1, 1], [0, 1]])
# 定义观测矩阵
H = np.array([[1, 0]])

# 状态初始值
x = np.array([[0], [0]])
# 协方差初始值
P = np.eye(2)

# 过程噪声协方差
Q = np.array([[0.01, 0], [0, 0.01]])
# 观测噪声协方差
R = np.array([[0.1]])

def ukf_predict(x, P, F, Q):
    # 计算sigma点
    n = x.shape[0]
    lambda_ = 3 - n
    Wm = np.zeros(2 * n + 1)
    Wc = np.zeros(2 * n + 1)
    Wm[0] = lambda_ / (lambda_ + n)
    Wc[0] = lambda_ / (lambda_ + n) + (1 - np.power(2, -1))
    for i in range(1, 2 * n + 1):
        Wm[i] = 1 / (2 * (lambda_ + n))
        Wc[i] = 1 / (2 * (lambda_ + n))

    Xsig = np.zeros((n, 2 * n + 1))
    Xsig[:, 0] = x.flatten()
    for i in range(n):
        Xsig[:, i + 1] = x.flatten() + np.sqrt((lambda_ + n) * P[:, i])
        Xsig[:, i + n + 1] = x.flatten() - np.sqrt((lambda_ + n) * P[:, i])

    # 预测步骤
    Xsig_p = np.dot(F, Xsig)
    x = np.dot(Wm, Xsig_p)
    P = np.dot(np.dot(Wc, (Xsig_p - x).T), (Xsig_p - x)) + Q
    return x, P

def ukf_update(x, P, H, R, z):
    # 计算sigma点
    n = x.shape[0]
    lambda_ = 3 - n
    Wm = np.zeros(2 * n + 1)
    Wc = np.zeros(2 * n + 1)
    Wm[0] = lambda_ / (lambda_ + n)
    Wc[0] = lambda_ / (lambda_ + n) + (1 - np.power(2, -1))
    for i in range(1, 2 * n + 1):
        Wm[i] = 1 / (2 * (lambda_ + n))
        Wc[i] = 1 / (2 * (lambda_ + n))

    Xsig = np.zeros((n, 2 * n + 1))
    Xsig[:, 0] = x.flatten()
    for i in range(n):
        Xsig[:, i + 1] = x.flatten() + np.sqrt((lambda_ + n) * P[:, i])
        Xsig[:, i + n + 1] = x.flatten() - np.sqrt((lambda_ + n) * P[:, i])

    # 更新步骤
    Zsig = np.dot(H, Xsig)
    z_pred = np.dot(Wm, Zsig)
    Pzz = np.dot(np.dot(Wc, (Zsig - z_pred).T), (Zsig - z_pred)) + R
    Pxz = np.dot(np.dot(Wc, (Xsig - x).T), (Zsig - z_pred))
    K = np.dot(Pxz, np.linalg.inv(Pzz))
    x = x + np.dot(K, (z - z_pred))
    P = P - np.dot(np.dot(K, Pzz), K.T)
    return x, P

这里通过定义状态转移矩阵 F、观测矩阵 H 等参数,在 ukfpredict 函数中完成预测步骤,计算预测状态和预测协方差;ukfupdate 函数实现更新步骤,结合观测值对状态进行修正。

容积卡尔曼滤波(CKF)

容积卡尔曼滤波基于容积规则来逼近状态和协方差的传递。同样以 Python 伪代码为例:

import numpy as np

# 定义状态转移矩阵
F = np.array([[1, 1], [0, 1]])
# 定义观测矩阵
H = np.array([[1, 0]])

# 状态初始值
x = np.array([[0], [0]])
# 协方差初始值
P = np.eye(2)

# 过程噪声协方差
Q = np.array([[0.01, 0], [0, 0.01]])
# 观测噪声协方差
R = np.array([[0.1]])

def ckf_predict(x, P, F, Q):
    n = x.shape[0]
    c = np.sqrt(n)
    Xsig = np.zeros((n, 2 * n))
    Xsig[:, :n] = x + c * np.linalg.cholesky(P).T
    Xsig[:, n:] = x - c * np.linalg.cholesky(P).T

    # 预测步骤
    Xsig_p = np.dot(F, Xsig)
    x = np.mean(Xsig_p, axis = 1, keepdims = True)
    P = np.dot((Xsig_p - x), (Xsig_p - x).T) / (2 * n) + Q
    return x, P

def ckf_update(x, P, H, R, z):
    n = x.shape[0]
    c = np.sqrt(n)
    Xsig = np.zeros((n, 2 * n))
    Xsig[:, :n] = x + c * np.linalg.cholesky(P).T
    Xsig[:, n:] = x - c * np.linalg.cholesky(P).T

    # 更新步骤
    Zsig = np.dot(H, Xsig)
    z_pred = np.mean(Zsig, axis = 1, keepdims = True)
    Pzz = np.dot((Zsig - z_pred), (Zsig - z_pred).T) / (2 * n) + R
    Pxz = np.dot((Xsig - x), (Zsig - z_pred).T) / (2 * n)
    K = np.dot(Pxz, np.linalg.inv(Pzz))
    x = x + np.dot(K, (z - z_pred))
    P = P - np.dot(np.dot(K, Pzz), K.T)
    return x, P

ckfpredictckfupdate 函数中,通过特定的容积点计算方式,分别完成预测和更新过程。

效果展示

文中提到,容积卡尔曼和无迹卡尔曼均由 S - function 编写,方便比较两种滤波的估计效果。从给出的下图可以看到,当路面附着系数初始状态为 1 和 0 时,两种算法都展现出了较快的收敛速度和较高的估计精度,而且不受初始状态的影响。这意味着无论车辆初始处于何种路面附着系数状态下,这两种滤波算法都能快速准确地估计出实际的路面附着系数,为车辆的稳定控制提供有力支持。

这种基于分布式驱动电动汽车路面附着系数估计的进阶模型,结合无迹卡尔曼滤波和容积卡尔曼滤波的方法,在不同工况下都有着出色的表现,为电动汽车的安全与性能提升奠定了良好的基础。未来,随着技术的不断发展,相信在这一领域还会有更多优秀的成果出现。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐