sumo的简单应用_sumo快速运行简单仿真实例详细教程

本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目“跑起来”才是大家学习下去的动力,国内参考文献太少了,sumo官网又是纯英文,出于此产生了本篇教程,在写作过程中引用了几位CDDN博主的文章,还有两篇介绍车联网仿真模型的论文,就不一一列出了,知识共享,替大家感谢各位了,不会声明原创,我们都是搬运工!开始正题:

一.简单介绍sumo交通仿真器

SUMO是一个微观的,空间上连续,时间上离散的交通仿真软件,采用c++语言开发,其宏观特征包括带变道的多车道道路,基于道路交叉口的靠右侧行驶规则,支持动态路由,可以管理超过10000条街道的网络。其微观特征包括允许碰撞自由的车辆移动模式,支持单车路由。该软件特点是具有快速的OpenGL图形界面,支持多种网络格式输入,缺点是sumo本身不能提供网络仿真器所需要的轨迹文件。

SUMO可去官网下载,解压后就可以使用,图形界面软是在解压后bin文件夹下的sumo-gui.exe。使用前最好设置环境变量SUMO_HOME。其实不设置似乎也可以使用,但是会有警告。SUMO_HOME的内容就是安装文件的位置,也就是bin文件夹的上一级目录。

SUMO解压之后,作重要的是bin文件夹下的程序和tools文件夹下的程序。bin文件夹下大部分是可执行文件,但是并不像普通的可执行文件一样打开,而是需要用命令行打开,换句话说,整个功能程序并没有被包装起来,这是出于可裁剪和可维护性角度考虑的。tools下的工具则更多的是用phyton写的。

注:可能大家对于车载自主网仿真的一些概念生疏,可以先看两篇介绍的论文作为开胃菜,上知网搜索车载自主网的仿真研究综述和车辆自组织网仿真研究,写的都很好,是不错的车辆自组织网仿真入门的论文。

二.sumo工程结构

SUMO的仿真至少需要两个文件:

1.道路文件,或者叫路网文件(net.xml),就是对行车道路的描述文件;

2.车流文件(rou.xml),或者叫做车量行驶文件,用来描述车流量的行为。当然,更加高级的仿真可以加入别的文件,比如车辆描述文件,地形文件。

这个很容易理解,想要做仿真,最起码要有地图吧,这就是路网文件net,xml;有了地图后是不是还要产生几辆车呢,不管你怎么产生,总之得有车,产生车的规则随意定,这就是rou.xml文件的功能。

道路文件的产生有好多种方法,我们先简单的来了解两个,第一个是从开源的地图上下载osm地图文件,常用的是openstreetmap(osm是一种地图信息文件,可以去openstreetmap官网下载。网址:http://www.openstreetmap.org/),然后利用sumo自带的netconvert工具将osm文件转换为net.xml文件;第二个是自己"编写"net.xml文件,我目前学习到的并不是直接开始编写net.xml文件,因为在sumo规定中,道路是由节点和边组成的,也符合我们一贯的数学思维,所以我们会先编写nod.xml节点文件和edg.xml边文件,然后通过netconvert工具去将这两个文件结合成net.xml文件;除了这两种方法外还有通过OD矩阵啊,等等产生路网文件,不过我还没了解,所以先不做深入介绍,可以到官网查看,官网介绍的很详细,本文主要是做个快速教程。

车流行驶文件即规定车辆数量,车辆行驶规则等,实验目的不同,规则自然千变万化,所以rou.xml的产生自然也有很多的方法,本教程中使用的是sumo自带的一个radomTrips.py,它是一个工具,通过调用这个工具可以在已有的net.xml上产生车辆行驶规则,利用它和上面的net,xml就可以产生rou.xml文件,当然,本实验纯粹为了演示,所以利用的已有的随机路径

三 sumo工程的例子 详细教学

下面就开始进入实验环节,请大家一步一步按照要求来,绝对是可以出结果的

1.软件版本需求

windows系统(sumo在linux下运行效果更好)不做要求,xp,7,8,10都可以sumo版本0.30及以上最好Notepad++(为了查看和编辑xml文件)可替换,只要能查看编辑xml即可python环境2.7及以上都可以,我用的3.6

2.从openstreetmap上下载相关osm地图文件,并做相应处理

上面的软件都安装以后,就可以开始正式进行sumo第一个项目了

(1)打开openstreetmap官网(https://www.openstreetmap.org),在左侧输入框搜索fiarfax VA,然后开始搜索,在出现的选项选择city开头的选项,然后右侧界面会显示你选择的城市的地图

确认之后在右侧可以看到选择的地图的详细情况,不规则红圈标示了范围,外面矩形红圈是我标的,左侧是关于地图的简单介绍

如果该地图不能导出,可以选择别的地方,比如北京,上海等城市,不影响实验结果!

最好将地图保存在和sumo同一层次的文件夹中,例如我在C盘下新建了mytest文件夹,把sumo解压到mytest文件夹下,并且在mytest下新建了map文件,来保存地图文件及随后产生的各个xml等文件,方便查看和管理,推荐这样做!

(2)对导出的地图做处理

官网原文,即下载的osm除了路网信息还包含别的东西,需要做简单处理

OSM-data not only contains the road network but also a wide range of additional polygons such as buildings and rivers. These polygons can be imported using POLYCONVERT and then added to a sumo-gui-configuration.

导出的osm地图不仅包含路网信息也包含大量的别的模块例如建筑和河流,这些模块可以用polyconvert工具添加到sumo-gui配置文件中。

我们手动打开sumo\doc\userdoc\Networks\Import\OpenStreetMap.html文件,然后在打开的网页中间部分 Importing additional Polygons (Buildings, Water, etc.)的下面有一大段xml的代码,复制这些代码,然后在notepad++中级新建文件并把复制的代码粘贴到里面,在本实验中因为不需要,所以删除了下面的id=“power”的那一行代码,然后保存为typemap.xml,把这个文件保存到上一步骤建的map文件中去,和osm地图文件放一起。

(3)打开sumo/bin/start-command-line.bat,然后就可以用命令行模式对osm文件做处理,会使用linux命令是前提条件,当然在这里你可以照着敲,先cd到map文件夹下进行操作,如果在别的路径下可能会出错

然后输入以下指令

netconvert --osm-files map.osm -o map.net.xml

polyconvert --net-files map.net.xml --osm-files map.osm --type-file typemap.xml -o map.poly.xml

这一步完成后就产生了map.net.xml和map.poly.xml文件

3.产生map.rou.xml文件

输入命令 python C:/mytest/sumo/tools/randomTrips.py -n map.net.xml -e 100 -l

-n map.net.xml表示输入,-n表述输入的类型是net类型,其实-n等价于--net,-n是一种简写的方式。后面的-l -e 600是随机工具的配置,就像随机数生成函数需要一个种子一样。

但是,这样的一个过程生成的是一个旅程随机过程文件,而我们需要的是一个rou.xml文件。

所以,最后,我们把随机的旅程和道路信息结合起来就获得了车流文件(rou.xml)了。我们要用到的工具是bin文件夹下的duarouter.exe。

输入命令 python C:/mytest/sumo/tools/randomTrips.py -n map.net.xml -r map.rou.xml -e 100 -l

执行成功后可以在map文件夹下查看到map.rou.xml

4.编辑配置文件

编辑配置文件如下图,主要是更改input文件,可以在sumo文件夹中搜索test.sumo.cfg然后更改input文件,便可以得到如下图所示文件,然后把文件命名为map.sumo.cfg并保存到map文件夹中,到这一步,所有运行需要的文件就够了

5.运行map仿真例子

输入指令sumo-gui map.sumo.cfg

设置延时,可以设置在100到200之间,观察效果比较好

点后点击开始按钮,就可以观察仿真效果了,放大可以看到随机运动的车辆

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

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

相关文章

stl vector 函数_vector :: crbegin()函数,以及C ++ STL中的示例

stl vector 函数C vector :: crbegin()函数 (C vector::crbegin() function) vector::crbegin() is a library function of "vector" header, it is used to get the last element of a vector using const_reverse_iterator, it returns a const reverse iterator …

ReactNative学习笔记(二)Flex布局

flexDirection 决定主轴方向 column:垂直方向为主轴row:水平方向为主轴justifyContent 决定主轴元素排列方式 flex-startflex-endcenterspace-betweenspace-aroundalignItems 决定侧轴元素排列方向 flex-startflex-endcenterbaselinestretch

cad导出 dxf后中文不显示_CAD快速看图 for Mac

CAD快速看图 for Mac是一款非常小巧、快速、方便的DWG看图工具,CAD快速看图 Mac版可脱离AutoCAD最快速、最方便浏览DWG和DXF图纸,支持二维或三维图纸,支持高清、多文件和云字体,非常实用的一款CAD看图软件,CAD快速看图…

scala运算符_Scala的所有符号运算符是什么意思?

scala运算符Scala的符号运算符 (Scalas symbolic operators) The symbolic operators in Scala are symbols that have a specific task that they perform when called in a Scala program. Scala library defines a lot of symbols that can be used while programming in Sc…

关于java.util.ConcurrentModificationException和remove倒数第二个元素

2019独角兽企业重金招聘Python工程师标准>>> 首先是两段代码的执行结果&#xff1a; 代码一&#xff1a; public class TestListRemove {public static void main(String[] args) {List<Integer> list new ArrayList<Integer>();list.add(1);list.add(…

linux 操作mysql 数据库命令_Linux 操作数据库命令

一、连接数据库格式&#xff1a; mysql -h主机地址 -u用户名 &#xff0d;p用户密码mysql -hlocalhost -uroot -p123注&#xff1a;-h,-u,-p 后面不加空格&#xff0c;进入数据库操作后每个命令结尾都需加“&#xff1b;(分号)”二、退出MYSQL命令exit (回车)三、显示所有数据库…

fragment和Activity同时操作UI引起的延迟、卡顿

最近项目中遇到一个问题&#xff0c;app首页的Activity中由若干个Fragment页面组成&#xff0c;其中一个fragment页面是由一个GridView和ListView组成的列表&#xff0c;如果列表中数据量过大的时候&#xff0c;在请求数据的时候点击页面上的其他按钮会无响应&#xff0c;直到该…

怎么删除mysql的压缩包_压缩包版mysql怎么卸载

MySQL是一个小巧玲珑但功能强大的数据库&#xff0c;目前十分流行。但是官网给出的安装包有两种格式&#xff0c;一个是msi格式&#xff0c;一个是zip格式的。那么压缩版mysql要怎么卸载&#xff1f;下面本篇文章就来大家介绍一下&#xff0c;希望对你们有所帮助。卸载压缩包版…

obj.val 非数组_在Ruby中使用Array.new(size,obj)创建数组

obj.val 非数组In the previous article, we have learnt how we can declare an Array class instance with the help of Array.[](*args) method? You can also notice that in the program codes written to demonstrate all those methods are having Array instances dec…

julia在mac环境变量_在Julia中找到值/变量的类型

julia在mac环境变量To find the type of a variable/value, we use the typeof() function – it accepts a parameter whose type to be found and returns its data type. 为了找到变量/值的类型&#xff0c;我们使用typeof()函数-它接受要查找其类型的参数并返回其数据类型。…

lambda表达式之进化

前言在C#我们可以自定义委托&#xff0c;但是C#为什么还要内置泛型委托呢&#xff1f;因为我们常常要使用委托&#xff0c;如果系统内置了一些你可能会用到的委托&#xff0c;那么就省去了定义委托&#xff0c;然后实例化委托的步骤&#xff0c;这样一来既使代码看起来简洁而干…

mysql返回行数_如何计算MySQL查询返回的行数?

How can I count the number of rows that a MySQL query returned?解决方案Getting total rows in a query result...You could just iterate the result and count them. You dont say what language or client library you are using, but the API does provide a mysql_nu…

md5不是对称密码算法_密码学中的消息摘要算法5(MD5)

md5不是对称密码算法In cryptography, MD5 (Message-Digest algorithm 5) is a mainly used cryptographic hash function with a 128-bit hash value. As we use in an Internet standard (RFC 1321), MD5 has been employed or developed in a more variety of security appl…

Windows 7 SID 修改

在安裝Windows系統時會產生一個獨一無二的SID (Security ID)&#xff0c;它用來識別每一部主機&#xff0c;若在同一個區域網路內有兩部相同SID的主機&#xff0c;會出現警告訊息。一般而言&#xff0c;每次安裝時的SID不可能會發生重複&#xff0c;但若是使用TrueImage或Ghost…

discuz mysql 类_discuz7 phpMysql操作类

MySql数据库连接类&#xff0c;大家可以看下网上老手们用的什么方法&#xff0c;大家可以直接拿来用&#xff0c;但前提是大家能熟练的掌握的基础上&#xff0c;这样才能有所进步。/** MySql数据库连接类* mysql.class.php 2009.04.15 by Hackbaby*/class dbstuff {var $versio…

1 并发模型

并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。不同的并发模型采用不同的方式拆分作业&#xff0c;同时线程间的协作和交互方式也不相同。这篇并发模型教程将会较深入地介绍目前&#xff08;2015年&#xff0c;本文…

Java String compareTo()方法与示例

字符串compareTo()方法 (String compareTo() Method) compareTo() is a String method in Java and it is used to compare two strings (case-sensitive). compareTo()是Java中的String方法&#xff0c;用于比较两个字符串(区分大小写)。 If both strings are equal – it r…

nginx mysql 查询系统_nginx/mysql查看内存占用

查看每个php-fpm平均占用系统内存,也适用看nginx/mysqld等,把php-fpm换成mysqldps --no-headers -o "rss,cmd" -C php-fpm | awk { sum$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }查看占用内存[rootcentos69 ~]# ps -ylC php-fpm --sort:r…

linux用户及权限详解(20170425)

计算机资源权限用户用户&#xff0c;容器&#xff0c;关联权限&#xff1a;用户组&#xff0c;方便的指派权限用户&#xff1a;标示符用户组&#xff1a;标示符r 、w、x&#xff1a;1、2、4对于文件r:可读&#xff0c;可以使用类似cat等命令查看文件内容w&#xff1a;可写&…

kotlin 判断数字_Kotlin程序检查数字是否为质数

kotlin 判断数字A prime number is a natural number that is greater than 1 and cannot be formed by multiplying two smaller natural numbers. 质数是大于1的自然数&#xff0c;不能通过将两个较小的自然数相乘而形成。 Given a number num, we have to check whether nu…