如何获得VEINS中每辆车的坐标?

时间:2018-04-17 11:18:04

标签: omnet++ veins sumo

我正在使用Veins 4.6,Sumo 0.25和Omnet ++ 5.2。我需要在给定时间获得两辆车(节点)的坐标,以计算它们之间的距离。

我试图修改函数handlePositionUpdate()中的TraCIDemo11p.cc文件。问题是当veh0返回其坐标的同时,veh1发送的坐标非常小。

如何在给定时间获取两辆车的位置并找出它们之间的距离?

void TraCIDemo11p :: handlePositionUpdate(cObject* obj) {

    BaseWaveApplLayer::handlePositionUpdate(obj);

    // Get vehicle ID
    std::string vehID = mobility->getExternalId().c_str();

    // Get coordinates of first vehicle
    if (vehID == "veh0"){
        firstVehX = mobility->getCurrentPosition().x;
        firstVehY = mobility->getCurrentPosition().y;
        firstVehZ = mobility->getCurrentPosition().z;
        calculateDistance(vehID, firstVehX, firstVehY,firstVehZ);
    }   

    //Get coordinates of second vehicle
    if (vehID == "veh1"){
        secondVehX = mobility->getCurrentPosition().x;
        secondVehY = mobility->getCurrentPosition().y;
        secondVehZ = mobility->getCurrentPosition().z;

        calculateDistance(vehID, secondVehX, secondVehY, secondVehZ);

    }
}

2 个答案:

答案 0 :(得分:3)

据我了解,您想要计算此代码运行的车辆到其他车辆的距离。但是,我不确定这辆车是什么。例如是firstVeh吗?

如果是这种情况,使用此代码就无法达到您想要的效果(正如您已经想到的那样)。此代码在模拟中的每辆车上运行,但独立于所有其他车辆。因此,mobility仅指向此代码正在运行的当前车辆的移动模块。因此,mobility->getCurrentPosition()始终只为您提供此车辆的位置。

例如,要计算到firstVeh的距离,您需要其坐标。但是,通常情况下,您不了解模拟中任意其他车辆的任何信息,除非您收到包含其位置的信息(参见Calculating distance between cars nodes VEINS)。

如果你真的需要计算与其他任意车辆(即不是上述信息发送者)的距离,你可以从TraCIScenarioManager获得指向该车辆的指针(见How to get count of cars in specific range )。然而,这在我看来是不好的做法,因为实际上你不会知道场景中的任何其他汽车,除了消息的某些发件人之外。

答案 1 :(得分:-2)

在sink节点上,您可以获取模拟中所有模块的列表,访问它们的坐标,然后使用TraCIDemo11p.cc的handlePositionUpdate方法中的以下片段找到它们之间的距离:

//Get current position of the node which is going to send message
Coord senderPosition = mobility->getCurrentPosition();

//Get all available nodes in simulation
std::map<std::string, cModule*> availableCars = mobility->getManager()->getManagedHosts();

//Iterate through collection and find distance,
std::map<std::string, cModule*>::iterator it;

for(it = availableCars.begin(); it != availableCars.end(); it++)
{
    TraCIMobility* mobility1 = TraCIMobilityAccess().get(it->second);
    Coord receiverPosition = mobility1->getCurrentPosition();

    //returns distance in meters
    senderPosition.distance(receiverPosition)
}

参考:How to get count of cars in specific range