Sumo学习日记 - day1 从traci开始

Sumo学习日记

之前经常使用sumo,但是网络上相关教程较少,且并没有行成系统的教学。官方文档教育效果很棒,但是对于想学习sumo这个软件的萌新来说好像有点不友好,所以在这里开一个专题 主要介绍sumo和traci的相关使用 同时也是自己学习的一个过程 如果有问题 欢迎交流。


文章目录

  • Sumo学习日记
  • 写在前面
  • 一、最简单的traci接口使用
  • 二、第一个traci程序
  • 三、仿真运行结果


写在前面

这个专题是假设你大致了解了sumo仿真的基本文件结构,如sumocfg 文件、rou.xml文件等。还需要知道xml文件的大致结构。


一、最简单的traci接口使用

traci是sumo基于java和python的一个接口,你可以使用pip install traci命令在你的python或者anaconda环境中添加traci。

如果你要使用traci,你需要在你的电脑环境变量中配置sumo的路径,配置环境变量不用多说,官方文档建议将变量名命名为SUMO_HOME ,最好按照官方文档配置变量名。
sumo环境变量配置

二、第一个traci程序

你可以在 sumo安装路径:\Sumo\doc\tutorial\traci_tls中找到一个名为runner.py的文件 详细代码如下:

#!/usr/bin/env python
# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
# Copyright (C) 2009-2021 German Aerospace Center (DLR) and others.
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0/
# This Source Code may also be made available under the following Secondary
# Licenses when the conditions for such availability set forth in the Eclipse
# Public License 2.0 are satisfied: GNU General Public License, version 2
# or later which is available at
# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later# @file    runner.py
# @author  Lena Kalleske
# @author  Daniel Krajzewicz
# @author  Michael Behrisch
# @author  Jakob Erdmann
# @date    2009-03-26from __future__ import absolute_import
from __future__ import print_functionimport os
import sys
import optparse
import random# we need to import python modules from the $SUMO_HOME/tools directory
if 'SUMO_HOME' in os.environ:tools = os.path.join(os.environ['SUMO_HOME'], 'tools')sys.path.append(tools)
else:sys.exit("please declare environment variable 'SUMO_HOME'")from sumolib import checkBinary  # noqa
import traci  # noqadef generate_routefile():random.seed(42)  # make tests reproducibleN = 3600  # number of time steps# demand per second from different directionspWE = 1. / 10pEW = 1. / 11pNS = 1. / 30with open(r"D:\Sumo\doc\tutorial\traci_tls\data\cross.rou.xml", "w") as routes:print("""<routes><vType id="typeWE" accel="0.8" decel="4.5" sigma="0.5" length="5" minGap="2.5" maxSpeed="16.67" \
guiShape="passenger"/><vType id="typeNS" accel="0.8" decel="4.5" sigma="0.5" length="7" minGap="3" maxSpeed="25" guiShape="bus"/><route id="right" edges="51o 1i 2o 52i" /><route id="left" edges="52o 2i 1o 51i" /><route id="down" edges="54o 4i 3o 53i" />""", file=routes)vehNr = 0for i in range(N):if random.uniform(0, 1) < pWE:print('    <vehicle id="right_%i" type="typeWE" route="right" depart="%i" />' % (vehNr, i), file=routes)vehNr += 1if random.uniform(0, 1) < pEW:print('    <vehicle id="left_%i" type="typeWE" route="left" depart="%i" />' % (vehNr, i), file=routes)vehNr += 1if random.uniform(0, 1) < pNS:print('    <vehicle id="down_%i" type="typeNS" route="down" depart="%i" color="1,0,0"/>' % (vehNr, i), file=routes)vehNr += 1print("</routes>", file=routes)# The program looks like this
#    <tlLogic id="0" type="static" programID="0" offset="0">
# the locations of the tls are      NESW
#        <phase duration="31" state="GrGr"/>
#        <phase duration="6"  state="yryr"/>
#        <phase duration="31" state="rGrG"/>
#        <phase duration="6"  state="ryry"/>
#    </tlLogic>def run():"""execute the TraCI control loop"""step = 0# we start with phase 2 where EW has greentraci.trafficlight.setPhase("0", 2)while traci.simulation.getMinExpectedNumber() > 0:traci.simulationStep()if traci.trafficlight.getPhase("0") == 2:# we are not already switchingif traci.inductionloop.getLastStepVehicleNumber("0") > 0:# there is a vehicle from the north, switchtraci.trafficlight.setPhase("0", 3)else:# otherwise try to keep green for EWtraci.trafficlight.setPhase("0", 2)step += 1traci.close()sys.stdout.flush()def get_options():optParser = optparse.OptionParser()optParser.add_option("--nogui", action="store_true",default=False, help="run the commandline version of sumo")options, args = optParser.parse_args()return options# this is the main entry point of this script
if __name__ == "__main__":options = get_options()# this script has been called from the command line. It will start sumo as a# server, then connect and runif options.nogui:sumoBinary = checkBinary('sumo')else:sumoBinary = checkBinary('sumo-gui')# first, generate the route file for this simulationgenerate_routefile()# this is the normal way of using traci. sumo is started as a# subprocess and then the python script connects and runstraci.start([sumoBinary, "-c", "D:/Sumo/doc/tutorial/traci_tls/data/cross.sumocfg","--tripinfo-output", "tripinfo.xml"])run()

如果你的环境变量且traci是配置好了的,这个脚本是可以直接跑的,下面将详细讲解每段代码的含义:

# we need to import python modules from the $SUMO_HOME/tools directory
if 'SUMO_HOME' in os.environ:tools = os.path.join(os.environ['SUMO_HOME'], 'tools')sys.path.append(tools)
else:sys.exit("please declare environment variable 'SUMO_HOME'")

这里是查看你的sumo环境变量是否配置成功 如果代码报错在这里 请检查你的环境配置

def generate_routefile():random.seed(42)  # make tests reproducibleN = 3600  # number of time steps# demand per second from different directionspWE = 1. / 10pEW = 1. / 11pNS = 1. / 30with open(r"D:\Sumo\doc\tutorial\traci_tls\data\cross.rou.xml", "w") as routes:print("""<routes><vType id="typeWE" accel="0.8" decel="4.5" sigma="0.5" length="5" minGap="2.5" maxSpeed="16.67" \
guiShape="passenger"/><vType id="typeNS" accel="0.8" decel="4.5" sigma="0.5" length="7" minGap="3" maxSpeed="25" guiShape="bus"/><route id="right" edges="51o 1i 2o 52i" /><route id="left" edges="52o 2i 1o 51i" /><route id="down" edges="54o 4i 3o 53i" />""", file=routes)vehNr = 0for i in range(N):if random.uniform(0, 1) < pWE:print('    <vehicle id="right_%i" type="typeWE" route="right" depart="%i" />' % (vehNr, i), file=routes)vehNr += 1if random.uniform(0, 1) < pEW:print('    <vehicle id="left_%i" type="typeWE" route="left" depart="%i" />' % (vehNr, i), file=routes)vehNr += 1if random.uniform(0, 1) < pNS:print('    <vehicle id="down_%i" type="typeNS" route="down" depart="%i" color="1,0,0"/>' % (vehNr, i), file=routes)vehNr += 1print("</routes>", file=routes)

这一段代码主要是通过对xml文件的操作,写入交叉口数据,其中< vType >标签表示vehicle type 即交通工具种类 xml的这个分支表示了 车辆id、加速度accel、减速度deccel、服从度(服从度指的是交通驾驶员服从交通规则的概率)sigma、车长length、最小间隙minGap、最大车速maxSpeed、图像显示类型guiShape。如下:

< vType id="typeNS" accel="0.8" decel="4.5" sigma="0.5" length="7" minGap="3" maxSpeed="25" guiShape="bus"/ >

然后< route >标签规定了道路的路径 edge表示道路边缘的id 如 edges=“51o 1i 2o 52i”
表示这个路径 从id为 51o -1i-2o-52i

def run():"""execute the TraCI control loop"""step = 0# 初始相位为两相位且东西为主路 traci.trafficlight.setPhase("0", 2)while traci.simulation.getMinExpectedNumber() > 0:traci.simulationStep()if traci.trafficlight.getPhase("0") == 2:# 尚未准备切换相位if traci.inductionloop.getLastStepVehicleNumber("0") > 0:# 北进口有来车 切换相位为南北放行traci.trafficlight.setPhase("0", 3)else:# 否则继续保持东西通行traci.trafficlight.setPhase("0", 2)step += 1traci.close()sys.stdout.flush()

这里是设置信号灯相位 初始相位为两相位且东西方向为绿灯(放行),这个循环的意义在于每当仿真步长走一步sumlationste判断南北方有无来车,以此达到感应控制的效果(感应控制不知道可以百度或者查看交通管理与控制这本书的相关部分),进而判断是否切断相位。

# this is the main entry point of this script
if __name__ == "__main__":options = get_options()# this script has been called from the command line. It will start sumo as a# server, then connect and runif options.nogui:sumoBinary = checkBinary('sumo')else:sumoBinary = checkBinary('sumo-gui')# first, generate the route file for this simulationgenerate_routefile()# this is the normal way of using traci. sumo is started as a# subprocess and then the python script connects and runstraci.start([sumoBinary, "-c", "D:/Sumo/doc/tutorial/traci_tls/data/cross.sumocfg","--tripinfo-output", "tripinfo.xml"])run()

这是程序运行的主入口 没有什么好说明的

三、仿真运行结果

仿真运行结果
看懂代码之后可以自己修改代码 多试试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45218.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业论文内容参考|基于Android的旅游攻略APP的设计与实现

文章目录 导文摘要:前言:绪论:1. 课题背景:2. 国内外现状与趋势:3. 课题内容:相关技术与方法介绍:系统分析:系统设计:系统实现系统测试总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于Android的旅游攻略APP的设计与实现 摘要: 本文基于Android平台…

关于android的外文论文,毕业论文外文翻译-Android开发

毕业论文外文翻译-Android开发 (11页) 本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01; 9.90 积分 毕业设计(论文)外文翻译 毕业 论文题目 基于 Android 手机通讯录的设计与实现 作 者 姓 名 所学专业…

【论文阅读笔记】里程计ODO/INS不同融合方式的性能比较

文章目录 一、里程计的工作原理二、论文中的主要结论三、总结四、参考文献 欢迎关注个人公众号&#xff1a;导航员学习札记 关于里程计的融合一般用“距离增量修正”和“速度修正”两种方式。我最近在想这两种方式在性能上有什么不同&#xff0c;因此找了两篇论文来看。本文主…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(三)(共识网络分析-第三步-共识模块与特异模块相关联)

1写在前面 有小伙伴子留言问最近介绍的WGCNA共识网络的意义是什么&#xff0c;保守性吗&#xff01;&#xff1f;&#x1f9d0; 与把雄性小鼠和雌性小鼠的数据merge在一起&#xff0c;一起构建网络、确定模块的方式有什么区别呢&#xff01;&#xff1f;&#x1f617; 其实区别…

Same Symbol | 哇咔咔!!!盘点一下表达矩阵中重复基因的处理方法!~

1写在前面 医院天天叫我们填问卷&#xff0c;我真是不能理解。&#x1fae0; 动不动就问我们对医院的福利满意吗&#xff0c;对自己的收入满意吗&#xff0c;觉不觉得工作负荷太重了&#xff1f;&#xff1f;&#xff1f;&#x1f642; 我们满不满意&#xff0c;觉不觉得累&…

生信分析案例 Python简明教程 | 视频14

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

“去高精地图”跟“轻高精地图”有啥区别?落地的挑战又是啥? | 九章自动驾驶随笔之一...

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 编辑 | 苏清涛 真正影响Mapless技术路线落地的最大难点在于…

登录微软账号的Windows电脑如何远程?

一般情况下&#xff0c;我们都使用的是Windows电脑的本地账户。但是随着Windows 10的推广&#xff0c;现在微软也开始主推微软账号登录Windows电脑了。 现在遇到一个问题&#xff0c;就是远程Windows电脑时&#xff0c;提示连接不上&#xff0c;刚开始以为是远程服务没有开&am…

win10微软商店/账号登录一直转圈

解决win10登录微软账户或者微软商店时无法登录问题&#xff1a; 1.右键wifi按钮&#xff0c;打开“网络和Internet”设置。 2.更改适配器选项 3.右键当前的网络连接&#xff0c;选择“属性” 4.找到IPv4一项&#xff0c;点击“属性”按钮 5.自定义DNS服务器地址&#xf…

微软账户登录不了问题

问题描述: 为了使用newbing需要登录微软账号&#xff0c;但是公司电脑访问微软账号十分的慢&#xff0c;一登录就转圈。 问题原因&#xff1a; 和宽带采用的上网方式&#xff08;IPV4和IPV6&#xff09;和dns解析有关系由于国内基本都采用IPV4的方式&#xff0c;下文对IPV4的…

我让ChatGPT写了一篇php现状和趋势的文章

我给出的指令是&#xff1a; 写一篇介绍php的2023年现状和未来趋势的文章 下面是ChatGPT返回的结果&#xff1a; 2023年PHP&#xff1a;现状和未来趋势 编程语言PHP于1994年开发&#xff0c;并从此成为世界上使用最广泛的语言之一。它用于创建动态网站&#xff0c;是web开发世界…

ChatGPT “火出圈” 测试工程师的饭碗还能保住吗

ChatGPT已经在国内火了一个多月了&#xff0c; 这个让AI巨头神仙打架的智能对话机器人 到底火到了什么程度&#xff1f; 随处可见的经验分享&#xff1a;ChatGPT让我一天之内学会技能&#xff01; 到处传播的社会新闻&#xff1a;某岗位又被ChatGPT给干失业了&#xff01; …

没想ChatGPT两个月用户破亿的世界记录,这么快就被打破了!5天!

上线第一天&#xff0c;用户超3000万&#xff0c;上线后5天&#xff0c;用户破1亿&#xff0c;Threads无疑创造了技术产品用户数破亿的新纪录&#xff0c;而前记录还是今年ChatGPT创下的2个月。 Threads创造了有史以来最快的用户破亿纪录(来源&#xff1a;World Of Statistics …

VScode终端插件

Terminal 使用方法 安装Terminal&#xff0c;在VScode编辑器里的项目文件中【右键】 → 【open in Integrated Terminal】即可。 你会看到如图所示的终端&#xff0c;它等同于cmd&#xff0c;可以很方便的在VScode中实时查看。

【Vscode】隐藏的端口转发功能,大多数人都不知道怎么用

引言 Python 编程中有两款 IDE 深受广大开发者的喜爱&#xff0c;一是微软出品的 Vscode&#xff0c;以小巧、轻量、插件丰富而闻名&#xff0c;另一款则是大名鼎鼎的专为 Python 编程而打造的 Pycharm。这两款工具各有优缺点&#xff0c;这里不吹不黑&#xff0c;在博主看来&…

关闭vscode烦人的提示框

vscode有两种烦人的提示框&#xff1a; 第一种是&#xff1a;鼠标放到html标签上的悬浮提示框&#xff0c;如图&#xff1a; 第二种是&#xff1a;输入的时候有悬浮窗&#xff0c;并不是智能提示的框&#xff0c;而是解释型的提示框&#xff0c;如图&#xff1a; 这两种框基本…

vscode屏蔽文件

1. 基于工程“uboot-imx-rel_imx_4.1.15_2.1.0_ga”. 2.方法一 2.1&#xff09;shiftP快捷键&#xff0c;输入“settings”,打开settings.json文件 2.2&#xff09;输入以下代码&#xff0c;即可对configs文件夹指定的内容进行屏蔽 "files.exclude": {"configs/…

VsCode文件屏蔽

在分析uboot源码时&#xff0c;许多文件都不需要&#xff0c;要将该文件的目录屏蔽并且设置搜索范围 在工程目录下&#xff0c;建立.vscode文件夹&#xff0c;在.vscode 文件夹中新建settings.json的文件&#xff0c;然后在 settings.json 中输入如下内容&#xff1a; {"…

【vscode】代码调试时直接显示在vscode终端,而不弹出新的终端

tasks.json文件修改&#xff0c;加入语句&#xff1a; "presentation": {"panel": "shared"}launch.json文件修改&#xff0c;加入语句&#xff1a; // 调试时是否显示控制台窗口&#xff0c;设置为true则显示在新的windows终端控制台 "e…

vscode运行C/C++不弹出黑色终端解决办法

1.首先打开扩展(CtrlShiftX) 2.选择C/C Compile Run 3.点击管理-->扩展管理 4.勾选以下选择框 5.按F6实现终端页面弹出