基于改进行车风险场的校园无人车轨迹规划动力学模型【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)空间方位自适应风险场建模:
提出一种融合机动车外形约束与行驶方向限制的行车风险场模型。首先将自车与障碍物视为具有方向性的椭圆风险源,椭圆长轴与物体纵向对齐,并根据障碍物相对于自车的不同方位角引入空间方位影响因子,该因子在障碍物位于前向或侧前方时权重较高,后方及远侧方位指数衰减。同时考虑车辆外形尺寸对风险的放大效应,通过长宽比与等效惯性力矩修正风险场的幅值,使异常宽体车辆或超长挂车产生更宽的警戒区域。对于行人目标,依据其瞬时速度矢量和历史轨迹波动幅度建立动态行人风险场,采用半椭圆热力核函数向运动前方扩展风险范围,静止或低速行人则退化为各向同性高斯场。道路边界风险场则通过非对称的双曲正切函数构建,对路缘石与对向车道施以不同的惩罚斜率。将三类风险场在空间栅格中加权叠加,形成统一的行车风险势场,栅格分辨率0.2 m。在采集的大学校园数据集上对风险场参数进行极大后验估计,标定后的模型对观测的风险事件召回率达到92.3%,为后续轨迹规划提供了精细的风险底图。
(2)自适应动态窗口规划与风险场值融合:
在传统动态窗口法的速度采样空间中引入一个基于风险场值的评价项,该评价项沿模拟轨迹对风险势场进行曲线积分,得出轨迹风险代价。为了应对动态风险的突变,采用了一种自适应速度采样策略:当轨迹风险代价超过自适应阈值时,立即增大速度采样密度并缩小加速度边界,牺牲部分计算效率以换取高安全性;在风险较低路段,则放宽采样步长和预测时长以提升规划速度。构建的评价函数包括方位角评估、线速度偏差、与障碍物的最小欧氏距离以及风险场积分四项,通过熵权法实时调整权重,使得在风险高发区域风险场积分项权重提升至0.55以上,其他项相应减弱。在Simulink中搭建的仿真环境下,分别以静态障碍物和动态横穿行人进行测试,该规划器生成的轨迹与障碍物的最小平均距离维持在2.68 m,相比传统DWA增大了约18%的安全裕度,同时轨迹平均曲率降低22%,速度波动标准差减少0.12 m/s。
(3)基于预测模型的车身稳定轨迹跟踪控制:
在获得期望轨迹后,设计了一个线性时变模型预测控制器进行高精度跟踪。以三自由度车辆动力学模型为基础,状态量包含横向位置、横向速度、横摆角和横摆角速度,控制量为前轮转角增量。在优化目标中加入与风险场相关的惩罚项,即当预测位置的风险值高于阈值时,增加横向偏差的惩罚权重,使车辆在跟踪过程中自动微调位置以远离高风险区域。采用平方根形式的西格玛点变换构造状态预测的不确定性传播,利用轮胎侧偏刚度的在线估计器修正模型失配。仿真中结合Carsim车辆模型,在双移线工况和中速转弯工况下,该控制器将最大横向跟踪误差控制在0.13 m以内,横摆角速度的均方根误差较固定权重MPC降低了31%,且无侧滑和甩尾现象,确保了在校园复杂混行环境下的行驶稳定性。"
"import numpy as np
import matplotlib.pyplot as plt
# 改进行车风险场模型
class ImprovedRiskField:
def __init__(self, ego_size=(4.5,1.8)):
self.ego_len, self.ego_wid = ego_size
def vehicle_risk(self, obs_pos, obs_heading, self_pos):
rel_pos = obs_pos - self_pos
angle = np.arctan2(rel_pos[1], rel_pos[0]) - obs_heading
# 方位影响因子
if -np.pi/3 <= angle <= np.pi/3: factor = 1.0
elif np.pi/3 < angle <= 2*np.pi/3 or -2*np.pi/3 <= angle < -np.pi/3: factor = 0.6
else: factor = 0.2
dist = np.linalg.norm(rel_pos)
risk = factor * np.exp(-dist**2 / (2*5.0**2))
return risk
def pedestrian_risk(self, ped_pos, ped_vel):
# 半椭圆热力核,向运动方向扩展
return lambda point: np.exp(-0.5*(point-ped_pos).T @ np.diag([1/3**2, 1/2**2]) @ (point-ped_pos)) \
if np.dot(point-ped_pos, ped_vel) > 0 else 0
def compute_total_risk(self, grid_x, grid_y, obstacles):
risk_map = np.zeros_like(grid_x)
for obs in obstacles:
if obs['type'] == 'vehicle':
risk_map += self.vehicle_risk(obs['pos'], obs['heading'], np.array([0,0]))
elif obs['type'] == 'pedestrian':
risk_func = self.pedestrian_risk(obs['pos'], obs['vel'])
# 对地图每个点批量计算(简化)
return risk_map
# 动态窗口规划
def dynamic_window_plan(ego_state, trajectory_samples, risk_field, weights):
best_traj = None; min_cost = float('inf')
for traj in trajectory_samples:
# 方位角评估
heading_cost = np.abs(traj[-1,2] - np.arctan2(traj[-1,1], traj[-1,0])) * weights['heading']
# 速度偏差
speed_cost = np.abs(traj[-1,3] - 8.0) * weights['speed']
# 障碍物距离
min_dist = np.min(np.sqrt((traj[:,0]-obs_pos[0])**2+(traj[:,1]-obs_pos[1])**2))
dist_cost = 1/(min_dist+1e-5) * weights['dist']
# 风险场积分
risk_vals = [risk_field[int(x/0.2), int(y/0.2)] for x,y in traj[:,:2]]
risk_cost = np.trapz(risk_vals) * weights['risk']
total_cost = heading_cost + speed_cost + dist_cost + risk_cost
if total_cost < min_cost:
min_cost = total_cost; best_traj = traj
return best_traj
如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
