✨ 长期致力于智能车辆、避障轨迹规划、轨迹跟踪控制、约束跟随控制、车辆稳定性研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于五次多项式与安全距离的换道避障轨迹规划:
设计一个双层决策模块,上层根据车载毫米波雷达和摄像头融合的目标信息计算自车与前车的相对距离和相对速度,当距离小于安全阈值(2.2倍制动距离)时触发换道避障指令。下层采用五次多项式拟合换道轨迹,横向位移从初始车道中心线偏移至相邻车道中心线,纵向速度保持恒定或按照前车速度自适应调整。五次多项式系数通过起始点和终止点的位置、速度和加速度边界条件唯一确定,共六个边界条件确保换道过程横向加加速度连续,乘坐舒适。在干沥青路面且车速为80km/h时,换道轨迹总时长设置为3.2秒,最大横向加速度为2.1m/s^2,低于3m/s^2的舒适阈值。仿真中换道过程中与相邻车道后车的最小安全距离保持大于1.5倍车头时距,验证了轨迹的安全性。
(2)约束跟随鲁棒控制器处理系统不确定性:
将车辆横向动力学模型分解为名义部分和不确定部分,名义部分基于二自由度自行车模型,不确定部分包括轮胎侧偏刚度变化、路面附着系数变化以及未建模动态。控制目标为使得实际行驶轨迹与规划轨迹之间的误差渐进收敛到零,将该问题转化为约束跟随问题,即设计控制力矩使得系统的约束变量跟随期望的约束方程。鲁棒控制器输出包含一个标称控制项和一个抗不确定项,抗不确定项使用Lyapunov方法推导,其增益与不确定性的上界相关。通过求解一个代数Riccati不等式获得最坏情况下的控制增益。在Carsim与Simulink联合仿真中,当路面附着系数从0.85突降到0.45时,传统LQR控制的横向跟踪误差最大值达0.31m,而所提出控制器的误差最大值仅0.12m,且车辆横摆角速度响应无振荡。
(3)极限工况下基于分段仿射轮胎模型的稳定性控制器:
针对车辆在高侧向加速度工况下轮胎进入非线性区域的问题,采用分段仿射方法对魔术公式轮胎模型进行线性化近似。将轮胎侧偏角区间划分为三个区域:线性区、过渡区和饱和区,每个区域用一个仿射函数表示。通过前后轴轮胎侧偏角构建相平面,划分稳定区域和非稳定区域。当车辆状态位于稳定域内时,采用约束跟随鲁棒控制器;当状态接近或进入非稳定域时,切换为附加横摆力矩控制器,通过单轮制动产生直接横摆力矩将车辆拉回稳定域。应用微分同胚映射将稳定性区域的不等式约束转化为等式约束,使得控制器可解析求解。高附着力路面上以70km/h进行双移线试验,切换策略使得车辆最大横摆角误差从无控制的8.3度降低到3.1度,侧向位移峰值误差为0.24m,均优于单一模式控制器。
import numpy as np from scipy.linalg import solve_continuous_are class ConstraintFollowingController: def __init__(self, M_nom, C_nom, K_nom, beta=0.5, epsilon=0.1): self.M = M_nom; self.C = C_nom; self.K = K_nom self.beta = beta; self.epsilon = epsilon self.A = np.vstack([np.hstack([np.zeros((2,2)), np.eye(2)]), np.hstack([-np.linalg.inv(M_nom)@K_nom, -np.linalg.inv(M_nom)@C_nom])]) self.B = np.vstack([np.zeros((2,2)), np.linalg.inv(M_nom)]) Q = np.eye(4)*10.0; R = np.eye(2) P = solve_continuous_are(self.A, self.B, Q, R) self.K_lqr = np.linalg.inv(R) @ (self.B.T @ P) def compute_control(self, x, x_des, dx_des, ddx_des, uncertainty_bound): e = x[:2] - x_des; de = x[2:] - dx_des ddqr = ddx_des u_nom = self.M @ ddqr + self.C @ dx_des + self.K @ x_des - self.K_lqr @ np.hstack([e, de]) rho = uncertainty_bound * (np.linalg.norm(x) + 1.0) mu = 0.05 u_robust = - (rho + mu) * (self.B.T @ self.P @ np.hstack([e, de])) / (np.linalg.norm(self.B.T @ self.P @ np.hstack([e, de])) + self.epsilon) return u_nom + u_robust class PiecewiseAffineTire: def __init__(self, alpha_lin=0.03, alpha_sat=0.12, Fz=4000): self.alpha_lin = alpha_lin; self.alpha_sat = alpha_sat; self.Fz = Fz def force(self, alpha): if abs(alpha) <= self.alpha_lin: return 2.3 * self.Fz * alpha elif abs(alpha) <= self.alpha_sat: sign = np.sign(alpha) return sign * ( 2.3*self.Fz*self.alpha_lin + 0.8*self.Fz*(abs(alpha)-self.alpha_lin) ) else: sign = np.sign(alpha) return sign * ( 2.3*self.Fz*self.alpha_lin + 0.8*self.Fz*(self.alpha_sat-self.alpha_lin) + 0.2*self.Fz*(abs(alpha)-self.alpha_sat) ) def lateral_stiffness(self, alpha): if abs(alpha) <= self.alpha_lin: return 2.3 * self.Fz elif abs(alpha) <= self.alpha_sat: return 0.8 * self.Fz else: return 0.2 * self.Fz