SUMO与python联合仿真(跟驰与换道)

这几天做了几个sumo与python联合仿真的实验,虽然设计的场景相对来说不是很复杂,但是我觉得挺有收获的,期间也经历了很多大大的坑,下面来分享一下。

问题1:在sumo与python联合仿真时,配置环境变量

SUMO与python联合仿真(跟驰与换道)_第1张图片

(%E5%A4%A7%E5%9D%91%E6%80%BB%E7%BB%93.assets/1686476392225.png)

点开之后设置三部分

SUMO与python联合仿真(跟驰与换道)_第2张图片

然后是用户变量中设置SUMO_HOME

SUMO与python联合仿真(跟驰与换道)_第3张图片

然后是用户变量中设置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

SUMO与python联合仿真(跟驰与换道)_第4张图片

SUMO与python联合仿真(跟驰与换道)_第5张图片

问题3:碰撞时可选择碰撞后的模式

加入


    

此时sumocfg为


​
    
        
        
    
​
    
    
        
    
    
                
        
    

碰撞模式可以选择四种,其中warn是常见的,它可以在右下角提醒你什么时间撞了车。但是如何撞车后立即停下不是很懂(待探索)

问题4:改变状态函数-set acceleration

因为我的一个场景是需要均匀减速的,但是我用这个函数时出了问题,他是比如我设置了-2的减速度,他不会立即以这个减速度减速,而是减速度慢慢减至-2,如我设置在仿真20s时减速。

此时开始仿真,

这个时候可以通过每一秒设置一个速度来解决-setspeed

SUMO与python联合仿真(跟驰与换道)_第6张图片

但是要注意在车辆类型设置的时候,最小减速度一定要小于等于-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

总结:仅仅是做了一些简单的仿真,如果上边的问题给你带来了帮助,麻烦给个赞谢谢啦,有其他问题可以私聊互相讨论

你可能感兴趣的:(python,开发语言)