目录
最终效果:
prescan工程文件.pex和matlab文件.cs在本文末
------------------------全文3767字35图一步一步完成大约耗时2h------------------------
一、设计任务
场景:
一条300米的直路,串联起两个相隔100米的十字路口,两个十字路口都有面向水平左侧的红绿灯,初始情况下都是红灯信号。主车停于左侧第一个十字路口红绿灯前,红绿灯信号变为绿灯(两个红绿灯同时变绿)时,主车启动(踩油门50)。主车启动后,并不受第二个红绿灯信号的影响,一直往前开。
任务:
希望通过仿真测试获取右侧十字路口红绿灯的绿灯信号时长是多少秒时才能保证主车能够顺利通过第二个十字路口。使用Prescan API的方式通过设置不同的参数值来测试大致合理的信号时长。要求将每次运行的截图留存(主车上安装摄像头进行拍摄),并且每次要记录绿灯时长,以及是否闯黄灯或红灯。
二、设计报告
2.1 场景搭建
一条300米的直路,串联起两个相隔100米的十字路口,两个十字路口都有面向水平左侧的红绿灯
接下来我们绘制一条300米的道路,并且直道两侧各有一个十字路口
在十字路口添加红绿灯并且红绿灯的lights打开:
另外一个路口同理添加红绿灯,并且为了后续的实验效果,添加一些建筑物作为行车参考:
最后场景绘制如所示
2.2 车辆设置
主车停于左侧第一个十字路口红绿灯前,绘制轨迹并且添加一辆奥迪车
给车辆添加一个摄像头:
并且将Output Simulink image打开
2.3 matlab红绿灯搭建
打开matlab对红绿灯进行设置:
点击红绿灯添加function函数,编辑函数,从外部引入红绿灯时间,输出控制红绿灯的亮灭:
function [red, org, gre] = light(clock, green_time, yellow_time, red_time)
red = [255,0,0];
org = [255,128,0];
gre = [0,255,0];
circle_time = green_time + yellow_time + red_time; % 一个红绿灯的周期时间
time = mod(clock,circle_time);
% 红灯时间
if time < red_time
red = [255,0,0];
org = [0,0,0];
gre = [0,0,0];
% 绿灯时间
elseif time < red_time + green_time
red = [0,0,0];
org = [0,0,0];
gre = [0,255,0];
% 黄灯时间
else
red = [0,0,0];
org = [255,128,0];
gre = [0,0,0];
end
end
在matlab工作空间创建一个脚本test_1.m(目的是定义红绿灯仿真的时间值):
% 测试给红绿灯设置多少时间才能使车辆正常通过
green_time = 20 ; % 绿灯20秒
yellow_time = 3 ; % 黄灯3秒
red_time = 20 ; % 红灯20秒
然后运行test_1脚本,继续从输入端引入一个const常数模块:
并且将值设置为test_1.m脚本中定义的红绿灯时间变量,这样即可完成从外部定义红绿灯时间变量来控制红绿灯的亮灭。
点击运行测试:
可以看到红绿灯引入正确~~~
将仿真时间设置为1/20:
并且连线:
点击运行仿真
可以看到结果正确(初始是红灯,然后红绿灯会按照:红-绿-黄-红,正确的顺序进行显示):
同理对第二个红绿灯也进行相同的设置:
可以看到第二个红绿灯设置成功:
2.4 红绿灯信号与油门控制
需求:红绿灯信号变为绿灯(两个红绿灯同时变绿)时,主车启动(踩油门50)。主车启动后,并不受第二个红绿灯信号的影响,一直往前开。
首先将车辆的动力学模型改为2D Simple:
重新build后进入matlab进行设置
2.4.1 红绿灯信号
然后需要将红绿灯的绿灯信号引出,做一个判断
在第一个红绿灯的green输出引出一个信号,接入bus selecter模块,选择color里面的G参数,即绿灯颜色参数
然后接入switch模块进行判断:
将阈值改为绿灯>=254,这样当红绿灯的绿灯G>=254时,给出一个常数1的信号代表绿灯亮
然后在switch后面接入一个go to模块,命名为cat_throttle信号
并且设置为全局信号值,随后进行仿真运行:
可以看到第一个红绿灯为绿灯时,给出一个常数1的信号,代表踩油门~~
2.4.2 绿灯踩油门设置
在奥迪车辆进行设置:
加入from模块,引入前面的红绿灯car_throttle值
然后进行判断,点击运行仿真可以看到车辆在第一个十字路口时
红灯停:
绿灯行:
然后引入一个判断逻辑:
当车辆的x距离超过17米(即通过第一个十字路口红绿灯后)车辆会一直踩油门;
当车辆的x距离小于17米(即没有通过第一个红绿灯时)车辆会受到红绿灯的控制,红灯刹车,绿灯踩油门。
2.5 仿真测试
希望通过仿真测试获取右侧十字路口红绿灯的绿灯信号时长是多少秒时才能保证主车能够顺利通过第二个十字路口。使用Prescan API的方式通过设置不同的参数值来测试大致合理的信号时长。要求将每次运行的截图留存(主车上安装摄像头进行拍摄),并且每次要记录绿灯时长,以及是否闯黄灯或红灯。
在matlab工作空间创建脚本test_1.m,并且使用Prescan API的方式通过设置不同的参数值来测试大致合理的信号时长:
test_1.m文件
% 测试给红绿灯设置多少时间才能使车辆正常通过
green_time = 9; % 绿灯初始时间
yellow_time = 3 ; % 黄灯时间
red_time = 10 ; % 红灯时间
% 基础设置
prescan.experiment.convertPexToDataModels;
pbFileName=prescan.experiment.getDefaultFilename;
experiment=prescan.api.experiment.loadExperimentFromFile(pbFileName);
experiment.scheduler.simulationSpeed = 1;
viewer=prescan.api.viewer.createViewer(experiment);
viewer.assignFreeCamera();
viewer.windowSettings.alwaysOnTop = true;
% 运行仿真:
for i = 1:10
green_time = green_time + i;
experiment.saveToFile(pbFileName);
prescan.api.simulink.run(experiment,'Stoptime','30');
end
测试效果
这里测试了10组数据,绿灯从10秒—20秒,结果显示绿灯时长10—11秒时会闯红灯,绿灯时长12秒时会闯黄灯,绿灯时长13—20秒时正常通信。
绿灯时长10秒(闯红灯)
绿灯时长11秒(闯红灯)
绿灯时长12秒(闯黄灯)
绿灯时长13秒(绿灯正常通行)
绿灯时长14秒(绿灯正常通行)
绿灯时长15秒以后绿灯正常通行,不在此测试赘述。
三、总结分析
在实验中遇到这样的问题:要实现主车启动后,并不受第二个红绿灯信号的影响,一直往前开。
这里我设计了一个判断模块,对踩油门模块接入车辆行驶距离判断:
当车辆的x距离超过17米(即通过第一个十字路口红绿灯后)车辆会一直踩油门;
当车辆的x距离小于17米(即没有通过第一个红绿灯时)车辆会受到红绿灯的控制,红灯刹车,绿灯踩油门。
这样就确保了车辆在行驶通过第一个红绿灯后,不会受到第一个红绿灯信号控制的影响。
最后,通过实验发现车辆通过两个红绿灯的间隔时间会受到踩油门的大小与道路的长度以及其他因素影响,之后可以在matlab工作空间创建的脚本test_1.m,并且使用Prescan API的方式通过设置不同的参数值来测试大致合理的信号时长,以及修改油门量和道路长度再进行后续的仿真实验测试。
——————————————————————
⭐prescan工程文件.pex和matlab仿真文件.cs⭐
【金山文档 | WPS云文档】 基于Prescan + Matlabsimulink的红绿灯间隔时间测试仿真
https://kdocs.cn/l/cgknacIVBxD5
----------------------------------------------------------------------------------------------------
相信读到这里的朋友,一定是坚持且优秀的
给博主一个免费的赞👍吧
扫描二维码进博主交流群,问题交流 | 吹吹水 | 一起变得更加优秀
————————————————
2025.4.11
两江重大卓工院