ns3车联网场景设置切换算法时遇到Mapping for remoteCellId = 2 is already known问题。

在尝试在NS3已有场景代码lena-dual-stripe.cc基础上更改得到车联网V2I场景时,设置切换算法代码如下:

      //lteHelper->SetHandoverAlgorithmType ("ns3::NoOpHandoverAlgorithm");
      lteHelper->SetHandoverAlgorithmType ("ns3::A2A4RsrqHandoverAlgorithm");
      //lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
      lteHelper->SetHandoverAlgorithmAttribute ("ServingCellThreshold",
                                            UintegerValue (30));
      lteHelper->SetHandoverAlgorithmAttribute ("NeighbourCellOffset",
                                            UintegerValue (1));
  if (epc)
    {
      // this enables handover for macro eNBs
      lteHelper->AddX2Interface (macroEnbs);
      lteHelper->AddX2Interface (cellEnbs);
    }

在单给macroEnbs添加x2接口时能够正确切换,其结果如下
图片说明

可以正常进行切换。
但在加入了小基站的x2接口后便会报错:图片说明

assert failed. cond="m_x2InterfaceSockets.find (remoteCellId) == m_x2InterfaceSockets.end ()", msg="Mapping for remoteCellId = 2 is already known", file=../src/lte/model/epc-x2.cc, line=156

分析大概是cellID的问题,但是不知道怎么设置改正,求大神指导!

下面是小基站配置的代码:

  Ptr<ListPositionAllocator> enbPositionAlloc = CreateObject<ListPositionAllocator> ();

        enbPositionAlloc->Add (Vector (150, 80, 0));
        enbPositionAlloc->Add (Vector (200, 120, 0));
        enbPositionAlloc->Add (Vector (250, 80, 0));
        enbPositionAlloc->Add (Vector (300, 120, 0));
        enbPositionAlloc->Add (Vector (350, 80, 0));
        enbPositionAlloc->Add (Vector (400, 120, 0));
        enbPositionAlloc->Add (Vector (450, 80, 0));
        enbPositionAlloc->Add (Vector (500, 120, 0));
        enbPositionAlloc->Add (Vector (550, 80, 0));
        enbPositionAlloc->Add (Vector (600, 120, 0));
        enbPositionAlloc->Add (Vector (450, 160, 0));
        enbPositionAlloc->Add (Vector (550, 160, 0));
        enbPositionAlloc->Add (Vector (500, 200, 0));
        enbPositionAlloc->Add (Vector (600, 200, 0));
        enbPositionAlloc->Add (Vector (550, 240, 0));
        enbPositionAlloc->Add (Vector (650, 240, 0));
        enbPositionAlloc->Add (Vector (650, 80, 0));
        enbPositionAlloc->Add (Vector (700, 120, 0));
        //enbPositionAlloc->Add (Vector (0, 40, 0));
        //enbPositionAlloc->Add (Vector (50, 0, 0));
        /*enbPositionAlloc->Add (Vector (450, 480, 0));
        enbPositionAlloc->Add (Vector (550, 480, 0));
        enbPositionAlloc->Add (Vector (360, 195, 0));
        enbPositionAlloc->Add (Vector (440, 195, 0));
        enbPositionAlloc->Add (Vector (100, 305, 0));
        enbPositionAlloc->Add (Vector (300, 305, 0));
        enbPositionAlloc->Add (Vector (60, 370, 0));
        enbPositionAlloc->Add (Vector (140, 370, 0));
        enbPositionAlloc->Add (Vector (260, 370, 0));
        enbPositionAlloc->Add (Vector (340, 370, 0));*/
  mobility.SetPositionAllocator (enbPositionAlloc);
  mobility.Install (smallEnbs);
  BuildingsHelper::Install(smallEnbs);
  Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (smallEnbTxPowerDbm));
  lteHelper->SetEnbAntennaModelType ("ns3::IsotropicAntennaModel");
  lteHelper->SetEnbDeviceAttribute ("DlEarfcn", UintegerValue (smallEnbDlEarfcn));
  lteHelper->SetEnbDeviceAttribute ("UlEarfcn", UintegerValue (smallEnbDlEarfcn + 18000));
  lteHelper->SetEnbDeviceAttribute ("DlBandwidth", UintegerValue (smallEnbBandwidth));
  lteHelper->SetEnbDeviceAttribute ("UlBandwidth", UintegerValue (smallEnbBandwidth));
  lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (1));
  lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (true));

  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
  lteHelper->SetSpectrumChannelType ("ns3::MultiModelSpectrumChannel");
  lteHelper->SetFfrAlgorithmType ("ns3::LteFrHardAlgorithm");

  NetDeviceContainer smallEnbDevs  = lteHelper->InstallEnbDevice (smallEnbs);

看下配置文件里面有没有设置id的地方,一个id只能有一个实例。你同时安装2个一样的就报错。或者把之前的先删除

大佬,怎么联系你,我也想做车联网切换算法的仿真,但不会用ns3