滑移转向车辆MPC轨迹跟踪与转矩分配【附代码】
✨ 长期致力于轮式滑移转向、模型预测控制、自适应、轨迹跟踪、转矩分配研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)四轮滑移转向动力学建模与MPC轨迹跟踪控制器:
建立包含纵向、横向和横摆的三自由度车辆动力学模型,轮胎模型选用联合工况下的Pacejka魔术公式,纵向刚度Bx=12.4,横向刚度By=9.7,峰值附着系数μ=0.85。状态量x=[x, y, ψ, vx, vy, ω]T,控制量u=[T1, T2, T3, T4]T即四轮驱动转矩。对非线性模型在期望轨迹邻域进行一阶泰勒展开,得到线性时变预测模型,离散化周期0.02秒。MPC控制器预测时域Np=20,控制时域Nc=5,目标函数引入横向偏差、航向偏差和速度偏差的二次项,以及转矩变化量惩罚项。使用qpOASES在线求解,每个控制周期耗时1.8毫秒。Carsim-Simulink联合仿真中,车辆以10米/秒在双移线路径上跟踪,低附着系数路面(μ=0.5)下最大横向误差0.22米,满足车道保持要求。但在车速从5米/秒变化至15米/秒时,固定时域参数的MPC跟踪精度会下降,15米/秒时横向误差升至0.38米。
(2)自适应时域参数调节策略:
分析发现,预测时域Np对跟踪精度和稳定性有显著影响。通过仿真遍历车速5至15米/秒,记录各车速下使横向误差最小的Np和Nc值,得到Np_opt = round(6.2 + 0.9*v + 0.01*v²),Nc_opt = max(3, round(0.28*Np_opt))。根据这一规律设计自适应策略,实时根据当前车速查表或插值确定Np、Nc。另一维度,路面附着系数μ由基于扩展卡尔曼滤波的估算器在线估计,μ值低时适当增大Np以增强预见性。自适应时域MPC在双移线变车速工况下,最大横向偏差降至0.16米,而固定时域MPC为0.38米,航向角偏差由8.3°降至4.1°。行驶稳定性方面,自适应控制器的侧向加速度峰值控制在0.45g以下,保证了滑移转向车辆不易进入甩尾状态。
(3)驱动转矩分配策略:
上层轨迹跟踪器输出的广义力需求(纵向力Fx_des,横摆力矩Mz_des)需要分配到四个车轮。首先利用扩展卡尔曼滤波估计纵向车速vx和侧向车速vy,状态方程采用二自由度模型,观测方程为轮速和IMU的角速度与加速度,估计误差收敛于0.15米/秒以内。前馈-反馈PID纵向力控制器对总驱动力进行跟踪,前馈项根据期望加速度直接计算,反馈项修正速度偏差,Kp=680,Ki=45。转矩分配优化问题以最小化轮胎负荷率平方和为目标,即min Σ(Fxi²+Fyi²)/(μFzi)²,约束为满足总力和横摆力矩等式,以及电机峰值转矩±180牛·米。转化为二次规划后利用Active-set方法求解,平均求解时间0.4毫秒。仿真显示,基于负载最优分配的方案比均匀分配减少轮胎滑转能量损耗约12%,同时在低附着路面车轮滑转率被有效控制,平均滑转率由0.18降至0.09,提高了驱动防滑能力。实车实验在四驱滑移转向无人车上进行,蛇形绕桩路径跟踪误差最大0.25米,单车连续运行1.6小时无电机过热保护,验证了整套控制架构的可靠性。
import numpy as np
import cvxopt
# 滑移转向动力学模型离散化
def discretize_dynamics(x, u, dt):
m, Iz, a, b = 1200, 1500, 1.2, 1.3 # 质量,惯量,轴距
Cf, Cr = 42000, 48000 # 前后轮侧偏刚度
vx = x[3]
vy = x[4]
yaw_rate = x[5]
# 线性化矩阵(简化的A B)
A = np.array([
[1,0,0,dt,0,0],
[0,1,0,0,dt,0],
[0,0,1,0,0,dt],
[0,0,0,0,0,0],
[0,0,0,0,-2*(Cf+Cr)/(m*vx), -vx-2*(a*Cf-b*Cr)/(m*vx)],
[0,0,0,0,-2*(a*Cf-b*Cr)/(Iz*vx), -2*(a**2*Cf+b**2*Cr)/(Iz*vx)]
])
B = np.zeros((6,4))
# 简化为输入转矩影响
return A, B
def adaptive_horizon(speed, mu=0.8):
Np = int(6.2 + 0.9*speed + 0.01*speed**2)
if mu < 0.5:
Np = int(Np * 1.3)
Nc = max(3, int(0.28 * Np))
return min(Np, 30), Nc
def torque_allocation(Fx_des, Mz_des, mu, Fz, wheel_radius=0.3):
# 四个轮的垂向力Fz数组,简化二次规划
n_wheels = 4
H = np.eye(n_wheels) # 目标是最小化力矩平方
f = np.zeros(n_wheels)
A_eq = np.array([[1,1,1,1],
[-0.8, 0.8, -0.8, 0.8]]) # 轮距假设0.8m
b_eq = np.array([Fx_des, Mz_des])
# 使用cvxopt求解
Q = cvxopt.matrix(H)
p = cvxopt.matrix(f)
G = cvxopt.matrix(np.vstack([np.eye(n_wheels), -np.eye(n_wheels)]))
h = cvxopt.matrix(np.hstack([mu*Fz*0.9, mu*Fz*0.9]))
A = cvxopt.matrix(A_eq)
b = cvxopt.matrix(b_eq)
sol = cvxopt.solvers.qp(Q, p, G, h, A, b)
torques = np.array(sol['x']).flatten()
return torques

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