这几天做了几个sumo与python联合仿真的实验,虽然设计的场景相对来说不是很复杂,但是我觉得挺有收获的,期间也经历了很多大大的坑,下面来分享一下。
问题1:在sumo与python联合仿真时,配置环境变量
(%E5%A4%A7%E5%9D%91%E6%80%BB%E7%BB%93.assets/1686476392225.png)
点开之后设置三部分
然后是用户变量中设置SUMO_HOME
然后是用户变量中设置SUMO_HOME,接着系统变量中同样进行上述设置。如果还是不能联合仿真的话,就应该是sumo版本的问题,我之前用的版本很老很老,但是换了一个最新的之后就可以了。
问题2:在选择跟驰和换道时遇到的坑
首先我是擦考虑知乎上,设置两个车辆,均做匀速运动,前车比后车的速度要小,这种情况应该是后车一段时间后应与前车追尾,但是通过仿真发现,后车会自动环道,因此车辆自带跟驰模型与换道模型,关闭两模型换道的代码为:
traci.vehicle.setLaneChangeMode("vehicle_1", 0b000000000000) traci.vehicle.setLaneChangeMode("vehicle_2", 0b000000000000)
要注意的是,他这个代码是关闭自动换道和跟驰的,因此在设置强制换道时,该操作不受影响。
如果要调整回来,把所有0改为1即可,0b指的是二进制,详细每一位所代表的意义见
https://sumo.dlr.de/docs/TraCI/Change_Vehicle_State.html
问题3:碰撞时可选择碰撞后的模式
加入
<processing> <collision.action value="warn"/> </processing>
此时sumocfg为
<?xml version="1.0" encoding="UTF-8"?> <configuration> <input> <net-file value="test.net.xml"/> <route-files value="test.rou.xml"/> </input> <time> <begin value="0"/> <end value="10000"/> </time> <processing> <collision.action value="warn"/> </processing> <gui_only> <start value="t"/> <quit-on-end value="t"/> </gui_only> </configuration>
碰撞模式可以选择四种,其中warn是常见的,它可以在右下角提醒你什么时间撞了车。但是如何撞车后立即停下不是很懂(待探索)
问题4:改变状态函数-set acceleration
因为我的一个场景是需要均匀减速的,但是我用这个函数时出了问题,他是比如我设置了-2的减速度,他不会立即以这个减速度减速,而是减速度慢慢减至-2,如我设置在仿真20s时减速。
此时开始仿真,
这个时候可以通过每一秒设置一个速度来解决-setspeed
但是要注意在车辆类型设置的时候,最小减速度一定要小于等于-1。
问题5:将获取的动态数据进行处理的方法,大家可以参考一下
simulation_time = traci.simulation.getTime() print("仿真时间是", simulation_time) all_vehicle_id = traci.vehicle.getIDList() print("车辆ID是", all_vehicle_id) all_vehicle_position = [(i, traci.vehicle.getPosition(i)[0]) for i in all_vehicle_id] print("车辆位置是", all_vehicle_position) front_spd = traci.vehicle.getSpeed('vehicle_1') front_acc = traci.vehicle.getAcceleration('vehicle_1') print("前车速度是" + str(front_spd) + " 前车加速度是" + str(front_acc)) follower_spd = traci.vehicle.getSpeed('vehicle_2') follower_acc = traci.vehicle.getAcceleration('vehicle_2') print("后车速度是" + str(follower_spd) + " 后车加速度是" + str(follower_acc)) # 装在记事本里 operate_time.append(simulation_time) follow_v.append(follower_spd) follow_accel.append(follower_acc) follow_position.append(traci.vehicle.getPosition('vehicle_2')[0]) front_v.append(front_spd) front_accel.append(front_acc) front_position.append(traci.vehicle.getPosition('vehicle_1')[0]) # traci.vehicle.setSpeed('a12.5',10) # print(traci.vehicle.getIDList()) # print(traci.edge.getIDList()) # print(traci.inductionloop.getVehicleData('abcd')) all_value = np.vstack((operate_time, follow_v, follow_accel, follow_position, front_v, front_accel, front_position)) all_value1 = pd.DataFrame(all_value) # all_value1.to_csv(r'D:\桌面\value.csv')
问题6:关于traci模块的添加
参考
https://blog.csdn.net/weixin_53925257/article/details/126260618
问题7:改变运动状态时设置的时间
这个对于我来说,是一个非常像解决的问题,比如我想要让其在仿真时间为20s时开始减速,这时应该当step=19时设置这一函数,其次是车辆类型depart参数时,depart表示进入仿真的时间,这个时间如果设置为0时,则出现在仿真场景中的仿真时间是1s文章来源:https://www.toymoban.com/news/detail-745179.html
总结:仅仅是做了一些简单的仿真,如果上边的问题给你带来了帮助,麻烦给个赞谢谢啦,有其他问题可以私聊互相讨论文章来源地址https://www.toymoban.com/news/detail-745179.html
到了这里,关于SUMO与python联合仿真(跟驰与换道)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!