想问一下 张二发博主的
idm跟驰模型
如何获取 速度 位移 加速度这三个参数
我想获取大量的应该修改哪几个参数
(纯new guy 不太懂)
一、在获取速度、位移和加速度这三个参数时,需要考虑以下几点:
1、速度可以通过测量车辆在一定时间内所移动的距离来计算,或者通过汽车的转速表或 GPS 获取。
2、位移可以通过测量车辆在道路上的位置来计算。这可以使用 GPS 或者车辆内部的测距仪器来测量。
3、加速度可以通过测量车辆在一定时间内所变化的速度来计算。
二、IDM 模型中有几个主要的参数,这些参数会影响车辆的行为:
期望速度(v0):车辆在道路条件良好时的期望速度。
车辆容量(Q):车辆在道路条件良好时的最大流量。
加速度常数(a):车辆加速或减速时的加速度。
车辆安全距离(s0):车辆在其他车辆前方保持的最小安全距离。
减速度常数(b):车辆在其他车辆前方减速时的减速度。
修改这些参数可以模拟不同的车辆行为,可以通过测量车辆的速度、位移和加速度来收集数据。
仅供参考,望采纳。
望采纳!!点击该回答右侧的“采纳”按钮即可采纳!!
张二发博主的DM(智能驾驶员模型)是一种车辆动态模型,用于模拟车辆在道路上的行
为。DM模型基于车辆驾驶员的行为,描述了车辆的加速、减速和转弯等动态过程。
要获取车辆的速度、位移和加速度等参数,可以使用以下方法:
1.在DM模型中,速度、位移和加速度等参数都是可以直接获取的。在车辆运动过程中,可
以通过测量或估算来获取这些参数。
2.也可以使用传感器、GPS等设备来获取车辆的速度、位移和加速度等参数。这些设备能够
实时测量车辆的运动状态,并将测量结果通过数字信号输出。
3.要获取大量的速度、位移和加速度等参数,可以使用车辆数据记录仪或其他数据采集系
统。这些系统可以实时测量车辆的运动状态,并将测量结果记录到存储介质中。
提供参考实例【单车道车辆减速跟驰仿真】,链接:https://blog.csdn.net/S200142/article/details/124872940
IDM模型的python实现
借鉴下
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 7 17:50:51 2021
@author: erfa_zhang
"""
# -*- coding: UTF-8 -*-
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong']
mpl.rcParams['axes.unicode_minus'] = False
import matplotlib.pyplot as plt
import random
import numpy as np
import xlwt
class Car:
def _init_(self,length,width):
self.length = length #车长
self.width = width #车宽
length = 3
width = 1.6
# 静态参数
S = 2 #静态车间距
T = 1.6 #车头时距
aMax = 0.73 #最大期望加速度
bMax = 1.67 #最大期望减速度
V0 = 33.3 #m/s
par = 0.6
# 更新车间距
def updateD(self):
if self.X > self.front.X:
self.D = self.X - self.front.X + self.front.length - Road.length
else:
self.D = self.X - self.front.X + self.front.length
# 更新速度差
def updatedV(self):
self.dV = self.V - self.front.V
# 更新期望跟驰距离
def updateD_des(self):
self.updatedV()
self.D_des = self.S + self.V*self.T +self.V*self.dV/(2*(self.aMax*self.bMax)**0.5)
# 更新加速度
def updateA(self):
self.updateD()
self.updateD_des()
self.A = self.par*(1-(self.V/self.V0)**4-(self.D_des/self.D)**2)
# 更新速度
def updateV(self):
self.updateA()
self.V = max(self.V + self.A,0)
# 更新位置
def updateX(self):
self.updateV()
self.X = (self.X + self.V)%Road.length
class Road:
def _init_(self,motorPercent,length,width):
self.motorPercent = motorPercent #道路占有率
self.length = length #车道长度
self.width = width #车道宽度
motorPercent = 0.9
length = 1000
width = 3.5
# 车辆加载
def initCars(self):
# 计算车辆数量
self.numOfCar = (int)(self.length/3 * self.motorPercent)
# 生成车辆
self.ls = []
gas = (self.length / self.numOfCar)
for i in range(self.numOfCar):
c = Car()
# 等间距放置车辆
c.X = i*gas
c.Y = 1
c.V = 0
c.index = i
self.ls.append(c)
# 新增车辆为上一辆车的前车
if i>0:
c.back = self.ls[self.ls.index(c)-1]
c.back.front = c
# 设置车辆颜色
c.color = [random.random(),random.random(),random.random()]
#头车的前车是尾车
self.ls[len(self.ls)-1].front = self.ls[0]
self.ls[0].back = self.ls[len(self.ls)-1]
# 画图函数
def draw(self,ax):
# 绘制道路
rect = plt.Rectangle([0,0],self.length,self.width, fill=False,facecolor = [0,0,1])
ax.add_patch(rect)
plt.xlim(0,300)
plt.ylim(-50,50)
# 绘制车辆
for i in range(self.numOfCar):
c = self.ls[i]
rect = plt.Rectangle([c.X,c.Y],c.length,c.width,facecolor=c.color)
ax.add_patch(rect)
# 运行效果展示函数
def show(self,timeMax):
# 初始化道路
self.initCars()
# 创建画布
fig = plt.figure()
ax = fig.add_subplot(111)
# 开始仿真
for time in range(timeMax):
# 车辆位置更新
for c in self.ls:
c.updateX()
# 汇出更新后车辆位置
plt.cla()
self.draw(ax)
plt.pause(0.1)
# 删除画布
plt.close(fig)
# 获取输入道路的平均车速
def get_vMean(r,timeMax):
# 初始化道路
r.initCars()
# 开始仿真
ls = []
vSum = 0
for time in range(timeMax):
# 车辆位置更新
for c in r.ls:
c.updateX()
vSum = vSum + c.V
# 计算当前时间步平均车速
ls.append(vSum / r.numOfCar)
vSum = 0
return sum(ls)/len(ls)
def get_K_V():
V_ls = np.zeros((1,20))
K_ls = np.zeros((1,20))
timeMax = 1000
j = 0
for i in np.arange(0.05,1,0.05):
r = Road()
r.motorPercent = i
V_ls[0,j] = get_vMean(r, timeMax)
K_ls[0,j] = r.numOfCar/r.length*1000
j = j + 1
return (K_ls,V_ls)
def plot_K_V(K_V):
# 输入元组第0个元素为密度,第1个元素为平均速度
ls_K = []
ls_V = []
for i in range(19):
ls_K.append(K_V[0][0,i])
ls_V.append(K_V[1][0,i])
plt.plot(ls_K,ls_V)
plt.title('密度-速度图',fontsize = 35)
plt.xlabel('密度',fontsize = 30)
plt.ylabel('速度',fontsize = 30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
def plot_K_Q(K_V):
# 输入元组第0个元素为密度,第1个元素为平均速度
ls_K = []
ls_Q = []
for i in range(19):
ls_K.append(K_V[0][0,i])
ls_Q.append(K_V[1][0,i]*K_V[0][0,i])
plt.plot(ls_K,ls_Q)
plt.title('密度-流量图',fontsize = 35)
plt.xlabel('密度',fontsize = 30)
plt.ylabel('流量',fontsize = 30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
def plot_V_Q(K_V):
# 输入元组第0个元素为密度,第1个元素为平均速度
ls_V = []
ls_Q = []
for i in range(19):
ls_V.append(K_V[1][0,i])
ls_Q.append(K_V[1][0,i]*K_V[0][0,i])
plt.plot(ls_Q,ls_V)
plt.title('速度-流量图',fontsize = 35)
plt.xlabel('流量',fontsize = 30)
plt.ylabel('速度',fontsize = 30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
def xlsWrite(K_V):
workbook = xlwt.Workbook(encoding= 'ascii')
worksheet = workbook.add_sheet("三参数")
worksheet.write(0,0, "密度")
worksheet.write(0,1, "速度")
worksheet.write(0,2, "流量")
for i in range(20):
worksheet.write(i+1,0,K_V[0][0,i])
worksheet.write(i+1,1,K_V[1][0,i])
worksheet.write(i+1,2,K_V[0][0,i]*K_V[1][0,i])
fname = "C:\OneDrive\文档\文本仓库\课程ppt\学习\交通仿真\IDM_python实现\三参数数据.xls"
workbook.save(fname)
#################### main
# 创建道路
r = Road()
# 展示动画
################### 动画展示
r.motorPercent = 0.3
timeMax = 100
r.show(timeMax)
################### 三参数图
# 获取占有率-速度
#K_V = get_K_V()
# 汇出密度-速度图
#plot_K_V(K_V)
# 汇出密度-流量图
#plot_K_Q(K_V)
# 汇出速度-流量图
################### 导出数据
#plot_V_Q(K_V)
# 写入excel文件
#xlsWrite(K_V)
################### V0变化
# for i in range(1,7):
# Car.V0 = 5*i
# K_V = get_K_V()
# plot_K_Q(K_V)
# #plot_V_Q(K_V)
# #plot_K_V(K_V)
# plt.legend(labels=['5','10','15','20','25','30'],fontsize = 20)
################### S变化
# for i in range(1,6):
# Car.S = i
# K_V = get_K_V()
# #plot_K_Q(K_V)
# #plot_V_Q(K_V)
# plot_K_V(K_V)
# plt.legend(labels=['1','2','3','4','5'],fontsize = 20)
################### par变化
# for i in range(1,6):
# Car.par = i*0.2
# K_V = get_K_V()
# plot_K_Q(K_V)
# #plot_V_Q(K_V)
# #plot_K_V(K_V)
# plt.legend(labels=['0.2','0.4','0.6','0.8','1'],fontsize = 20)