如何在 Veins-5.0 中修复 RSU(1000m)和 Vehicles(300m)的传输范围?
How to fix the transmission range of RSU (1000m) and Vehicles(300m) in Veins-5.0?
从已经存在的堆栈溢出讨论中,我知道传输范围与旧版本静脉中的功率、噪声和灵敏度有关。
我的问题是
在最新版本的 Veins 5.1 中,RSU 和 Veins 都考虑了全局传输范围。我怎样才能使它具体?就像我想为 txPower1 =20mW 和
指定 RSU 到 1000m 的范围
txPower2 300m 的车辆 =15.5mW
*.connectionManager.maxInterfDist = 1000m \为 RSU 添加
*.connectionManager.maxInterfDist节点 = 300m \为车辆添加
检查了连接 manger.cc 中的 maxInterfDist。默认情况下,RSU 和车辆的 maxInterfDist 都会考虑最大范围。
同样在 BaseConnectionManger.cc 文件中,使用了 maxInterfDist。
我是否需要为 return 距离 (maxInterDistfNodes) 的车辆添加另一种方法,因此使用 Omnet.ini 文件中的另一个参数来定义功率和灵敏度?如果是这样,请指导我在哪里进行更改以及如何进行更改?
.omnet.ini
*.connectionManager.maxInterfDist = 1000m
*.connectionManager.maxInterfDistNodes = 300m
*.**.nic.mac1609_4.txPower = 20mW
基础连接Manager.cc
'''BaseConnectionManager::isInRange(BaseConnectionManager::NicEntries::mapped_type pFromNic, BaseConnectionManager::NicEntries::mapped_type pToNic)
{
double dDistance = 0.0;
if(useTorus)
{
dDistance = sqrTorusDist(pFromNic->pos, pToNic->pos, *playgroundSize);
}
else
{
dDistance = pFromNic->pos.sqrdist(pToNic->pos);
}
return (dDistance <= maxDistSquared);
}'''
连接Manager.cc
'''double ConnectionManager::calcInterfDist()
{
if (hasPar("maxInterfDist"))
{
double interfDistance = par("maxInterfDist").doubleValue();
ccEV << "max interference distance:" << interfDistance << endl;
return interfDistance;
}
else
{
throw cRuntimeError("ConnectionManager: No value for maximum
interference distance (maxInterfDist) provided.");
}
}'''
我按照上面的 link 进行了添加,但它显示 mac 无法这样定义的错误。
可能是我的问题看起来很傻,但我需要指导。请帮忙。
非常感谢
看来您要根据节点的种类(RSU 或 Car 模块)设置两个传输范围。
也许有一种“复杂”的方法可以通过定义两个参数(即:maxInterfDistNodes 和 maxInterfDist 分别用于汽车和 RSU),但我可能会考虑在 initialize() 部分执行此操作,即执行以下操作:
- 在 RSU 和 Car 场景文件(traci 文件夹文件)中实例化 mac 模块。
- 在第一阶段(=0),尝试不同地调整txPower(根据文件,如果是RSU或Car)。
- 不要忘记在.ini文件中的connectionmanager模块中设置传输上限(因为RSU传输范围是最大的,你也应该将其设置为connectionmanager)
- 即使您看到车辆传输的数据超过您在其 initialize() 函数中定义的数据,这也不是问题,因为实际上,数据包不会被远超过您定义的数据的模块接收(超过300m),只是图解。
如有误会,请告诉我们。
此致,
根据建议,这可能是正确答案。请看一下。
PhysicalControlMsg_m.h
class VEINS_API PhyControlMessage : public ::omnetpp::cMessage
{
protected:
double txPowerNodes_mW; //added
public:
virtual double getTxPowerNodes_mW() const; //added
virtual void setTxPowerNodes_mW(double txPowerNodes_mW); //added
};
PhysicalControlMsg_m.cc
//added
double PhyControlMessage::getTxPowerNodes_mW() const
{
return this->txPowerNodes_mW;
}
//added
void PhyControlMessage::setTxPowerNodes_mW(double txPowerNodes_mW)
{
this->txPowerNodes_mW = txPowerNodes_mW;
}
Mac1609_4.h
void setTxPowerNodes(double txPowerNodes_mW); //added
double txPowerNodes;
Mac1609_4.cc
void Mac1609_4::initialize(int stage)
{
BaseMacLayer::initialize(stage);
if (stage == 0) {
phy11p = FindModule<Mac80211pToPhy11pInterface*>::findSubModule(getParentModule());
ASSERT(phy11p);
// this is required to circumvent double precision issues with constants from CONST80211p.h
ASSERT(simTime().getScaleExp() == -12);
txPower = par("txPower").doubleValue();
txPowerNodes = par("txPowerNodes").doubleValue(); //added
}
void Mac1609_4::handleSelfMsg(cMessage* msg)
{
if (controlInfo) {
// if MCS is not specified, just use the default one
MCS explicitMcs = static_cast<MCS>(controlInfo->getMcs());
if (explicitMcs != MCS::undefined) {
usedMcs = explicitMcs;
}
// apply the same principle to tx power
txPower_mW = controlInfo->getTxPower_mW();
if (txPower_mW < 0) {
txPower_mW = txPower;
}
// apply the same principle to tx power nodes
//added
txPowerNodes_mW = controlInfo->getTxPowerNodes_mW();
if (txPowerNodes_mW < 0) {
txPowerNodes_mW = txPowerNodes;
}
}
else {
txPowerNodes_mW = txPowerNodes;
txPower_mW = txPower;
}
}
Mac1609_4.ned
//tx power Nodes [mW]
double txPowerNodes @unit(mW); //added
ConnectionManager.cc
double ConnectionManager::calcInterfDist()
{
if (hasPar("maxInterfDist")) {
double interfDistance = par("maxInterfDist").doubleValue();
EV_INFO << "max interference distance:" << interfDistance << endl;
return interfDistance;
}
if (hasPar("maxInterfDistNodes")){
double interfDistanceNodes = par("maxInterfDistNodes").doubleValue();
EV_INFO << "max interference distance between Nodes:" << interfDistanceNodes << endl;
return interfDistanceNodes;
}
else {
throw cRuntimeError("ConnectionManager: No value for maximum interference distance (maxInterfDist) provided.");
}
}
omnet.ini
*.connectionManager.sendDirect = true
*.connectionManager.maxInterfDist = 1000m
*.connectionManager.maxInterfDistNodes = 300m
*.connectionManager.drawMaxIntfDist = false
*.**.nic.mac1609_4.useServiceChannel = false
*.**.nic.mac1609_4.txPower = 20mW
*.**.nic.mac1609_4.txPowerNodes = 15.5mW #added
它适用于我的情况。我认为这是正确的做法。感谢您的指导。这真的意义重大。
恭喜您完成编辑,您已经习惯使用 veins&omnet++ 的基础知识。
遗憾的是我现在不能测试它,因为我正在我的其他操作系统中设置模拟,但我可以根据我的经验讨论并给出一些评论:
- 我看到你所有的通信都使用一个传输范围,对吗? (即 RSU 为 1000m,汽车为 300m)如果是这种情况,那么任务将更容易,因为您需要为每个模块(node/rsu)创建定义一次传输功率(我将在下面给出位置)。
- 您正在正确使用 get 和 set 方法,但我认为您可以只处理常规(已部署)txPower_mW 字段。您可以稍后(并且取决于模块的类型=RSU/Car)在初始化期间仅设置一次txPower_mW。
- 如您所知,我们有时可能会被模拟欺骗,即使一切看起来都正常工作,但可能存在一些技术错误(至于使用的 tx_power 与真正含义之间的匹配在覆盖范围方面,还需要通过改变节点之间的距离进行一些测试(例如 20mW 和 155mW)。
- 不知道为什么,我觉得修改connectionmanager模块不太明智。还有,从那个模块的工作原理来看,你只能有一个interfDistance 也就是:用来计算收到包的几率 因为connectionmanager模块不区分传输基于发送者的类型,从而平等地评估它们。 (并且仍然尊重每个节点的 tx_power)
我建议如下:(它们可能包含错误,因为它们未经测试)
- 找到每个节点(RSU/Car)对应的mac1609_4。我不知道您使用的是什么文件,但等效于 (TraCITestApp.cc+h) 用于 Cars 和 (TraCIDemoRSU11p.cc+h) 用于 RSU。当然,这是通过将其添加到相应文件的 initialize() 中来完成的:
1- 在 Car+RSU 文件的“.h”中:
#include "veins/base/utils/FindModule.h"//added
#include "veins/modules/mac/ieee80211p/Mac1609_4.h"//added
和
Mac1609_4* mac;//added
2- 在 Car+RSU 文件的“.cc”中,在它们的 "initialize()" 中,更准确地说是在它们的 "if(stage==0)" 中添加:
mac = FindModule<Mac1609_4*>::findSubModule(getParentModule());//added
3- 您刚才必须在步骤“2-”指令之后添加以下内容:
mac->setTxPower(/*what corresponds the needed transmission power for the node type*/);
而且我仍然建议不要更改其他文件,因为这是 良好的习惯,尤其是对于新的 languages/platforms/etc。 (至少对我来说是这样,因为我认为自己的血管还不够老)。因此:您可以 return 将 connectionmanager 恢复到其初始状态(您可以在继续工作之前备份整个 src 文件夹)
再一次:我的长篇文字只是为了给你我的想法和一些对我有用的技巧(对目标只做了一些修改)我们总是通过经验来提高我们的能力,就像你完美地解决这个问题一样您上面的代码有问题。
祝你好运:)
从已经存在的堆栈溢出讨论中,我知道传输范围与旧版本静脉中的功率、噪声和灵敏度有关。
我的问题是 在最新版本的 Veins 5.1 中,RSU 和 Veins 都考虑了全局传输范围。我怎样才能使它具体?就像我想为 txPower1 =20mW 和
指定 RSU 到 1000m 的范围txPower2 300m 的车辆 =15.5mW
*.connectionManager.maxInterfDist = 1000m \为 RSU 添加 *.connectionManager.maxInterfDist节点 = 300m \为车辆添加
检查了连接 manger.cc 中的 maxInterfDist。默认情况下,RSU 和车辆的 maxInterfDist 都会考虑最大范围。
同样在 BaseConnectionManger.cc 文件中,使用了 maxInterfDist。
我是否需要为 return 距离 (maxInterDistfNodes) 的车辆添加另一种方法,因此使用 Omnet.ini 文件中的另一个参数来定义功率和灵敏度?如果是这样,请指导我在哪里进行更改以及如何进行更改?
.omnet.ini
*.connectionManager.maxInterfDist = 1000m
*.connectionManager.maxInterfDistNodes = 300m
*.**.nic.mac1609_4.txPower = 20mW
基础连接Manager.cc
'''BaseConnectionManager::isInRange(BaseConnectionManager::NicEntries::mapped_type pFromNic, BaseConnectionManager::NicEntries::mapped_type pToNic)
{
double dDistance = 0.0;
if(useTorus)
{
dDistance = sqrTorusDist(pFromNic->pos, pToNic->pos, *playgroundSize);
}
else
{
dDistance = pFromNic->pos.sqrdist(pToNic->pos);
}
return (dDistance <= maxDistSquared);
}'''
连接Manager.cc
'''double ConnectionManager::calcInterfDist()
{
if (hasPar("maxInterfDist"))
{
double interfDistance = par("maxInterfDist").doubleValue();
ccEV << "max interference distance:" << interfDistance << endl;
return interfDistance;
}
else
{
throw cRuntimeError("ConnectionManager: No value for maximum
interference distance (maxInterfDist) provided.");
}
}'''
我按照上面的 link 进行了添加,但它显示 mac 无法这样定义的错误。
可能是我的问题看起来很傻,但我需要指导。请帮忙。
非常感谢
看来您要根据节点的种类(RSU 或 Car 模块)设置两个传输范围。
也许有一种“复杂”的方法可以通过定义两个参数(即:maxInterfDistNodes 和 maxInterfDist 分别用于汽车和 RSU),但我可能会考虑在 initialize() 部分执行此操作,即执行以下操作:
- 在 RSU 和 Car 场景文件(traci 文件夹文件)中实例化 mac 模块。
- 在第一阶段(=0),尝试不同地调整txPower(根据文件,如果是RSU或Car)。
- 不要忘记在.ini文件中的connectionmanager模块中设置传输上限(因为RSU传输范围是最大的,你也应该将其设置为connectionmanager)
- 即使您看到车辆传输的数据超过您在其 initialize() 函数中定义的数据,这也不是问题,因为实际上,数据包不会被远超过您定义的数据的模块接收(超过300m),只是图解。
如有误会,请告诉我们。
此致,
根据建议,这可能是正确答案。请看一下。
PhysicalControlMsg_m.h
class VEINS_API PhyControlMessage : public ::omnetpp::cMessage
{
protected:
double txPowerNodes_mW; //added
public:
virtual double getTxPowerNodes_mW() const; //added
virtual void setTxPowerNodes_mW(double txPowerNodes_mW); //added
};
PhysicalControlMsg_m.cc
//added
double PhyControlMessage::getTxPowerNodes_mW() const
{
return this->txPowerNodes_mW;
}
//added
void PhyControlMessage::setTxPowerNodes_mW(double txPowerNodes_mW)
{
this->txPowerNodes_mW = txPowerNodes_mW;
}
Mac1609_4.h
void setTxPowerNodes(double txPowerNodes_mW); //added
double txPowerNodes;
Mac1609_4.cc
void Mac1609_4::initialize(int stage)
{
BaseMacLayer::initialize(stage);
if (stage == 0) {
phy11p = FindModule<Mac80211pToPhy11pInterface*>::findSubModule(getParentModule());
ASSERT(phy11p);
// this is required to circumvent double precision issues with constants from CONST80211p.h
ASSERT(simTime().getScaleExp() == -12);
txPower = par("txPower").doubleValue();
txPowerNodes = par("txPowerNodes").doubleValue(); //added
}
void Mac1609_4::handleSelfMsg(cMessage* msg)
{
if (controlInfo) {
// if MCS is not specified, just use the default one
MCS explicitMcs = static_cast<MCS>(controlInfo->getMcs());
if (explicitMcs != MCS::undefined) {
usedMcs = explicitMcs;
}
// apply the same principle to tx power
txPower_mW = controlInfo->getTxPower_mW();
if (txPower_mW < 0) {
txPower_mW = txPower;
}
// apply the same principle to tx power nodes
//added
txPowerNodes_mW = controlInfo->getTxPowerNodes_mW();
if (txPowerNodes_mW < 0) {
txPowerNodes_mW = txPowerNodes;
}
}
else {
txPowerNodes_mW = txPowerNodes;
txPower_mW = txPower;
}
}
Mac1609_4.ned
//tx power Nodes [mW]
double txPowerNodes @unit(mW); //added
ConnectionManager.cc
double ConnectionManager::calcInterfDist()
{
if (hasPar("maxInterfDist")) {
double interfDistance = par("maxInterfDist").doubleValue();
EV_INFO << "max interference distance:" << interfDistance << endl;
return interfDistance;
}
if (hasPar("maxInterfDistNodes")){
double interfDistanceNodes = par("maxInterfDistNodes").doubleValue();
EV_INFO << "max interference distance between Nodes:" << interfDistanceNodes << endl;
return interfDistanceNodes;
}
else {
throw cRuntimeError("ConnectionManager: No value for maximum interference distance (maxInterfDist) provided.");
}
}
omnet.ini
*.connectionManager.sendDirect = true
*.connectionManager.maxInterfDist = 1000m
*.connectionManager.maxInterfDistNodes = 300m
*.connectionManager.drawMaxIntfDist = false
*.**.nic.mac1609_4.useServiceChannel = false
*.**.nic.mac1609_4.txPower = 20mW
*.**.nic.mac1609_4.txPowerNodes = 15.5mW #added
它适用于我的情况。我认为这是正确的做法。感谢您的指导。这真的意义重大。
恭喜您完成编辑,您已经习惯使用 veins&omnet++ 的基础知识。 遗憾的是我现在不能测试它,因为我正在我的其他操作系统中设置模拟,但我可以根据我的经验讨论并给出一些评论:
- 我看到你所有的通信都使用一个传输范围,对吗? (即 RSU 为 1000m,汽车为 300m)如果是这种情况,那么任务将更容易,因为您需要为每个模块(node/rsu)创建定义一次传输功率(我将在下面给出位置)。
- 您正在正确使用 get 和 set 方法,但我认为您可以只处理常规(已部署)txPower_mW 字段。您可以稍后(并且取决于模块的类型=RSU/Car)在初始化期间仅设置一次txPower_mW。
- 如您所知,我们有时可能会被模拟欺骗,即使一切看起来都正常工作,但可能存在一些技术错误(至于使用的 tx_power 与真正含义之间的匹配在覆盖范围方面,还需要通过改变节点之间的距离进行一些测试(例如 20mW 和 155mW)。
- 不知道为什么,我觉得修改connectionmanager模块不太明智。还有,从那个模块的工作原理来看,你只能有一个interfDistance 也就是:用来计算收到包的几率 因为connectionmanager模块不区分传输基于发送者的类型,从而平等地评估它们。 (并且仍然尊重每个节点的 tx_power)
我建议如下:(它们可能包含错误,因为它们未经测试)
- 找到每个节点(RSU/Car)对应的mac1609_4。我不知道您使用的是什么文件,但等效于 (TraCITestApp.cc+h) 用于 Cars 和 (TraCIDemoRSU11p.cc+h) 用于 RSU。当然,这是通过将其添加到相应文件的 initialize() 中来完成的:
1- 在 Car+RSU 文件的“.h”中:
#include "veins/base/utils/FindModule.h"//added
#include "veins/modules/mac/ieee80211p/Mac1609_4.h"//added
和
Mac1609_4* mac;//added
2- 在 Car+RSU 文件的“.cc”中,在它们的 "initialize()" 中,更准确地说是在它们的 "if(stage==0)" 中添加:
mac = FindModule<Mac1609_4*>::findSubModule(getParentModule());//added
3- 您刚才必须在步骤“2-”指令之后添加以下内容:
mac->setTxPower(/*what corresponds the needed transmission power for the node type*/);
而且我仍然建议不要更改其他文件,因为这是 良好的习惯,尤其是对于新的 languages/platforms/etc。 (至少对我来说是这样,因为我认为自己的血管还不够老)。因此:您可以 return 将 connectionmanager 恢复到其初始状态(您可以在继续工作之前备份整个 src 文件夹)
再一次:我的长篇文字只是为了给你我的想法和一些对我有用的技巧(对目标只做了一些修改)我们总是通过经验来提高我们的能力,就像你完美地解决这个问题一样您上面的代码有问题。
祝你好运:)