关于SUMO里如何通过Python进行车流量控制

2 篇文章 1 订阅
1 篇文章 1 订阅

又称:怎么通过python读取SUMO里生成的lyy.rou.xml文件信息并对其进行修改和保存。
因为觉得每次仿真的时候,想去重新设置flow里的vehsPerHour数值都要打开路由文件进行修改数值,感觉非常麻烦,跑一次仿真之前要打开多个文件进行修改数据,很麻烦,就想都写在py文件里在一个地方进行修改,就可以节省一点步骤了。

不知道为什么,网上找的用python读取xml文件然后进行修改保存的教程,我跟着做,都失败了,而且感觉SUMO生成的这个路由文件的xml格式和常规的xml格式也有点区别。最后我在官网上按照官网的解释和例子跟着做,去理解,然后将其代替成我的这个路由文件来尝试,终于成功了。尝试了很多办法,终于成功了,记录一下。

  1. 首先,这是lyy.rou.xml文件的格式:
<?xml version="1.0" encoding="UTF-8"?>
<routes>

    <vType id="Car_straight" length="5" maxSpeed="33.33" />
    <vType id="Car_enter"    length="5" maxSpeed="33.33" />
   
    <flow id="a11" color="1,1,0"  begin="0" end= "7200" vehsPerHour='100' type="Car_straight" departLane="random" departSpeed="max">
        <route edges="E0 E1 E2"/>
    </flow>

   <flow id="a12" color="1,0,0"  begin="0" end= "7200" vehsPerHour='500' type="Car_enter" departLane="random" departSpeed="max">
        <route edges="E4 E1 E2"/>
    </flow>

</routes>

其中,flow列的vehsPerHour值是我想修改的数值。
根据xml格式来分析,从这个lyy.rou.xml内容来看,< routes>为这个xml文件的根(root),下一级的 vTypeflow都是 root下的 child。我想修改的是flowid="a11"这个列里面的vehsPerHour值。

  1. 开始编写代码:

(1)导入用到的库:

import xml.etree.ElementTree as ET

(2)对xml文件进行解析:

tree = ET.parse('D:\Temp\lyy.rou.xml')   ##这里的路径为放置路由文件的路径

(3)获取 root:

root = tree.getroot()
print(root.tag)
print(root.attrib)

打印结果如图:

在这里插入图片描述
(4)先查找一下原数据:

print('查找原数据')
print(root[2].attrib['vehsPerHour'])

注意这里,我想查找的是flowid="a11"这个列里面的vehsPerHour值。前面分析到 vTypeflow都是 root下的 child,因此id="a11"flow按顺序排第三,从0开始计数,即为[2]因此是root[2],从前面步骤(3)能看出, attrib输出的是 <>里面的内容,因此这里用到 attrib,要查找vehsPerHour的值,因此总的一个查找vehsPerHour值的代码语句即为root[2].attrib[‘vehsPerHour’]
打印结果如图:
在这里插入图片描述
(5)对vehsPerHour值修改成我想要的数值。

new_num='2000'
root[2].attrib['vehsPerHour']=str(new_num)
print('修改后的数据')
print(root[2].attrib['vehsPerHour'])

打印结果如图:
在这里插入图片描述
(6)最后将修改好的文件进行保存:

tree.write('lyy.rou.xml')   #如果文件命名为其他名字,即为保存到新建文件里,与源文件同名即为覆盖内容。

点击路径里的lyy.rou.xml文件查看是否对xml文件修改成功。
在这里插入图片描述

  1. 调试成功,可将这段代码放入控制sumo仿真的文件里,然后将需要修改的数值设置为全局变量放在一起,就可以节省点功夫一起修改啦。(想要控制修改其他的数据,以此类推)
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值