资讯动态

商用车换道路径规划和路径跟踪算法设计及验证Frenet坐标系【附代码】

发布时间:2026/9/22 0:03:46 来源:尧图企业网站定制
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流查看文章底部二维码1基于三次样条车道线参考线拟合与五次多项式换道轨迹簇生成在Frenet坐标系下利用车载前视摄像头输出的车道线离散点通过三次样条插值生成平滑的参考线样条节点间距0.5m。为减少拟合误差采用加权最小二乘对靠近车辆的点赋予更高权重。在得到参考线后将自车状态投影到Frenet坐标系得到横向偏移d和纵向弧长s。换道轨迹规划采用五次多项式分别生成横向d(t)和纵向s(t)的运动曲线。横向边界条件起始d0当前偏移dv00da00终点df目标车道中心偏移dvf0daf0换道时长T设为3.0~5.5秒区间内离散采样5个值。纵向边界条件s00, sv0当前速度sa00, sf为自由sdvf和saf保持与期望速度一致。对每组(T, sf)组合生成一条候选轨迹共25条。每条轨迹采用多项式系数解析求解仅需三次矩阵求逆。随后将所有轨迹从Frenet坐标转换回笛卡尔坐标并使用代价函数筛选最优代价由加速度变化率积分、横向加速度最大值和碰撞风险三部分组成。仿真显示在直道90km/h和弯道60km/h换道工况下该方法生成的轨迹光滑且侧向加速度峰值均在1.8m/s²以下符合商用车舒适性要求。2基于多点预瞄驾驶员模型与模型预测路径跟踪控制器设计为验证换道轨迹的可跟踪性设计了一种多点预瞄驾驶员模型同时从控制角度设计了模型预测路径跟踪控制器作为对比。多点预瞄模型在轨迹前方选择5个预瞄点分别计算各点的横向偏差和航向偏差通过加权和生成期望方向盘转角其中权重随着预瞄距离增加而指数衰减近点权重0.5最远点权重0.1。仿真表明该模型在低附着系数下超调较小。MPC控制器则采用线性时变单车模型以横向位置和航向角为状态前轮转角为控制输入预测时域3秒求解器借用OSQP。在TruckSim中比较在80km/h急转工况下MPC最大横向偏差0.18m优于驾驶员模型的0.27m但驾驶员模型结构简单实时性更好。综合考虑最终将驾驶员模型作为前馈MPC作为反馈微调构成了级联控制器横向偏差控制在0.12m以内。3基于某型号牵引车的实车试验与系统集成将规划算法和控制算法部署在英伟达Jetson Xavier计算平台上与某车企提供的数据采集系统和EPS接口对接。通过CAN总线读取轮速、方向盘转角等信号并下发目标转角。实车在某试车场进行了低速25km/h和高速60km/h的换道试验。低速工况下换道时长3.5秒侧向加速度最大值0.9m/s²高速工况下时长5.0秒侧向加速度1.5m/s²均满足企业2m/s²的要求。方向盘转角变化连续无突变未触发ESC。系统延迟测试显示从感知到执行总延迟90ms跟踪横向偏差均方根0.14m。试验全程未发生失稳或超调总监驶里程182km成功换道86次证明了该系统可满足商用车高速换道的初步需求为企业后续量产开发奠定了算法基础。import numpy as np from scipy.interpolate import CubicSpline # 三次样条参考线拟合 def fit_reference_line(waypoints): # waypoints: (x,y) 离散点 s np.linspace(0,1,len(waypoints)) cs_x CubicSpline(s, waypoints[:,0]); cs_y CubicSpline(s, waypoints[:,1]) return cs_x, cs_y # 五次多项式换道轨迹生成 def generate_lane_change_trajectory(T, sf, d0, d_target, v0): # 横向五次多项式边界求解 A_d np.array([[0,0,0,0,0,1], [T**5,T**4,T**3,T**2,T,1], [0,0,0,0,1,0], [5*T**4,4*T**3,3*T**2,2*T,1,0], [0,0,0,2,0,0], [20*T**3,12*T**2,6*T,2,0,0]]) b_d np.array([d0, d_target, 0, 0, 0, 0]) coeff_d np.linalg.solve(A_d, b_d) # 纵向 A_s np.array([[0,0,0,0,0,1], [T**5,T**4,T**3,T**2,T,1], [0,0,0,0,1,0], [5*T**4,4*T**3,3*T**2,2*T,1,0], [0,0,0,2,0,0], [20*T**3,12*T**2,6*T,2,0,0]]) b_s np.array([0, sf, v0, 25, 0, 0]) # 期望末速25m/s coeff_s np.linalg.solve(A_s, b_s) def traj(t): d np.polyval(coeff_d[::-1], t) s np.polyval(coeff_s[::-1], t) return s, d return traj # 代价函数评估 def cost_function(traj, obstacles): jerk_integral 0; max_lat_acc 0 for t in np.linspace(0, T, 50): _, d traj(t) # 省略计算加加速度和加速度 pass collision check_collision(traj, obstacles) return 0.5*jerk_integral 0.3*max_lat_acc 1000*collision # 多点预瞄驾驶员模型 def multi_point_preview_driver(traj, vehicle_state, look_ahead20): weight np.array([0.5,0.25,0.15,0.1,0.05]) # 5点权重 steering_angle 0 for i, dt in enumerate([0.2,0.5,0.8,1.2,1.5]): preview_time dt; s, d traj(preview_time) error vehicle_state.lateral_error(d) steering_angle weight[i] * error * 0.02 return steering_angle如有问题可以直接沟通

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价