TraCI的命令主要分为13个方面:
1. gui,
2. lane,
3. poi(point of interest),
4. simulation,
5. traffic lights,
6. vehicle type,
7. edge,
8. induction loop,
9. junction,
10. multi-entry/exit,
11. polygon,
12. route,
13. person and vehicle.
关于更详细的内容,可以阅读相关的文档: pydoc generated documentation。源代码可以在此查看。
1、在脚本中导入traci
为了使用库,安装目录的/tools文件夹必须在python的加载路径中。这通常是通过一小段代码实现,如下这样的:
mportos, sys
if 'SUMO_HOME' in os.environ:
tools =os.path.join(os.environ['SUMO_HOME'], 'tools')
sys.path.append(tools)
else:
sys.exit("please declare environmentvariable 'SUMO_HOME'")
这里,其实把tools目录加进path环境变量中就可以吧?
关于SUMO_HOME的环境变量设置在脚本执行前需设置,阅读:。另外,你也可以直接在命令中声明路径:
sys.path.append(os.path.join('c:', os.sep, 'whatever', 'path', 'to', 'sumo', 'tools'))
2、走出第一步
一般,通过python和SUMO进行交互并不难(下面的例子为tutorial/traci_tls的修改);
首先,你需要启动SUMO或者SUMO-GUI,并添加选项–remote-port,或者你直接在python脚本中写:
import subprocess
PORT = 8813
sumoBinary = "/path/to/sumo-gui"
sumoProcess = subprocess.Popen([sumoBinary, "-c", "yourConfiguration.sumocfg", "--remote-port", str(PORT)], stdout=sys.stdout, stderr=sys.stderr)
然后,使用你的脚本连接仿真:
import traci
traci.init(PORT)
step = 0
while step < 1000:
traci.simulationStep()
no = traci.inductionloop.getLastStepVehicleNumber("0")
traci.trafficlights.setRedYellowGreenState("0", "GrGr")
step += 1
traci.close()
随着选项—remote-port选项的执行,脚本打开了和sumo的连接。直到你关闭连接,你可以发送多种命令,执行仿真的步骤。
3、订阅(subscriptions)
订阅可以被看作是一个用于检索变量的批处理模式。代替重复请求相同的变量,在每个时间步长中,你可以自动检索感兴趣的值。TraCI订阅在每一个模块基础上执行处理。您可以在每个时间步长后请求当前订阅的模块的结果。为了订阅变量,你需要直到他们的变量ID,这些ID可以在traci/constants.py文件中查询。
import traci
import traci.constants as tc
PORT = 8813
traci.init(PORT)
traci.vehicle.subscribe(vehID, (tc.VAR_ROAD_ID, tc.VAR_LANEPOSITION))
print traci.vehicle.getSubscriptionResults(vehID)
for step in range(3):
print "step", step
traci.simulationStep()
print traci.vehicle.getSubscriptionResults(vehID)
traci.close()
检索的值总是从最后一个时间步骤的,它是不可能检索旧的值。
4、来自相同TraCI脚本的并行模拟
Traci可以在同一时间使用同一脚本进行多倍的仿真运行。为了实现运行,每个仿真必须有自己的port端口号,通过—remote-port设置。函数traci.init()有一个可选的标签参数,允许您多次调用不同的端口和标签。函数traci.switch()可以用来转到任何标签的初始化阶段。
traci.init(8813, label="sim1")
traci.init(8814, label="sim2")
traci.switch("sim1")
traci.simulationStep() # run 1 step for sim1
traci.switch("sim2")
traci.simulationStep() # run 1 step for sim2
请注意,每一个模拟步骤(即使是不同的模拟)都会清除所有的订阅结果。
5、嵌入式python
作为一个实验特征,让SUMO直接与python连接,并且在SUMO中直接运行脚本都是可能的。语法完全相同,除非你leave out了 init和close的调用,你需要通过—python-script启动sumo。这个功能目前不支持GUI版本的sumo。
由于该功能还没有得到很好的测试,当创建SUMO您需要启用嵌入式Python(在发布版本和nightly build中不可以)。为了实现此功能,你需要进行以下几步:
5.1Linux
n 安装python开发包文件
n 使用—with-python选项调用配置文件
n 像往常一样制作&&制作安装
5.2windows
1. 确保python已经安装并且设置了环境变量path
2. 调用tools\build\pythonPropsMSVC.py去生成/修改文件build\msv10\config.props
3. 像往常创建win32 release版本
4. 调试版本(debug)涉及比较多,默认是不可用的。以下的指令来源于:taken from here
1) 下载适合你版本的python源代码
2) 在Visual Studio的pcbuild目录下打开pcbuild.sln
3) 开始win32 Debug的创建,,将会报很多的错,但是核心部分成功。
4) 从PCbuld目录下复制:
Ø python27_d.dll到python安装目录下(如c:\Python27)
Ø python27_d.dll,python27_d.pdb,python27_d.exp到libs目录下;(如c:\python27\libs)
Ø 每个*_d.pyd到DLLs文件下(比如c:python27\DLLs)
4)通过修改build\msvc10\win32.props实现pythondebug创建
5)现在你能够为SUMO创建win32 debug
注意:
连接SUMO Debug build对应的python版本并不容易(其他的库可能存在)。 If you just need SUMO with debugging symbols, and don'twant to build the python debug lib, use the Fastbuild configuration.
VS更早版本和64位机器可能并不合适,但是程序员可以能够修改代码实现。
6、其他功能函数
当使用TraCI时,一些普遍的任务并没有包含在TraCI库中,比如:
1) 分析道路网络
2) 解析仿真输出
针对这些功能,可以阅读: Tools/Sumolib
7、缺陷与解决方案
注意,字符串,如果交换,必须是ASCII编码。
如果你通过python脚本的subprocess.Popen,结束脚本前确保调用wait()在结果处理中。否则你将失去输出。(意思是看不到输出,因为不等的话,就会一闪而过)