【问题标题】:How to calculate route using Veins如何使用 Veins 计算路线
【发布时间】:2021-02-13 22:05:50
【问题描述】:

我正在尝试创建一个函数来计算基于两个参数/道路(开始和结束)的路线。该函数应返回组成路线的边列表。

我知道相扑中存在 findRoute() 函数,但我认为它没有在 VEINS 中实现。我尝试实现它,但该功能对我不起作用。

下面是我的代码

std::string TraCICommandInterface::Vehicle::findRoute(std::string b, std::string e) {
    uint8_t variableId = CMD_SUBSCRIBE_ROUTE_CONTEXT;
    uint8_t variableType = TYPE_COMPOUND;
    uint8_t edgeIdT = TYPE_STRING;
    int32_t count = 3;
    std::string begin = b;
    std::string end = e;
    TraCIBuffer buf = connection->query(CMD_SET_VEHICLE_VARIABLE, TraCIBuffer() << variableId << nodeId << variableType << begin << end << "" << 1 << 0);
    ASSERT(buf.eof());
}

当我调用这个函数时,我得到一个错误。

traciVehicle->findRoute("167283892#2", "-439375716#1");

错误信息:

注1:关于路线,其实我想用相扑上实现的算法的选项,比如:dijkstra,astar等

有人可以帮帮我吗?

【问题讨论】:

  • 那么想要实现graph traversal 算法还是使用现有算法?另外,请在您的问题中包含任何错误消息。

标签: c++ veins sumo


【解决方案1】:

findRoute 不是 Vehicle 域中的命令,而是 Simulation 域中的命令,它需要五个参数,请参阅 https://sumo.dlr.de/docs/TraCI/Simulation_Value_Retrieval.html#command_0x86_find_route,因此您的代码应该看起来像这样(根据头脑编写,未经测试):

std::string TraCICommandInterface::Vehicle::findRoute(std::string b, std::string e) {
    uint8_t variableId = FIND_ROUTE;
    uint8_t variableType = TYPE_COMPOUND;
    uint8_t stringT = TYPE_STRING;
    uint8_t doubleT = TYPE_DOUBLE;
    uint8_t intT = TYPE_INTEGER;
    int32_t count = 5;
    TraCIBuffer buf = connection->query(CMD_GET_SIM_VARIABLE, TraCIBuffer() << variableId << "" << variableType << count <<
           stringT << b << stringT << e << stringT << "" << doubleT << -1. << intT << 0);
    ASSERT(buf.eof());
}

【讨论】:

  • 感谢您的帮助。此代码中无法识别 FIND_ROUTE。我将其替换为 CMD_SUBSCRIBE_ROUTE_CONTEXT,但在 SUMO 上观察到另一个错误。 “错误:tcpip::Storage::readIsSafe:想从 Storage 中读取 32564 个字节,但只剩下 65 个”。有谁知道我该如何解决?谢谢!
  • 你使用哪个 SUMO 版本?
  • 嗨,我使用的是 SUMO 0.32.0
  • FIND_ROUTE 应该在 0.32.0 中可用。错误信息到底是什么?
猜你喜欢
  • 2014-09-14
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多