Sorts vehicles by ID to avoid race condition in TM

This commit is contained in:
Jacopo Bartiromo 2020-10-13 16:26:00 +02:00 committed by Jacopo Bartiromo
parent 00b2d85fe8
commit 859dfffb5e
1 changed files with 7 additions and 8 deletions

View File

@ -4,6 +4,8 @@
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#include <algorithm>
#include "carla/client/detail/Simulator.h"
#include "carla/trafficmanager/TrafficManagerLocal.h"
@ -155,6 +157,9 @@ void TrafficManagerLocal::Run() {
if (registered_vehicles_state != current_registered_vehicles_state || number_of_vehicles != registered_vehicles.Size()) {
vehicle_id_list = registered_vehicles.GetIDList();
std::sort(vehicle_id_list.begin(), vehicle_id_list.end());
number_of_vehicles = vehicle_id_list.size();
// Reserve more space if needed.
@ -194,19 +199,13 @@ void TrafficManagerLocal::Run() {
motion_plan_stage.Update(index);
}
// Building the command array for current cycle.
std::vector<carla::rpc::Command> batch_command(number_of_vehicles);
for (unsigned long i = 0u; i < number_of_vehicles; ++i) {
batch_command.at(i) = control_frame.at(i);
}
// Sending the current cycle's batch command to the simulator.
if (synchronous_mode) {
episode_proxy.Lock()->ApplyBatchSync(std::move(batch_command), false);
episode_proxy.Lock()->ApplyBatchSync(control_frame, false);
step_end.store(true);
step_end_trigger.notify_one();
} else {
episode_proxy.Lock()->ApplyBatch(std::move(batch_command), false);
episode_proxy.Lock()->ApplyBatch(control_frame, false);
}
}
}