2016-12-06 6 views
0

Я написал функцию в TRACI Client для запроса SUMO (сервера TRACI) для получения текущей позиции автомобиля, который я получаю исправить в системе координат XY. Теперь я хочу изменить эту полученную позицию XY на широту и долготу. Я закодирован в соответствии с документацией, имеющейся в http://www.sumo.dlr.de/wiki/TraCI/Simulation_Value_Retrieval#Command_0x82:_Position_Conversion , но я получаю ошибку !!. Пожалуйста, обратите внимание на кодОшибка в преобразовании позиции транспортного средства (координаты XY в широту и долготу) в SUMO от клиента C++ TRACI

TraCITestClient::Position TraCITestClient::getPosition() 
{ 
send_commandGetVariable(0xa4, 0x42, "veh1"); 

tcpip::Storage inMsg; 
try { 
    std::string acknowledgement; 
    check_resultState(inMsg, 0xa4, false, &acknowledgement); 

} catch (tcpip::SocketException& e) { 
    pos.x = -1; 
    pos.y = -1; 
    return pos; 
} 
check_commandGetResult(inMsg, 0xa4, -1, false); 
// report result state 
try { 
    int variableID = inMsg.readUnsignedByte(); 
    std::string objectID = inMsg.readString(); 

    int valueDataType = inMsg.readUnsignedByte(); 

    pos.x = inMsg.readDouble(); 
    pos.y = inMsg.readDouble(); 

} catch (tcpip::SocketException& e) { 
    std::stringstream msg; 
    msg << "Error while receiving command: " << e.what(); 
    errorMsg(msg); 
    pos.x = -1; 
    pos.y = -1; 
    return pos; 
} 

//till here i am getting correct value in pos.x and pos.y 

// now i want to convert these XY coordinates to actual Lat Long 


    tcpip::Storage* tmp = new tcpip::Storage; 


    tmp->writeByte(TYPE_COMPOUND); 
    tmp->writeInt(2); 


    tmp->writeDouble(pos.x); 
    tmp->writeDouble(pos.y); 
    tmp->writeByte(TYPE_UBYTE); 

    tmp->writeUnsignedByte(POSITION_LON_LAT); 

send_commandGetVariable(0x82, 0x58, "veh1",tmp); //**here i am getting error** 

tcpip::Storage inMsgX; 
try { 
    std::string acknowledgement; 
    check_resultState(inMsgX, 0x82, false, &acknowledgement); 

} catch (tcpip::SocketException& e) { 
    return pos; 
} 
check_commandGetResult(inMsgX, 0x82, -1, false); 
// report result state 
try { 

    int variableID = inMsgX.readUnsignedByte(); 
    std::string objectID = inMsgX.readString(); 

    int valueDataType = inMsgX.readUnsignedByte(); 


    pos.x = inMsgX.readDouble(); 
    pos.y = inMsgX.readDouble(); 

} catch (tcpip::SocketException& e) { 
    std::stringstream msg; 
    msg << "Error while receiving command: " << e.what(); 
    errorMsg(msg); 
    return pos; 
} 

return pos; 
} 

Так ошибка я получаю на SUMO Сервер: Ошибка: TCPIP :: Хранение :: readIsSafe: хочу прочитать 823066624 байт из памяти, но только 20 оставшихся бросить курить (по ошибке).

ответ

0

Нет необходимости изобретать велосипед. В src/utils/traci/TraCIAPI.h имеется API-интерфейс TraCI C++. Ваш первый вызов может быть уменьшен до

TraCIPosition pos = TraCIAPI::VehicleScope::getPosition("veh1"); 

К сожалению, второй вызов не является частью API C++, но еще, вероятно, вы могли бы это исправить с помощью

tcpip::Storage* tmp = new tcpip::Storage; 
tmp->writeByte(TYPE_COMPOUND); 
tmp->writeInt(2); 
tmp->writeByte(POSITION_2D); 
tmp->writeDouble(pos.x); 
tmp->writeDouble(pos.y); 
tmp->writeByte(TYPE_UBYTE); 
tmp->writeUnsignedByte(POSITION_LON_LAT); 
send_commandGetVariable(CMD_GET_SIM_VARIABLE, POSITION_CONVERSION, "",tmp); 

Ваша версия не содержит первый спецификатор типа (POSITION_2D), а также использовали неправильные шестнадцатеричные коды для команды и для переменной. Всегда полезно использовать константы вместо шестнадцатеричных кодов.

+0

Большое спасибо, я буквально пытался изобретать колеса, я запутался в командах. Большое спасибо, привет! – Vickey

 Смежные вопросы

  • Нет связанных вопросов^_^