【问题标题】:How to set speeds using a pandas dataframe in SUMO with TraCI?如何使用带有 TraCI 的 SUMO 中的 pandas 数据框设置速度?
【发布时间】:2018-08-08 20:52:44
【问题描述】:

目标

我想为单个车辆使用预定义的速度矢量,以便在 SUMO 模拟中移动它们。

数据和文件

模拟中有 3 辆车。对于其中 2 辆车,我想指定速度。速度数据在Python创建如下:

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

data = {'ADO_name':['car1','car1','car1','car2','car2','car2'],
        'Time_sec':[0,1,2,0,1,2],
        'Speed.kph':[50,51,52,0,0,52]}
dframe = DataFrame(data)  

此模拟的路由、网络和配置文件位于以下文件夹中:https://1drv.ms/f/s!AsMFpkDhWcnw61EI5wR6hPaaRBJI
我还将代码放在同一文件夹中的Script.py 文件中。

我尝试了什么

以下是我一直在尝试使用的代码,以及错误:

#start sumo
sumoBinary = "C:/Users/Quinton/Desktop/Documents/Sumo/bin/sumo-gui"
sumoCmd = [sumoBinary, "-c", "C:/Users/Quinton/Desktop/Example2/example2.sumocfg"]


#importing libraries
import traci
import traci.constants as tc
traci.start(sumoCmd)

#subscribing to variables that we want to be printed once the copy has run
traci.vehicle.subscribe("car1", (tc.VAR_SPEED, tc.VAR_ROAD_ID, tc.VAR_LANE_ID, tc.VAR_LANEPOSITION))
traci.vehicle.subscribe("car2", (tc.VAR_SPEED, tc.VAR_ROAD_ID, tc.VAR_LANE_ID, tc.VAR_LANEPOSITION))
traci.vehicle.subscribe("car3", (tc.VAR_SPEED, tc.VAR_ROAD_ID, tc.VAR_LANE_ID, tc.VAR_LANEPOSITION))

#using traci.movetoXY to position car1 and car2 on network
traci.vehicle.moveToXY(vehID="car1", edgeID="highway1.1", lane=0, x=1000, y=-3.3, keepRoute=0)
traci.vehicle.moveToXY(vehID="car2", edgeID="highway1.1", lane=1, x=700, y=3.3, keepRoute=0)

#disallows car1 and car2 from changing lanes during simulation
traci.vehicle.setLaneChangeMode(vehID="car1", lcm=512)
traci.vehicle.setLaneChangeMode(vehID="car2", lcm=512)


#importing python modules
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

#creating speed data
data = {'ADO_name':['car1','car1','car1','car2','car2','car2'],
        'Time_sec':[0,1,2,0,1,2],
        'Speed.kph':[50,51,52,0,0,52]}
dframe = DataFrame(data)
#print(dframe)

step = 0

#running traci
for ado in dframe.groupby('ADO_name'):
  ado_name = ado[1]["ADO_name"]
  adoID = ado_name.unique()

  while step <= 2:
    traci.simulationStep()
    traci.vehicle.setSpeed(adoID, ado[1][ado[1].Time_sec == step]['Speed.kph'])
    print (traci.vehicle.getSubscriptionResults("car1"), traci.vehicle.getSubscriptionResults("car2"))

  step += 1  

错误:

Traceback (most recent call last):
  File "C:\Users\Quinton\AppData\Local\Temp\Rtmp6jCqR4\chunk-code-16888822790.txt", line 41, in <module>
    traci.vehicle.setSpeed(adoID, ado[1][ado[1].Time_sec == step]['Speed.kph'])
  File "C:\Program Files (x86)\DLR\Sumo\tools\traci\_vehicle.py", line 927, in setSpeed
    tc.CMD_SET_VEHICLE_VARIABLE, tc.VAR_SPEED, vehID, speed)
  File "C:\Program Files (x86)\DLR\Sumo\tools\traci\connection.py", line 139, in _sendDoubleCmd
    self._beginMessage(cmdID, varID, objID, 1 + 8)
  File "C:\Program Files (x86)\DLR\Sumo\tools\traci\connection.py", line 127, in _beginMessage
    self._packString(objID, varID)
  File "C:\Program Files (x86)\DLR\Sumo\tools\traci\connection.py", line 66, in _packString
    self._string += struct.pack("!Bi", pre, len(s)) + s.encode("latin1")
AttributeError: 'numpy.ndarray' object has no attribute 'encode'  

注意事项

据我了解,问题出在代码的#running traci 部分。我在没有调用TraCI 并使用print() 而不是traci.vehicle.setSpeed() 的情况下测试了这段代码并且没有出错。所以,似乎Python 方面的事情很好。你能帮我解决这个问题吗

【问题讨论】:

    标签: python sumo


    【解决方案1】:

    问题不在于 traci 部分,而在于您的 adoID,它是一个数组,但应该是单个 id(一个字符串),因此您可能应该只取该数组的第一个元素。

    【讨论】:

    • 感谢您的回答。在删除car2 的数据后,我尝试了adoID[0]。有效。但是,如果我将两辆车的数据与adoID[0] 一起保存,则会收到错误required argument is not a float
    • 我不确定您的代码试图实现什么。你想将两辆车的数据输入 traci 还是只输入一辆或第一辆然后另一辆?如果你想同时做这两件事,我的方法是简单地按时间对数据进行排序,然后应用每个条目。不需要 groupBy。
    • 谢谢。我想同时提供两辆车的速度。正如你所建议的,我只是使用了for loop 而没有groupby,它运行起来没有任何问题。只是好奇,有没有更优雅的方式来提供多辆车的速度?我总共有 13 个。
    • 恐怕没有。没有 setMultipleSpeeds 这样的东西,虽然实现起来肯定不难,但它有点违背通常的 TraCI 哲学,即单独处理每个对象及其属性。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多