如何在Veins中获取SUMO中非联网车辆的自定义信息?
获取SUMO中非联网车辆自定义信息的方法(Veins+OMNeT++场景)
以下是几种可行的解决方案:
1. 扩展Veins的TraCIScenarioManager直接调用TRACI接口
Veins本身封装了SUMO的TRACI客户端,你可以修改TraCIScenarioManager的代码,在仿真周期内主动拉取所有车辆数据并筛选非联网车辆:
- 在仿真的每一步(比如
handleSelfMessage或updateVehicleStates方法中),调用TRACI的vehicle.getIDList()获取SUMO中所有车辆ID - 对比Veins管理的联网车辆ID(可通过
getManagedVehicles()方法获取映射表),过滤出非联网车辆 - 调用TRACI的各类查询方法(如
vehicle.getPosition()、vehicle.getSpeed()、vehicle.getRoute()等)获取自定义数据,再将这些数据存储或传递给OMNeT++中的业务模块处理
示例代码片段:
// 在TraCIScenarioManager的仿真步处理逻辑中添加 std::vector<std::string> allSumoVehicles = traci->vehicle.getIDList(); const std::map<std::string, Veins::TraCIMobility*>& connectedVehicles = getManagedVehicles(); for (const auto& vehId : allSumoVehicles) { if (connectedVehicles.find(vehId) == connectedVehicles.end()) { // 处理非联网车辆数据 Veins::TraCIPosition pos = traci->vehicle.getPosition(vehId); double currentSpeed = traci->vehicle.getSpeed(vehId); // 这里可以将数据发送给OMNeT++模块或写入日志 } }
2. 用traci-launchd搭配独立TRACI客户端进程
启动SUMO时使用traci-launchd服务,让Veins和一个独立的Python TRACI客户端同时连接到同一个SUMO实例:
- 启动命令示例:
traci-launchd -p 1234,然后在Veins的omnetpp.ini中设置*.manager.host = "localhost"和*.manager.port = 1234 - 编写Python TRACI客户端,连接到同一个端口,自由获取所有车辆(包括非联网)的自定义信息
- 通过本地socket或共享内存等IPC机制,将Python获取的数据同步到OMNeT++模块,注意要保证仿真步的同步,避免数据时序错误
3. 自定义SUMO输出并实时解析
如果不想修改Veins核心代码,可以通过SUMO的配置文件生成定制化输出,再在OMNeT++中解析:
- 在SUMO的
.sumocfg文件中,利用additional标签定义自定义输出,或给fcd-output添加过滤规则,只输出非联网车辆数据(前提是你给非联网车辆标记了特定的vehicle class) - 示例配置:
<output> <fcd-output value="non_connected_fcd.xml" filter="vehicle.hasClass('non-connected')"/> </output>
- 在OMNeT++中添加一个独立模块,实时读取SUMO生成的输出文件,解析XML内容后提取所需的自定义信息
内容的提问来源于stack exchange,提问作者netbug
相关产品推荐
相关产品推荐

