Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[sumo-user] TraCI quits on "Error: tcpip::Socket::recvAndCheck @ recv: peer shutdown"

Hello everyone!

I'm trying to get the number of vehicles that were involved in a collision during the Sumo simulation via TraCI. I'm using a Veins application to control Sumo simulation via TraCI. I verified that this seems to be done by getCollidingVehiclesNumber() with variable ID VAR_COLLIDING_VEHICLES_NUMBER.

Checking the Veins code, I understood that I need to register this variable associated with the simulation (CMD_SUBSCRIBE_SIM_VARIABLE). Therefore, I include this variable in the list of variables registered in the simulation. My change in Veins TraCIScenarioManager.cc:
$ git diff src/veins/modules/mobility/traci/TraCIScenarioManager.cc
diff --git a/src/veins/modules/mobility/traci/TraCIScenarioManager.cc b/src/veins/modules/mobility/traci/TraCIScenarioManager.cc
index 56b4eb5d..098423ab 100644
--- a/src/veins/modules/mobility/traci/TraCIScenarioManager.cc
+++ b/src/veins/modules/mobility/traci/TraCIScenarioManager.cc
@@ -279,6 +279,8 @@ void TraCIScenarioManager::initialize(int stage)
     drivingVehicleCount = 0;
     autoShutdownTriggered = false;
 
+    collidingVehicleCount = 0;
+
     world = FindModule<BaseWorldUtility*>::findGlobalModule();
 
     vehicleObstacleControl = FindModule<VehicleObstacleControl*>::findGlobalModule();
@@ -314,7 +316,7 @@ void TraCIScenarioManager::init_traci()
         simtime_t beginTime = 0;
         simtime_t endTime = SimTime::getMaxTime();
         std::string objectId = "";
-        uint8_t variableNumber = 7;
+        uint8_t variableNumber = 8;
         uint8_t variable1 = VAR_DEPARTED_VEHICLES_IDS;
         uint8_t variable2 = VAR_ARRIVED_VEHICLES_IDS;
         uint8_t variable3 = commandInterface->getTimeStepCmd();
@@ -322,7 +324,8 @@ void TraCIScenarioManager::init_traci()
         uint8_t variable5 = VAR_TELEPORT_ENDING_VEHICLES_IDS;
         uint8_t variable6 = VAR_PARKING_STARTING_VEHICLES_IDS;
         uint8_t variable7 = VAR_PARKING_ENDING_VEHICLES_IDS;
-        TraCIBuffer buf = connection->query(CMD_SUBSCRIBE_SIM_VARIABLE, TraCIBuffer() << beginTime << endTime << objectId << variableNumber << variable1 << variable2 << variable3 << variable4 << variable5 << variable6 << variable7);
+        uint8_t variable8 = VAR_COLLIDING_VEHICLES_NUMBER;
+        TraCIBuffer buf = connection->query(CMD_SUBSCRIBE_SIM_VARIABLE, TraCIBuffer() << beginTime << endTime << objectId << variableNumber << variable1 << variable2 << variable3 << variable4 << variable5 << variable6 << variable7 << variable8);
         processSubcriptionResult(buf);
         ASSERT(buf.eof());
     }
@@ -864,6 +867,17 @@ void TraCIScenarioManager::processSimSubscription(std::string objectId, TraCIBuf
             parkingVehicleCount -= count;
             drivingVehicleCount += count;
         }
+        if (variable1_resp == VAR_COLLIDING_VEHICLES_NUMBER) {
+            uint8_t varType;
+            buf >> varType;
+            ASSERT(varType == TYPE_INTEGER);
+            uint32_t count;
+            buf >> count;
+            EV_DEBUG << "TraCI reports " << count << " collided vehicles." << endl;
+
+            collidingVehicleCount += count;
+        }
         else if (variable1_resp == getCommandInterface()->getTimeStepCmd()) {
             uint8_t varType;
             buf >> varType;

However, with that, the simulation init is crashing. The error displayed in TraCi is as follows:

Result: "<?xml version="1.0"?>
<status>
<exit-code>1</exit-code>
<start>1590255944</start>
<end>1590255952</end>
<status>Exited with error code 1</status>
<stdout><![CDATA[Loading configuration ... done.
]]></stdout>
<stderr><![CDATA[Error: tcpip::Socket::recvAndCheck @ recv: peer shutdown
Quitting (on error).

]]></stderr>
</status>
"
The CMD_SUBSCRIBE_SIM_VARIABLE query is handled here: https://github.com/eclipse/sumo/blob/master/src/traci-server/TraCIServer.cpp#L839 and the error is returned here: https://github.com/eclipse/sumo/blob/master/src/foreign/tcpip/socket.cpp#L458

Could anyone tell me if this is the correct way to access the count of collisions identified during the simulation? Or is there a way to get this value directly?

Thanks in advance!
--
Tiago Alves Silva


Back to the top