将 VeinsInetCar 转换为 RSU 时出错

问题描述

我尝试通过将移动性更改为固定移动性来使用 VeinsInetCar 模块作为 rsu

# VeinsInetmobility
*.node[*].mobility.typename = "VeinsInetmobility"
*.wifirsu.mobility.typename = "Stationarymobility"

我为车辆使用了 VeinsInetSampleApplication,并为 rsu 稍微更改了它。创建了一个新的 VeinsInetApplicationBase 并删除了traci 和mobility 部分。

void VeinsInetApplicationBase::handleStartOperation(LifecycleOperation* operation)
{
    mobility = veins::VeinsInetmobilityAccess().get(getParentModule());
    traci = mobility->getCommandInterface();
    traciVehicle = mobility->getVehicleCommandInterface();

    L3AddressResolver().tryResolve("224.0.0.1",destAddress);
    ASSERT(!destAddress.isUnspecified());

然后移除与traci相关的变量并将其替换为RSU的veinesInetSampleApplication中的虚拟变量。现在,当我尝试运行模拟时,它会导致此错误

check_and_cast(): Cannot cast (inet::physicallayer::Ieee80211ScalarTransmission*) to type 'const inet::physicallayer::DimensionalTransmission *' -- in module (inet::physicallayer::Ieee80211Radio) Scenario.node[0].wlan[0].radio 

此运行时错误是在模拟过程中引起的。什么原因导致这个错误

解决方法

我的猜测是您为名为 node[*] 的节点配置了一组参数,为名为 wifirsu 的节点配置了另一组参数。可能您的 .ini 文件主要列出名为 node[*] 的节点的参数,并将许多参数保留为名为 wifirsu 的节点的默认值。这可能会导致您的模拟对一种类型的节点使用“标量”无线电,而对其他类型的节点使用“维度”无线电,这会导致您显示的错误消息。