本文通过对Python代码的编写,实现对车辆变道时本车及当前车道和目标车道的前后车数据获取,仅介绍大体逻辑与部分重点代码与结果。使用获取的数据可进行换道决策,模型验证等研究。本文使用数据集为HighD数据集。若使用NGSIM数据集可参见本人发表的文章NGSIM数据集Python处理(车辆变道时本车道和目标车道前后车数据提取)_惜君如常的博客-CSDN博客若需使用其他数据集进行数据提取,可与本人联系。
HighD数据集由德国亚琛工业大学汽车工程研究所发布的HighD数据集,是德国高速公路的大型自然车辆轨迹数据,搜集自德国科隆附近的六个不同地点, 位置因车道数量和速度限制而异,记录的数据中包括轿车和卡车。数据集包括来自六个地点的11.5小时测量值和110 000车辆,所测量的车辆总行驶里程为45 000 km,还包括了5600条完整的变道记录。通过使用最先进的计算机视觉算法,定位误差通常小于十厘米。适用于驾驶员模型参数化、自动驾驶、交通模式分析等任务。HighD的数据格式和后续推出的InD,RounD有细微的不同,它的坐标系原点起始于左上方,标注车辆位置用的也是包围盒左上方端点而非中心点。如需数据集可点击链接HighD大型自然车辆轨迹数据集-数据集文档类资源-CSDN文库进行下载。
本文定义的车辆变道点为车道ID改变点,若需获取变道行为起点,可自行添加该部分代码进行计算,不影响后续代码逻辑。
首先遍历各个文件中的各个车辆车道ID差值列表,将差值不为0的,提取索引,利用iloc进行dataframe切片,获取出车在变道点的数据。
for j in enumerate(list(np.diff(lst_laneId))):
if j[1] != 0:
lst_index.append(j[0])
for index in lst_index:
data_c_c = data_c.iloc[index:index+1].copy()
data_c_c_1 = data_c.iloc[index+1:index+2].copy()
data_c_c表示在变道前车道的最后时刻数据,data_c_c_1表示在变道后车道的初始时刻数据。可自行选择将上述两个数据中的哪一个定义为换道点,确定换道点后,提取该时刻时间,通过data_c_c获取变道前前后车ID,通过data_c_c_1获取变道后前后车ID。
获取变道时刻,所有车辆数据,编写函数获取速度、加速度、位置信息,在这里需剔除没有前后车以及数据集中数据存在缺失的情况。函数如下:
def func(ID):
num = 0
if ID != 0:
for i_1 in enumerate(list(data_time['id'])):
if i_1[1] == ID:
num += 1
xVelocity = lst_xVelocity[i_1[0]]
yVelocity = lst_yVelocity[i_1[0]]
xAcceleration = lst_xAcceleration[i_1[0]]
yAcceleration = lst_yAcceleration[i_1[0]]
x = lst_x[i_1[0]]
return [xVelocity,yVelocity,xAcceleration,yAcceleration,x]
if num == 0:
return ['#','#','#','#','#']
else:
return ['#','#','#','#','#']
以变道前前车数据获取为例,代码如下:
before_P_data = func(before_P_ID)
data_c_c['before_P_xVelocity'] = [before_P_data[0]]
data_c_c['before_P_yVelocity'] = [before_P_data[1]]
data_c_c['before_P_xAcceleration'] = [before_P_data[2]]
data_c_c['before_P_yAcceleration'] = [before_P_data[3]]
每一个小数据集生成一个csv文件,命名为数据集+编号。结果示意如下:
#表示车辆数据缺失,或则主车在数据集中对应的前后车ID为0。