基于卡尔曼滤波的MPC汽车控制器研究(Python代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Python代码实现


💥1 概述

基于卡尔曼滤波的MPC汽车控制器是一种在汽车控制中应用卡尔曼滤波和模型预测控制(MPC)的方法。卡尔曼滤波是一种适用于线性动态系统的滤波算法,它可以通过对系统状态进行递推和更新,结合测量数据和模型预测,提供对系统状态的估计。而MPC是一种基于模型的控制策略,它通过优化问题求解,结合系统模型和控制目标,预测未来一段时间内的系统响应,并生成最优控制指令。

将卡尔曼滤波与MPC结合应用于汽车控制,可以提高控制器对环境变化和测量噪声的鲁棒性。具体来说,卡尔曼滤波可以用于估计汽车的状态,例如位置、速度和姿态等,提供更准确的状态信息给MPC控制器。MPC控制器则可以根据估计的状态信息和控制目标,动态调整控制指令,实现对汽车的精确控制。

这种基于卡尔曼滤波的MPC汽车控制器在自动驾驶、车辆稳定性控制和路径跟踪等方面有着广泛的应用。通过融合滤波和优化控制的方法,可以提高汽车的行驶性能、安全性和舒适性。然而,该方法的具体研究和实施可能因具体应用场景和需求而有所不同,需要进一步的研究和开发。

📚2 运行结果

直接去掉外框,后续结果图都一律去掉外框。

 

部分代码:

# SIMULATOR DISPLAY

    # Total Figure
    fig = plt.figure(figsize=(FIG_SIZE[0], FIG_SIZE[1]))
    gs = gridspec.GridSpec(14,8)

    # Elevator plot settings.
    ax = fig.add_subplot(gs[:, :3])

    plt.xlim(0, 8)
    ax.set_ylim([0, 31])
    plt.xticks([])
    #plt.yticks(np.arange(0,31,3))
    plt.title('Kalman 1D')

    # Time display.
    time_text = ax.text(6, 0.5, '', fontsize=15)

    # Main plot info.
    car_l, car_r = ax.plot([], [], 'k-', [], [], 'k-')
    car_t, car_b = ax.plot([], [], 'k-', [], [], 'k-')

    # V Estimate plot.
    ax2     = fig.add_subplot(gs[0:4, 4:])
    __,     = ax2.plot(est_data_t, v_est_data, '-b')
    v_est,  = ax2.plot([], [], '-r')
    v_real, = ax2.plot(v_real_data_x, v_real_data_y, 'k--')
    plt.title('V Estimate')
    # plt.xticks([])
    # plt.xticks([0, v_real_data_x[-1]])
    plt.xlim(0, v_real_data_x[-1])

    # ax2.set_xticks([0, est_data_t[-1]])
    # ax2.set_xlim(0, est_data_t[-1])
    # ax2.set_ylim([0,4])
    # ax2.set_yticks([0,2,4])

    # X Estimate plot.
    ax3 = fig.add_subplot(gs[5:9, 4:])
    ___, = ax3.plot(est_data_t, x_est_data, '-b')
    x_est, = ax3.plot([], [], '-r')
    plt.title('X Estimate Error')
    # plt.xticks([])
    # plt.xticks([0, v_real_data_x[-1]])
    plt.xlim(0, v_real_data_x[-1])

    # ax3.set_xticks([0, est_data_t[-1]])
    # ax3.set_xlim(0, est_data_t[-1])
    # ax3.set_ylim(-4,4)
    # ax3.set_yticks([-4,0,4])

    # real X vs measure vs X estimate
    ax4         = fig.add_subplot(gs[10:14, 4:])
    ___,        = ax4.plot(t, state, '-g')                      # real X
    __,         = ax4.plot(est_data_t, X_measured, '-b')        # measure X
    ____,       = ax4.plot(est_data_t, X_estimated, '-c')        # estimated X

    plt.title('real X vs X estimate')
    plt.xlim(0, est_data_t[-1])
    plt.legend(['real X', 'measure X', 'estimated X'])
    # ax4.set_ylim(-4,4)

    def update_plot(num):
        t_loc = int(t[num])
        if state[num] > 18:
            ax.set_ylim([0+state[num]-18, 31+state[num]-18])
            time_text.set_position([6,state[num]-18+0.5])

        # Car.
        car_l.set_data([2, 2],[state[num], state[num]+10])
        car_r.set_data([6, 6],[state[num], state[num]+10])
        car_t.set_data([2, 6],[state[num]+10, state[num]+10])
        car_b.set_data([2, 6],[state[num], state[num]])

        # if int(t[num]) < 20:
        #     ax2.set_xlim([0,est_data_t[t_loc+1]])
        #     ax3.set_xlim([0,est_data_t[t_loc+1]])
        # else:
        #     ax2.set_xlim([est_data_t[t_loc-20],est_data_t[t_loc+1]])
        #     ax3.set_xlim([est_data_t[t_loc-20],est_data_t[t_loc+1]])

        v_est.set_data(est_data_t[:t_loc], v_est_data[:t_loc])
        x_est.set_data(est_data_t[:t_loc], x_est_data[:t_loc])

        # Timer.
        time_text.set_text(str(np.round(t[num], 1)) + 's')

        return car_l, car_r, car_t, car_b, time_text


    print("Compute Time: ", round(time.perf_counter() - start, 3), "seconds.")
    # Animation.
    car_ani = animation.FuncAnimation(fig, update_plot, frames=range(1,len(t)), interval=100, repeat=False, blit=False)
    #car_ani.save('lines.mp4')

    plt.show()
# SIMULATOR DISPLAY

# Total Figure
fig = plt.figure(figsize=(FIG_SIZE[0], FIG_SIZE[1]))
gs = gridspec.GridSpec(14,8)

# Elevator plot settings.
ax = fig.add_subplot(gs[:, :3])

plt.xlim(0, 8)
ax.set_ylim([0, 31])
plt.xticks([])
#plt.yticks(np.arange(0,31,3))
plt.title('Kalman 1D')

# Time display.
time_text = ax.text(6, 0.5, '', fontsize=15)

# Main plot info.
car_l, car_r = ax.plot([], [], 'k-', [], [], 'k-')
car_t, car_b = ax.plot([], [], 'k-', [], [], 'k-')

# V Estimate plot.
ax2     = fig.add_subplot(gs[0:4, 4:])
__,     = ax2.plot(est_data_t, v_est_data, '-b')
v_est,  = ax2.plot([], [], '-r')
v_real, = ax2.plot(v_real_data_x, v_real_data_y, 'k--')
plt.title('V Estimate')
# plt.xticks([])
# plt.xticks([0, v_real_data_x[-1]])
plt.xlim(0, v_real_data_x[-1])

# ax2.set_xticks([0, est_data_t[-1]])
# ax2.set_xlim(0, est_data_t[-1])
# ax2.set_ylim([0,4])
# ax2.set_yticks([0,2,4])

# X Estimate plot.
ax3 = fig.add_subplot(gs[5:9, 4:])
___, = ax3.plot(est_data_t, x_est_data, '-b')
x_est, = ax3.plot([], [], '-r')
plt.title('X Estimate Error')
# plt.xticks([])
# plt.xticks([0, v_real_data_x[-1]])
plt.xlim(0, v_real_data_x[-1])

# ax3.set_xticks([0, est_data_t[-1]])
# ax3.set_xlim(0, est_data_t[-1])
# ax3.set_ylim(-4,4)
# ax3.set_yticks([-4,0,4])

# real X vs measure vs X estimate
ax4         = fig.add_subplot(gs[10:14, 4:])
___,        = ax4.plot(t, state, '-g')                      # real X
__,         = ax4.plot(est_data_t, X_measured, '-b')        # measure X
____,       = ax4.plot(est_data_t, X_estimated, '-c')        # estimated X

plt.title('real X vs X estimate')
plt.xlim(0, est_data_t[-1])
plt.legend(['real X', 'measure X', 'estimated X'])
# ax4.set_ylim(-4,4)

def update_plot(num):
    t_loc = int(t[num])
    if state[num] > 18:
        ax.set_ylim([0+state[num]-18, 31+state[num]-18])
        time_text.set_position([6,state[num]-18+0.5])

    # Car.
    car_l.set_data([2, 2],[state[num], state[num]+10])
    car_r.set_data([6, 6],[state[num], state[num]+10])
    car_t.set_data([2, 6],[state[num]+10, state[num]+10])
    car_b.set_data([2, 6],[state[num], state[num]])

    # if int(t[num]) < 20:
    #     ax2.set_xlim([0,est_data_t[t_loc+1]])
    #     ax3.set_xlim([0,est_data_t[t_loc+1]])
    # else:
    #     ax2.set_xlim([est_data_t[t_loc-20],est_data_t[t_loc+1]])
    #     ax3.set_xlim([est_data_t[t_loc-20],est_data_t[t_loc+1]])

    v_est.set_data(est_data_t[:t_loc], v_est_data[:t_loc])
    x_est.set_data(est_data_t[:t_loc], x_est_data[:t_loc])

    # Timer.
    time_text.set_text(str(np.round(t[num], 1)) + 's')

    return car_l, car_r, car_t, car_b, time_text


print("Compute Time: ", round(time.perf_counter() - start, 3), "seconds.")
# Animation.
car_ani = animation.FuncAnimation(fig, update_plot, frames=range(1,len(t)), interval=100, repeat=False, blit=False)
#car_ani.save('lines.mp4')

plt.show()

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]张明,张衡,陈玉俊.基于MPC的卡尔曼滤波的车用热管理控制策略[J].轻型汽车技术, 2022(005):000.

[2]杨柳曼,万丽琴,江石媛.基于卡尔曼滤波的智能车调速PID控制研究[J].现代信息科技, 2020, 4(7):3.DOI:CNKI:SUN:XDXK.0.2020-07-004.

🌈4 Python代码实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值