Я использовал Veins 4.4 и симуляции выполняются нормально.
Однако я бы хотел изменить внешний вид автомобилей в графическом режиме. Анализируя код, я заметил, что для этого используется параметр «moduleDisplayString», но даже при использовании значений DisplayString по умолчанию OMNeT я всегда получаю ошибку отображения.
[...]
*.manager.moduleType = "sdvn.nodes.Car"*.manager.moduleName = "vehicle"*.manager.moduleDisplayString = "i=misc/sun;is=vs"[...]
Сообщение об ошибке:
invalid syntax for mapping "i=misc/sun;is=vs" for parameter "moduleDisplayString"
Кто-нибудь смог правильно использовать этот параметр?
Это на самом деле ошибка. В последних выпусках Veins были расширены, чтобы обеспечить возможность создания экземпляров различных типов модулей для различных типов транспортных средств SUMO. Например, вы можете использовать
*.manager.moduleType = "vtypeauto=Car vtypehuman=HumanCar"*.manager.moduleName = "vtypeauto=node vtypehuman=human"
создать экземпляр SUMO vtype vtypeauto
с Car.ned
модуль и обратитесь к нему в конфигурации с node
(например., *.node[*].mobility.z = 1.895
) при создании экземпляра vtype vtypehuman
с HumanCar.ned
модуль и позволяет вам настроить его с помощью human
,
Ошибка связана с синтаксисом, так как эта функция использует =
знак для разделения между ключом и парой значений. То же самое относится и к moduleDisplayString
параметр, поэтому парсер не работает.
Я подготовил патч, где одинарные кавычки ('
) можно использовать для защиты отображаемых строк. В вашем конкретном случае ваша конфигурация становится
*.manager.moduleDisplayString = "'i=misc/sun;is=vs'"
так что парсер знает, как правильно читать параметр. Я пробовал также эту конфигурацию
*.manager.moduleType = "vtypeauto=Car vtypehuman=HumanCar"*.manager.moduleName = "vtypeauto=node vtypehuman=human"*.manager.moduleDisplayString = "vtypeauto='i=misc/sun;is=vs' vtypehuman='i=abstract/penguin'"
и это результат
Вы можете видеть изображение солнца для одного типа транспортного средства и пингвина для другого. Как вы правильно указали, вены в настоящее время отображается поле, чтобы выделить автомобиль. Скорее всего, это будет удалено в ближайшее время или заменено более качественным значком (например, значком действующего автомобиля).
Я подготовлю патч, и вскоре он будет опубликован в сети на github-репо Veins. А пока я скопирую здесь фрагмент кода, чтобы вы могли продолжить работу, не дожидаясь официального релиза. Что вам нужно сделать, это добавить следующую функцию непосредственно перед функцией TraCIScenarioManager::parseMappings
в TraCIScenarioManager.cpp
,
std::vector<std::string> getMapping(std::string el) {
//search for string protection characters '
char protection = '\'';
size_t first = el.find(protection);
size_t second;
size_t eq;
std::string type, value;
std::vector<std::string> mapping;
if (first == std::string::npos) {
//there's no string protection, simply split by '='
cStringTokenizer stk(el.c_str(), "=");
mapping = stk.asVector();
}
else {
//if there's string protection, we need to find a matching delimiter
second = el.find(protection, first + 1);
//ensure that a matching delimiter exists, and that it is at the end
if (second == std::string::npos || second != el.size() - 1)
throw cRuntimeError("invalid syntax for mapping \"%s\"", el.c_str());
//take the value of the mapping as the text within the quotes
value = el.substr(first + 1, second - first - 1);
if (first == 0) {
//if the string starts with a quote, there's only the value
mapping.push_back(value);
}
else {
//search for the equal sign
eq = el.find('=');
//this must be the character before the quote
if (eq == std::string::npos || eq != first - 1) {
throw cRuntimeError("invalid syntax for mapping \"%s\"", el.c_str());
}
else {
type = el.substr(0, eq);
}
mapping.push_back(type);
mapping.push_back(value);
}
}
return mapping;
}
Затем измените следующие две строки внутри TraCIScenarioManager::parseMappings
функция
cStringTokenizer typeMappingTz(typeMapping.c_str(), "=");
std::vector<std::string> mapping = typeMappingTz.asVector();
с
std::vector<std::string> mapping = getMapping(typeMapping);
Других решений пока нет …