报 告 名 称: 双向车辆直线通行单个红绿灯路口
目录
摘要:
使用unity模拟一个简单十字路口,实现红绿灯的切换,控制其中一辆小车的运行。在3个坐标随机生成直线运行的小车,遇到红灯可以停止运动。
引言
本unity研究与已有的完善的多车道、可转弯、可显示实时车量、多画面显示的交通系统数字孪生研究相对比,优势在于简单易开发容易理解,本研究涉及的插件少,逻辑清晰,框架简单,对于入门学习unity的人具有一定参考意义和价值。
技术路线:
一、AI思路:
1、创建道路和交通信号灯模型:使用Unity的建模工具创建道路和交通信号灯模型,确保道路和交通信号灯的位置和布局符合你的需求。
2、添加车辆和行人模型:使用Unity的资源库或自定义模型,添加车辆和行人模型到场景中,以模拟真实的交通情况。
3、设置车辆和行人的行为:使用Unity的脚本编写车辆和行人的行为逻辑,例如遵守交通规则、避免碰撞等,实现这些行为逻辑。
4、添加交通信号灯控制逻辑:使用Unity的脚本编写交通信号灯的控制逻辑,例如根据时间或车辆流量来改变信号灯的状态。
5、运行场景并观察结果:在Unity中运行场景,观察车辆和行人的行为以及交通信号灯的控制效果。根据观察结果,对模型和逻辑进行调整和优化。
二、实际具体设计思路:
1、实际受限于学习能力、调试时间成本、设计生命周期。很难采用并行工程的思想一次设计成功,作为unity初学者,无法熟练使用软件,采用累加的方法实现,列出需要实现的功能:
(1)横向红绿灯颜色切换
(2)汽车生成
(3)随机汽车生成
(4)横向单方向随机汽车等待红灯
(5)横向双方向随机汽车等待红灯
(6)横向双方向汽车防止穿模,追尾,前方有汽车等红灯静止时后方汽车减速或停止
(7)纵向红绿灯颜色切换,与横向红绿灯对应
(8)纵向单方向随机汽车等待红灯、防止穿模,追尾,前方有汽车等红灯静止时后方汽车减速或停止
2、一步步增添、修改代码累加功能、同时调整参数
设计过程
一、资源准备
准备模型、贴图(normal、diffuse、镜像、法向)、预制体、粒子特效、音乐、花式字体等,模型从unity store 下载。较复杂的模块可在其他新建项目中做好后导出资源包,再导入本项目,也可以在本unity项目另建场景进行设置,设为预制体后使用。资源不需要一步添加到位,是实现什么功能,需要什么导入什么,在设计过程中不断添加。
二、搭建场景
1、设置地形:
(1)导入地形贴图,set height设置高度差与地形凹凸。
(2)paint teture,设置地形具体颜色。
(3)种花草、树、paint detail,优化地形细节。
(4)物体对齐,选中物体后f+v,在shaded wireframe下聚焦对齐。
(5)设置一空节点,用于度量位置。
2.、路口设置红绿灯杆。
(1)添加圆柱、长方体等原生物体模拟红绿灯形状,也可以导入现有模型。
(2)添加点光源,调整光强和光照范围。
三、设计红绿灯路口
红绿灯信号周期设置
颜色 | 时长 | 信号 | 实际输出信号 | 处理 |
Red | 5 | 0 | 1 | 停 |
Green | 4 | 1 | 2 | 动 |
yellow | 1 | 2 | 0 | 动 |
颜色 | 时长 | 信号 | 实际输出信号 | 信号处理 |
Green | 4 | 0 | 1 | 动 |
yellow | 1 | 1 | 2 | 动 |
Red | 5 | 2 | 0 | 停 |
|
四、编写程序
以下为部分重要脚本阐释说明
1、红绿灯切换脚本——RGB light
因不是设计多个路口,未使用定时器全局设置,简单使用延时函数Invokerepeating()。时间线设置为红灯5s,绿灯4s,黄灯1s,一轮循环10s。处理信号根据生成位置做不同处理。
2、生成预制体脚本——RGB light
为了方便传递参数仍在RGB light脚本中实现。定义小车列表,定义位置列表,使用instantiate()函数实现。
3、Prefabcar
设置小车运动,根据信号、距离路口距离和生成位置判断运动方向、停车等红灯。设置车间距,防止追尾。
4、carmove
控制小车运动。未设置撞击爆炸特效、音效。先前设计的小车通过物理系统加力的方式运动,地形不平整,碰撞体的编辑、重力。摩擦力等环境参数不好设置,调试过程中经常翻车。改为了通过transform组件直接运动。
5、Raycast
射线检测,判断控制的小车是否闯红灯。
6、HUD
设置HUD跟随控制的小车,显示速度。控制显示用时、超速、闯红灯UI界面,HUD未设置距离显示。
7、Camerafollow
控制摄像机运动轨迹,角度。
8、RobotControl
导入的Robot模型自带脚本,修改了部分动画状态机和动画脚本。
9、Mouselook
控制摄像机视角。
10、UImusic
控制音乐的播放
11、Scenemanager
场景切换
|
五、测试,调整参数
设置采用度量点和原生物体辅助测量,多次调试。
|
六、选择性加入音乐、粒子特效、sky天空盒等
花瓣、雨雪等粒子特效实现:
设置Paticale材质,在粒子系统(particle system)中调整rotation over lifetime实现旋转、Color over lifetime实现淡入淡出,force over lifetime受力等,loop循环播放。更精细的场景采用粒子特效组合方式实现。
设计结果
1、实现红绿灯的切换,控制其中一辆小车的运行。在3个坐标随机生成直线运行的小车,遇到红灯可以停止运动。
2、控制小车按键设置:前进加速w,后退q,减速s,转向a、d,重置位置r
3、数字键1-6切换场景
4、UI按钮雨雪实现天气切换
设计缺陷
1、随机生成汽车,随机间隔,随机速度,长时运行存在概率卡死路口。
2、未设计超车、逆行、闯红灯、超速、变道等行为。
3、仅设计单路口,不涉及交通系统
4、未设置行人
5、未设置撞击效果
设计改进
1、单车道改成多车道。
2、设计人行道,加入行人,调整汽车速度和红绿灯周期等调参数。
3、设计小车拐弯。
4、单路口改为多路口。
5、加入地面烘焙。
6、设计小车行使路径。
7、设置T型、一字型路口。
5、设计交通堵塞。
6、设计店铺、楼房等路边场景。
7、导入A*算法,实现小车自动寻路
8、实现车牌识别,计算实时车辆。
9、添加天气模块,模拟下雪、下雨天气。
结论
采用累加功能的思路设计,每一步清晰可见,代码比较简洁基础,容易学习使用修改,如果有人想设计红绿灯路口或交通系统,可以参考借鉴本研究的设计方法和unity具体场景。
参考文献
[1]Lawa0592.物体跟随移动的不同实现方法.[DB/OL].https://blog.csdn.net/weixin_42358083/article/details/122753421
[2]mr_five567.Unity 获取物体的子物体的方法.[DB/OL].Unity 获取物体的子物体的方法_unity获取子物体-CSDN博客
[3]robot.[DB/OL].https://assetstore.unity.com/zh?category=decentralization&orderBy=1
[4]米牙.交通系统.[DB/OL].https://blog.csdn.net/BDDNH/article/details/117479916?utm_medium=distribute.pc_relevant.none-task-blog-2~
[5].事件函数执行顺序[DB/OL].https://docs.unity.cn/cn/current/Manual/ExecutionOrder.html