我正在使用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);
}
}
答案 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)
}