You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VEINS脚本中为车辆与卡车固定车道ID?

实现VEINS中指定数量的卡车与普通车辆固定车道分配

核心思路

通过全局计数变量追踪已生成的车辆类型数量,结合TraCI接口强制分配车道,并锁定车辆换道行为,确保车辆保持在指定车道。


步骤1:添加全局计数变量

在自定义的车辆应用模块(如MyVeinsApp.h)中定义静态计数变量,用于统计已生成的卡车和普通车辆数量:

#include <omnetpp.h>
#include "veins/modules/mobility/traci/TraCIMobility.h"
#include "veins/modules/mobility/traci/TraCICommandInterface.h"

class MyVeinsApp : public cSimpleModule {
private:
    // 全局静态计数,跨所有车辆实例共享
    static int truckCount;
    static int carCount;
    Veins::TraCIMobility* mobility;
    Veins::TraCICommandInterface::Vehicle* traciVehicle;
public:
    virtual void initialize(int stage) override;
};

// 在.cpp文件中初始化静态变量
int MyVeinsApp::truckCount = 0;
int MyVeinsApp::carCount = 0;

步骤2:编写车道分配逻辑

在模块初始化方法中,根据车辆类型和计数结果分配车道(注意:TraCI中车道索引从0开始,对应实际路网的1号车道):

void MyVeinsApp::initialize(int stage) {
    if (stage == 0) {
        mobility = Veins::TraCIMobilityAccess().get(getParentModule());
        traciVehicle = mobility->getVehicleCommandInterface();
        
        // 获取车辆类型(可从OMNeT++配置或SUMO路由文件读取)
        std::string vehicleType = par("vehicleType").stdstringValue();

        if (vehicleType == "truck") {
            truckCount++;
            // 前20辆卡车分配到1号车道(TraCI索引0)
            if (truckCount <= 20) {
                traciVehicle->changeLane(0, 1000); // 1000为换道超时时间,确保完成换道
            } else {
                // 其余卡车分配到2号车道(TraCI索引1)
                traciVehicle->changeLane(1, 1000);
            }
        } else if (vehicleType == "car") {
            carCount++;
            // 前2辆普通车分配到2号车道(TraCI索引1)
            if (carCount <= 2) {
                traciVehicle->changeLane(1, 1000);
            } else {
                // 其余普通车分配到1号车道(TraCI索引0)
                traciVehicle->changeLane(0, 1000);
            }
        }

        // 锁定车道,禁止车辆自主换道
        traciVehicle->setLaneChangeMode(0);
    }
}

步骤3:配置车辆类型与生成数量

在OMNeT++的.ini配置文件中,指定各节点的车辆类型:

# 全局默认车辆类型为普通车
*.node[*].vehicleType = default("car")

# 前2个节点设为普通车(对应需求中的2辆特殊普通车)
*.node[0..1].vehicleType = "car"

# 接下来20个节点设为卡车(对应需求中的20辆特殊卡车)
*.node[2..21].vehicleType = "truck"

# 剩余节点可按需设置为普通车或卡车
*.node[22..*].vehicleType = "truck"

如果使用SUMO路由文件(rou.xml)生成车辆,可直接在路由文件中定义车辆类型,VEINS会自动读取:

<vType id="car" vClass="passenger"/>
<vType id="truck" vClass="truck"/>

<!-- 2辆需要在2号车道的普通车 -->
<vehicle id="car0" type="car" route="mainRoute" depart="0"/>
<vehicle id="car1" type="car" route="mainRoute" depart="1"/>

<!-- 20辆需要在1号车道的卡车 -->
<vehicle id="truck0" type="truck" route="mainRoute" depart="2"/>
<vehicle id="truck1" type="truck" route="mainRoute" depart="3"/>
...
<vehicle id="truck19" type="truck" route="mainRoute" depart="21"/>

注意事项

  • 确认SUMO路网的车道索引:若路网中车道编号与TraCI索引不一致,需调整changeLane的参数值。
  • 动态生成车辆时(如调用TraCI的addVehicle),需在生成后立即执行车道分配逻辑并更新计数。
  • 若需允许特定换道行为,可修改laneChangeMode参数(SUMO文档中定义了不同的换道模式掩码)。

内容的提问来源于stack exchange,提问作者Rose Rose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:38