让无人车像专业赛车手一样思考与行动
NPU-IUS 算法 是一种基于 激光雷达(Lidar) 数据的实时路径规划与避障控制算法。
它就像是无人车的“大脑”:
想象你在一个拥挤的商场里飞奔:
这,就是 NPU-IUS 在做的事情!
graph TD A[获取雷达扫描数据] --> B[数据清洗: 去噪声/补零] B --> C[分割扫描数据: 左/右/前] C --> D[识别离散点: 定位障碍物边界] D --> E[间隙搜索: 寻找可通行通道] E --> F[决策: Overtake / Follow / Normal] F --> G[控制输出: PD 计算转向 + 动态限速]
middle_line_callback
这是整个算法的“中枢神经”。
fill_zeros_with_neighbors
雷达有时会因为反射或角度问题返回 0。
0
def fill_zeros_with_neighbors(data): # 如果当前点是 0,取它左侧或右侧的最近邻居 # 就像你眯起眼看不清时,参考一下旁边的画面
目的:防止算法误以为前方有一个“无限远”的洞而冲过去。
filter_anomalous_values
去掉雷达数据中的“毛刺”。
为什么要滤除? 如果不滤除,无人车会因为一个微小的噪点而突然转向,导致“蛇形走位”。
# 核心逻辑: if 当前点与两边差异巨大: 用两边的平均值替换它
通过计算前后两点雷达距离的变化率来确定障碍物的边缘。
# 核心代码段 if dis_obs_90[i] - dis_obs_90[i+1] > THRESHOLD_obs: Left_obs_orig.append(i+1) # 发现障碍物入口 elif dis_obs_90[i+1] - dis_obs_90[i] > THRESHOLD_obs: Left_obs_orig.append(i) # 发现障碍物出口
无人车是有宽度的。
delta = min((end - start)/2 * (4 - middle_dist), 10)
在过滤完所有障碍物后,剩下的“白色区域”就是可通行的间隙。
max_dis_index
5 * abs(dist_left - dist_right)
算法不仅能避开墙壁,还能识别前方的动态对手。
if abs(avg_obs_inten - avg_scene_inten) > 5
根据间隙大小和障碍物性质,做出以下选择:
MIN_OBS_SPEED
使用 PD 控制器 计算最终的 steering_angle。
steering_angle
转向角度=P⋅误差+D⋅误差变化转向角度 = P \cdot 误差 + D \cdot \text{误差变化} 转向角度=P⋅误差+D⋅误差变化
# 速度计算核心公式 speed = 2.4 * (0.3 * math.exp(-np.clip(abs(angle), 0, 0.5)) + 0.7)
+0.7
speed_rate
当目标方向在 75∘75^\circ75∘ 到 105∘105^\circ105∘ 之间时进入“直道模式”。
mean_straight
当雷达视野中完全找不到可行区域时(max_dir_num == 0):
max_dir_num == 0
speed_rate *= 0.9
turn_rate
P
MAX_SPEED_RATE
有问题请查阅: