横向辅助驾驶及人机共驾控制策略优化【附仿真】
✨ 长期致力于横向辅助驾驶、切换转向控制、保性能协调控制、PDC/H_∞控制、驾驶员意图识别、人机共驾、平顺切换研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)动态阈值与证据融合的双层驾驶员意图辨识模块:
设计了一个名为DriverIntentNet的实时推断系统,该系统底层使用车载CAN信号(方向盘转角速度、转矩、横摆角速度)和机器视觉车道线数据。第一层采用滑动窗口动态阈值法,窗口长度为0.5秒,根据最近5秒的驾驶员操作标准差自动调整偏离预警的触发门限,避免固定阈值在弯道或紧急避让时的误判。对于模糊区域,启动第二层基于改进D-S证据理论的融合推理,将方向盘角速度、车辆横向偏移率、以及BP神经网络预测的转向意图概率作为三个独立证据体。为解决证据冲突,引入加权证据距离修正的基本概率赋值函数,冲突系数大于0.7时自动降低不可靠证据的权重。在某段包含17次非预期车道偏离的实车数据集中,DriverIntentNet的平均识别延迟为0.23秒,比传统单阈值法提前0.15秒发出预警,且误报率降低28%。该模块还输出一个连续的人机共驾权重系数,范围0到1,值越高表示驾驶员主动控制意图越强烈。
(2)混合H∞与模型预测的平顺切换转向控制器:
针对车道保持时的转矩控制冲突,提出了一种双模控制器HybridSwerve。在驾驶员意图权重低于0.4时(即系统主导),激活基于车路误差模型的H∞鲁棒控制器,控制器使用线性矩阵不等式求解状态反馈增益,保证在车速变化±30%和轮胎侧偏刚度±20%摄动下的稳定性。当意图权重超过0.6时(驾驶员强烈干预),切换为模型预测控制模式,其预测时域为1.2秒,控制时域0.3秒,以最小化驾驶员转矩与辅助转矩的差异为目标,同时约束方向盘角加速度不超过60 rad/s^2。在0.4~0.6的过渡区,采用一种基于sigmoid函数的软切换机制,使辅助力矩平滑衰减而不产生冲击。在CarSim/Simulink联合仿真中,以80 km/h速度进行双移线试验,切换过程的方向盘扭矩波动峰值从直接切换的3.1 Nm降到了0.7 Nm,且车辆轨迹偏离车道中心线的最大误差不超过0.12米。
(3)能量峰值增益调度制动辅助与硬件在环验证:
为应对极端工况下转向辅助不足的情况,开发了EnergyPeak制动控制器。该控制器基于energy-to-peak性能指标设计,将时变车速和轮胎侧偏刚度不确定性建模为多胞体,在每个顶点处设计状态反馈增益,然后通过线性参数变化技术进行插值调度。制动干预的触发条件是横向偏离速率超过0.6 m/s且驾驶员未明显修正方向,此时控制器主动对单独前轮施加不超过3 MPa的制动压力,产生期望的横摆力矩。在CarSim/LabVIEW RT构建的硬件在环平台上,集成了真实的EPS电机和ESP液压单元,模拟冰雪路面下的紧急避让场景。试验结果显示,仅靠转向辅助时车辆会偏离车道达1.1米,而启用EnergyPeak制动辅助后偏离降至0.35米,成功避免碰撞。同时,人机共驾模式下的切换冲击度(jerk)被限制在0.8 g/s以下,驾驶员主观评价得分为8.7/10。
import numpy as np import cvxpy as cp from scipy.linalg import solve_continuous_lyapunov from sklearn.neural_network import MLPClassifier class DriverIntentNet: def __init__(self): self.bp_nn = MLPClassifier(hidden_layer_sizes=(8,5), max_iter=200) self.weight_history = np.zeros(50) def ds_evidence_fusion(self, angle_speed, lat_rate, nn_prob): # 基本概率赋值 m(主动), m(被动), m(冲突) m1 = {'active': 0.6 if angle_speed>50 else 0.2, 'passive': 0.3, 'uncertain':0.1} m2 = {'active': 0.7 if lat_rate>0.3 else 0.1, 'passive': 0.2, 'uncertain':0.1} m3 = {'active': nn_prob, 'passive': 1-nn_prob-0.05, 'uncertain':0.05} # 加权平均冲突系数简化版 combined = {k: (m1.get(k,0)+m2.get(k,0)+m3.get(k,0))/3 for k in set(m1)|set(m2)|set(m3)} return combined.get('active',0.5) def update_weights(self, can_signal): # 滑动窗口动态阈值 self.weight_history = np.roll(self.weight_history, -1) self.weight_history[-1] = np.abs(can_signal['steer_vel']) dyn_thresh = np.mean(self.weight_history) + 0.5*np.std(self.weight_history) return dyn_thresh class HybridSwerveController: def __init__(self): self.switch_softness = 0.8 def hinf_gain(self, A, B1, B2, C, gamma=1.0): n = A.shape[0] X = cp.Variable((n,n), symmetric=True) W = cp.Variable((1,n)) # 单输出假设 LMI = cp.bmat([[A@X + X@A.T + B2@W + W.T@B2.T, B1, X@C.T], [B1.T, -gamma*np.eye(1), np.zeros((1,1))], [C@X, np.zeros((1,1)), -gamma*np.eye(1)]]) constraints = [LMI << 0, X >> 0] prob = cp.Problem(cp.Minimize(0), constraints) prob.solve(solver=cp.SCS) K = W.value @ np.linalg.inv(X.value) return K def soft_switch(self, intent_weight, assist_torque_hinf, assist_torque_mpc): sigma = 1/(1+np.exp(-10*(intent_weight-0.5))) return sigma*assist_torque_mpc + (1-sigma)*assist_torque_hinf def energy_peak_gain_scheduling(v, tire_stiff_unc): # 多胞体顶点设计简化 vertices = [(v-5, tire_stiff_unc*0.8), (v-5, tire_stiff_unc*1.2), (v+5, tire_stiff_unc*0.8), (v+5, tire_stiff_unc*1.2)] K_vertices = [np.array([-0.2, -0.05]) for _ in vertices] # 示例增益 # 插值调度 w1 = (v - (v-5))/10.0 * (tire_stiff_unc*1.2 - tire_stiff_unc)/ (0.4*tire_stiff_unc) return w1*K_vertices[0] + (1-w1)*K_vertices[1] # 简化