Unique seed for Traffic Manager

This commit is contained in:
Jacopo Bartiromo 2021-12-13 16:07:09 +01:00 committed by Jacopo Bartiromo
parent 68658f9bd3
commit 9ff76463eb
13 changed files with 39 additions and 54 deletions

View File

@ -27,8 +27,7 @@ ALSM::ALSM(
CollisionStage &collision_stage, CollisionStage &collision_stage,
TrafficLightStage &traffic_light_stage, TrafficLightStage &traffic_light_stage,
MotionPlanStage &motion_plan_stage, MotionPlanStage &motion_plan_stage,
VehicleLightStage &vehicle_light_stage, VehicleLightStage &vehicle_light_stage)
RandomGeneratorMap &random_devices)
: registered_vehicles(registered_vehicles), : registered_vehicles(registered_vehicles),
buffer_map(buffer_map), buffer_map(buffer_map),
track_traffic(track_traffic), track_traffic(track_traffic),
@ -41,8 +40,7 @@ ALSM::ALSM(
collision_stage(collision_stage), collision_stage(collision_stage),
traffic_light_stage(traffic_light_stage), traffic_light_stage(traffic_light_stage),
motion_plan_stage(motion_plan_stage), motion_plan_stage(motion_plan_stage),
vehicle_light_stage(vehicle_light_stage), vehicle_light_stage(vehicle_light_stage) {}
random_devices(random_devices) {}
void ALSM::Update() { void ALSM::Update() {
@ -375,7 +373,6 @@ void ALSM::RemoveActor(const ActorId actor_id, const bool registered_actor) {
registered_vehicles.Remove({actor_id}); registered_vehicles.Remove({actor_id});
buffer_map.erase(actor_id); buffer_map.erase(actor_id);
idle_time.erase(actor_id); idle_time.erase(actor_id);
random_devices.erase(actor_id);
localization_stage.RemoveActor(actor_id); localization_stage.RemoveActor(actor_id);
collision_stage.RemoveActor(actor_id); collision_stage.RemoveActor(actor_id);
traffic_light_stage.RemoveActor(actor_id); traffic_light_stage.RemoveActor(actor_id);

View File

@ -64,8 +64,6 @@ private:
// Time elapsed since last vehicle destruction due to being idle for too long. // Time elapsed since last vehicle destruction due to being idle for too long.
double elapsed_last_actor_destruction {0.0}; double elapsed_last_actor_destruction {0.0};
cc::Timestamp current_timestamp; cc::Timestamp current_timestamp;
// Random devices.
RandomGeneratorMap &random_devices;
std::unordered_map<ActorId, bool> has_physics_enabled; std::unordered_map<ActorId, bool> has_physics_enabled;
// Updates the duration for which a registered vehicle is stuck at a location. // Updates the duration for which a registered vehicle is stuck at a location.
@ -104,8 +102,7 @@ public:
CollisionStage &collision_stage, CollisionStage &collision_stage,
TrafficLightStage &traffic_light_stage, TrafficLightStage &traffic_light_stage,
MotionPlanStage &motion_plan_stage, MotionPlanStage &motion_plan_stage,
VehicleLightStage &vehicle_light_stage, VehicleLightStage &vehicle_light_stage);
RandomGeneratorMap &random_devices);
void Update(); void Update();

View File

@ -22,14 +22,14 @@ CollisionStage::CollisionStage(
const TrackTraffic &track_traffic, const TrackTraffic &track_traffic,
const Parameters &parameters, const Parameters &parameters,
CollisionFrame &output_array, CollisionFrame &output_array,
RandomGeneratorMap &random_devices) RandomGenerator &random_device)
: vehicle_id_list(vehicle_id_list), : vehicle_id_list(vehicle_id_list),
simulation_state(simulation_state), simulation_state(simulation_state),
buffer_map(buffer_map), buffer_map(buffer_map),
track_traffic(track_traffic), track_traffic(track_traffic),
parameters(parameters), parameters(parameters),
output_array(output_array), output_array(output_array),
random_devices(random_devices) {} random_device(random_device) {}
void CollisionStage::Update(const unsigned long index) { void CollisionStage::Update(const unsigned long index) {
ActorId obstacle_id = 0u; ActorId obstacle_id = 0u;
@ -91,9 +91,9 @@ void CollisionStage::Update(const unsigned long index) {
look_ahead_index); look_ahead_index);
if (negotiation_result.first) { if (negotiation_result.first) {
if ((other_actor_type == ActorType::Vehicle if ((other_actor_type == ActorType::Vehicle
&& parameters.GetPercentageIgnoreVehicles(ego_actor_id) <= random_devices.at(ego_actor_id).next()) && parameters.GetPercentageIgnoreVehicles(ego_actor_id) <= random_device.next())
|| (other_actor_type == ActorType::Pedestrian || (other_actor_type == ActorType::Pedestrian
&& parameters.GetPercentageIgnoreWalkers(ego_actor_id) <= random_devices.at(ego_actor_id).next())) { && parameters.GetPercentageIgnoreWalkers(ego_actor_id) <= random_device.next())) {
collision_hazard = true; collision_hazard = true;
obstacle_id = other_actor_id; obstacle_id = other_actor_id;
available_distance_margin = negotiation_result.second; available_distance_margin = negotiation_result.second;

View File

@ -57,7 +57,7 @@ private:
// to avoid repeated computation within a cycle. // to avoid repeated computation within a cycle.
GeometryComparisonMap geometry_cache; GeometryComparisonMap geometry_cache;
GeodesicBoundaryMap geodesic_boundary_map; GeodesicBoundaryMap geodesic_boundary_map;
RandomGeneratorMap &random_devices; RandomGenerator &random_device;
// Method to determine if a vehicle is on a collision path to another. // Method to determine if a vehicle is on a collision path to another.
std::pair<bool, float> NegotiateCollision(const ActorId reference_vehicle_id, std::pair<bool, float> NegotiateCollision(const ActorId reference_vehicle_id,
@ -90,7 +90,7 @@ public:
const TrackTraffic &track_traffic, const TrackTraffic &track_traffic,
const Parameters &parameters, const Parameters &parameters,
CollisionFrame &output_array, CollisionFrame &output_array,
RandomGeneratorMap &random_devices); RandomGenerator &random_device);
void Update (const unsigned long index) override; void Update (const unsigned long index) override;

View File

@ -22,7 +22,7 @@ LocalizationStage::LocalizationStage(
Parameters &parameters, Parameters &parameters,
std::vector<ActorId>& marked_for_removal, std::vector<ActorId>& marked_for_removal,
LocalizationFrame &output_array, LocalizationFrame &output_array,
RandomGeneratorMap &random_devices) RandomGenerator &random_device)
: vehicle_id_list(vehicle_id_list), : vehicle_id_list(vehicle_id_list),
buffer_map(buffer_map), buffer_map(buffer_map),
simulation_state(simulation_state), simulation_state(simulation_state),
@ -31,7 +31,7 @@ LocalizationStage::LocalizationStage(
parameters(parameters), parameters(parameters),
marked_for_removal(marked_for_removal), marked_for_removal(marked_for_removal),
output_array(output_array), output_array(output_array),
random_devices(random_devices){} random_device(random_device){}
void LocalizationStage::Update(const unsigned long index) { void LocalizationStage::Update(const unsigned long index) {
@ -120,9 +120,9 @@ void LocalizationStage::Update(const unsigned long index) {
const float perc_keep_right = parameters.GetKeepRightPercentage(actor_id); const float perc_keep_right = parameters.GetKeepRightPercentage(actor_id);
const float perc_random_leftlanechange = parameters.GetRandomLeftLaneChangePercentage(actor_id); const float perc_random_leftlanechange = parameters.GetRandomLeftLaneChangePercentage(actor_id);
const float perc_random_rightlanechange = parameters.GetRandomRightLaneChangePercentage(actor_id); const float perc_random_rightlanechange = parameters.GetRandomRightLaneChangePercentage(actor_id);
const bool is_keep_right = perc_keep_right > random_devices.at(actor_id).next(); const bool is_keep_right = perc_keep_right > random_device.next();
const bool is_random_left_change = perc_random_leftlanechange >= random_devices.at(actor_id).next(); const bool is_random_left_change = perc_random_leftlanechange >= random_device.next();
const bool is_random_right_change = perc_random_rightlanechange >= random_devices.at(actor_id).next(); const bool is_random_right_change = perc_random_rightlanechange >= random_device.next();
// Determine which of the parameters we should apply. // Determine which of the parameters we should apply.
if (is_keep_right || is_random_right_change) { if (is_keep_right || is_random_right_change) {
@ -135,7 +135,7 @@ void LocalizationStage::Update(const unsigned long index) {
lane_change_direction = false; lane_change_direction = false;
} else { } else {
// Both a left and right lane changes are forced. Choose between one of them. // Both a left and right lane changes are forced. Choose between one of them.
lane_change_direction = FIFTYPERC > random_devices.at(actor_id).next(); lane_change_direction = FIFTYPERC > random_device.next();
} }
} }
} }
@ -194,7 +194,7 @@ void LocalizationStage::Update(const unsigned long index) {
uint64_t selection_index = 0u; uint64_t selection_index = 0u;
// Pseudo-randomized path selection if found more than one choice. // Pseudo-randomized path selection if found more than one choice.
if (next_waypoints.size() > 1) { if (next_waypoints.size() > 1) {
double r_sample = random_devices.at(actor_id).next(); double r_sample = random_device.next();
selection_index = static_cast<uint64_t>(r_sample*next_waypoints.size()*0.01); selection_index = static_cast<uint64_t>(r_sample*next_waypoints.size()*0.01);
} else if (next_waypoints.size() == 0) { } else if (next_waypoints.size() == 0) {
if (!parameters.GetOSMMode()) { if (!parameters.GetOSMMode()) {

View File

@ -44,7 +44,7 @@ private:
ActorIdSet vehicles_at_junction; ActorIdSet vehicles_at_junction;
using SimpleWaypointPair = std::pair<SimpleWaypointPtr, SimpleWaypointPtr>; using SimpleWaypointPair = std::pair<SimpleWaypointPtr, SimpleWaypointPtr>;
std::unordered_map<ActorId, SimpleWaypointPair> vehicles_at_junction_entrance; std::unordered_map<ActorId, SimpleWaypointPair> vehicles_at_junction_entrance;
RandomGeneratorMap &random_devices; RandomGenerator &random_device;
SimpleWaypointPtr AssignLaneChange(const ActorId actor_id, SimpleWaypointPtr AssignLaneChange(const ActorId actor_id,
const cg::Location vehicle_location, const cg::Location vehicle_location,
@ -74,7 +74,7 @@ public:
Parameters &parameters, Parameters &parameters,
std::vector<ActorId>& marked_for_removal, std::vector<ActorId>& marked_for_removal,
LocalizationFrame &output_array, LocalizationFrame &output_array,
RandomGeneratorMap &random_devices); RandomGenerator &random_device);
void Update(const unsigned long index) override; void Update(const unsigned long index) override;

View File

@ -41,7 +41,7 @@ MotionPlanStage::MotionPlanStage(
const TLFrame &tl_frame, const TLFrame &tl_frame,
const cc::World &world, const cc::World &world,
ControlFrame &output_array, ControlFrame &output_array,
RandomGeneratorMap &random_devices, RandomGenerator &random_device,
const LocalMapPtr &local_map) const LocalMapPtr &local_map)
: vehicle_id_list(vehicle_id_list), : vehicle_id_list(vehicle_id_list),
simulation_state(simulation_state), simulation_state(simulation_state),
@ -57,7 +57,7 @@ MotionPlanStage::MotionPlanStage(
tl_frame(tl_frame), tl_frame(tl_frame),
world(world), world(world),
output_array(output_array), output_array(output_array),
random_devices(random_devices), random_device(random_device),
local_map(local_map) { local_map(local_map) {
// Adding structure to avoid retrieving traffic lights when checking for landmarks. // Adding structure to avoid retrieving traffic lights when checking for landmarks.
@ -111,7 +111,7 @@ void MotionPlanStage::Update(const unsigned long index) {
double elapsed_time = current_timestamp.elapsed_seconds - teleportation_instance.at(actor_id).elapsed_seconds; double elapsed_time = current_timestamp.elapsed_seconds - teleportation_instance.at(actor_id).elapsed_seconds;
if (parameters.GetSynchronousMode() || elapsed_time > HYBRID_MODE_DT) { if (parameters.GetSynchronousMode() || elapsed_time > HYBRID_MODE_DT) {
float random_sample = (static_cast<float>(random_devices.at(actor_id).next())*dilate_factor) + lower_bound; float random_sample = (static_cast<float>(random_device.next())*dilate_factor) + lower_bound;
NodeList teleport_waypoint_list = local_map->GetWaypointsInDelta(hero_location, ATTEMPTS_TO_TELEPORT, random_sample); NodeList teleport_waypoint_list = local_map->GetWaypointsInDelta(hero_location, ATTEMPTS_TO_TELEPORT, random_sample);
if (!teleport_waypoint_list.empty()) { if (!teleport_waypoint_list.empty()) {
for (auto &teleport_waypoint : teleport_waypoint_list) { for (auto &teleport_waypoint : teleport_waypoint_list) {

View File

@ -42,7 +42,7 @@ private:
std::unordered_map<ActorId, cc::Timestamp> teleportation_instance; std::unordered_map<ActorId, cc::Timestamp> teleportation_instance;
ControlFrame &output_array; ControlFrame &output_array;
cc::Timestamp current_timestamp; cc::Timestamp current_timestamp;
RandomGeneratorMap &random_devices; RandomGenerator &random_device;
const LocalMapPtr &local_map; const LocalMapPtr &local_map;
TLMap tl_map; TLMap tl_map;
@ -83,7 +83,7 @@ public:
const TLFrame &tl_frame, const TLFrame &tl_frame,
const cc::World &world, const cc::World &world,
ControlFrame &output_array, ControlFrame &output_array,
RandomGeneratorMap &random_devices, RandomGenerator &random_device,
const LocalMapPtr &local_map); const LocalMapPtr &local_map);
void Update(const unsigned long index); void Update(const unsigned long index);

View File

@ -18,7 +18,5 @@ private:
std::uniform_real_distribution<double> dist; std::uniform_real_distribution<double> dist;
}; };
using RandomGeneratorMap = std::unordered_map<carla::rpc::ActorId, RandomGenerator>;
} // namespace traffic_manager } // namespace traffic_manager
} // namespace carla } // namespace carla

View File

@ -17,14 +17,14 @@ TrafficLightStage::TrafficLightStage(
const Parameters &parameters, const Parameters &parameters,
const cc::World &world, const cc::World &world,
TLFrame &output_array, TLFrame &output_array,
RandomGeneratorMap &random_devices) RandomGenerator &random_device)
: vehicle_id_list(vehicle_id_list), : vehicle_id_list(vehicle_id_list),
simulation_state(simulation_state), simulation_state(simulation_state),
buffer_map(buffer_map), buffer_map(buffer_map),
parameters(parameters), parameters(parameters),
world(world), world(world),
output_array(output_array), output_array(output_array),
random_devices(random_devices) {} random_device(random_device) {}
void TrafficLightStage::Update(const unsigned long index) { void TrafficLightStage::Update(const unsigned long index) {
bool traffic_light_hazard = false; bool traffic_light_hazard = false;
@ -46,7 +46,7 @@ void TrafficLightStage::Update(const unsigned long index) {
if (is_at_traffic_light && if (is_at_traffic_light &&
traffic_light_state != TLS::Green && traffic_light_state != TLS::Green &&
traffic_light_state != TLS::Off && traffic_light_state != TLS::Off &&
parameters.GetPercentageRunningLight(ego_actor_id) <= random_devices.at(ego_actor_id).next()) { parameters.GetPercentageRunningLight(ego_actor_id) <= random_device.next()) {
traffic_light_hazard = true; traffic_light_hazard = true;
} }
@ -55,7 +55,7 @@ void TrafficLightStage::Update(const unsigned long index) {
!is_at_traffic_light && !is_at_traffic_light &&
traffic_light_state != TLS::Green && traffic_light_state != TLS::Green &&
traffic_light_state != TLS::Off && traffic_light_state != TLS::Off &&
parameters.GetPercentageRunningSign(ego_actor_id) <= random_devices.at(ego_actor_id).next()) { parameters.GetPercentageRunningSign(ego_actor_id) <= random_device.next()) {
traffic_light_hazard = HandleNonSignalisedJunction(ego_actor_id, junction_id, current_timestamp); traffic_light_hazard = HandleNonSignalisedJunction(ego_actor_id, junction_id, current_timestamp);
} }

View File

@ -26,7 +26,7 @@ private:
/// Map containing the previous junction visited by a vehicle. /// Map containing the previous junction visited by a vehicle.
std::unordered_map<ActorId, JunctionID> vehicle_last_junction; std::unordered_map<ActorId, JunctionID> vehicle_last_junction;
TLFrame &output_array; TLFrame &output_array;
RandomGeneratorMap &random_devices; RandomGenerator &random_device;
cc::Timestamp current_timestamp; cc::Timestamp current_timestamp;
bool HandleNonSignalisedJunction(const ActorId ego_actor_id, const JunctionID junction_id, bool HandleNonSignalisedJunction(const ActorId ego_actor_id, const JunctionID junction_id,
@ -39,7 +39,7 @@ public:
const Parameters &parameters, const Parameters &parameters,
const cc::World &world, const cc::World &world,
TLFrame &output_array, TLFrame &output_array,
RandomGeneratorMap &random_devices); RandomGenerator &random_device);
void Update(const unsigned long index) override; void Update(const unsigned long index) override;

View File

@ -42,7 +42,7 @@ TrafficManagerLocal::TrafficManagerLocal(
parameters, parameters,
marked_for_removal, marked_for_removal,
localization_frame, localization_frame,
random_devices)), random_device)),
collision_stage(CollisionStage(vehicle_id_list, collision_stage(CollisionStage(vehicle_id_list,
simulation_state, simulation_state,
@ -50,7 +50,7 @@ TrafficManagerLocal::TrafficManagerLocal(
track_traffic, track_traffic,
parameters, parameters,
collision_frame, collision_frame,
random_devices)), random_device)),
traffic_light_stage(TrafficLightStage(vehicle_id_list, traffic_light_stage(TrafficLightStage(vehicle_id_list,
simulation_state, simulation_state,
@ -58,7 +58,7 @@ TrafficManagerLocal::TrafficManagerLocal(
parameters, parameters,
world, world,
tl_frame, tl_frame,
random_devices)), random_device)),
motion_plan_stage(MotionPlanStage(vehicle_id_list, motion_plan_stage(MotionPlanStage(vehicle_id_list,
simulation_state, simulation_state,
@ -74,7 +74,7 @@ TrafficManagerLocal::TrafficManagerLocal(
tl_frame, tl_frame,
world, world,
control_frame, control_frame,
random_devices, random_device,
local_map)), local_map)),
vehicle_light_stage(VehicleLightStage(vehicle_id_list, vehicle_light_stage(VehicleLightStage(vehicle_id_list,
@ -95,8 +95,7 @@ TrafficManagerLocal::TrafficManagerLocal(
collision_stage, collision_stage,
traffic_light_stage, traffic_light_stage,
motion_plan_stage, motion_plan_stage,
vehicle_light_stage, vehicle_light_stage)),
random_devices)),
server(TrafficManagerServer(RPCportTM, static_cast<carla::traffic_manager::TrafficManagerBase *>(this))) { server(TrafficManagerServer(RPCportTM, static_cast<carla::traffic_manager::TrafficManagerBase *>(this))) {
@ -190,6 +189,7 @@ void TrafficManagerLocal::Run() {
unsigned long number_of_vehicles = vehicle_id_list.size(); unsigned long number_of_vehicles = vehicle_id_list.size();
if (registered_vehicles_state != current_registered_vehicles_state || number_of_vehicles != registered_vehicles.Size()) { if (registered_vehicles_state != current_registered_vehicles_state || number_of_vehicles != registered_vehicles.Size()) {
vehicle_id_list = registered_vehicles.GetIDList(); vehicle_id_list = registered_vehicles.GetIDList();
std::sort(vehicle_id_list.begin(), vehicle_id_list.end());
number_of_vehicles = vehicle_id_list.size(); number_of_vehicles = vehicle_id_list.size();
// Reserve more space if needed. // Reserve more space if needed.
@ -282,7 +282,6 @@ void TrafficManagerLocal::Stop() {
track_traffic.Clear(); track_traffic.Clear();
previous_update_instance = chr::system_clock::now(); previous_update_instance = chr::system_clock::now();
current_reserved_capacity = 0u; current_reserved_capacity = 0u;
random_devices.clear();
simulation_state.Reset(); simulation_state.Reset();
localization_stage.Reset(); localization_stage.Reset();
@ -322,14 +321,6 @@ void TrafficManagerLocal::RegisterVehicles(const std::vector<ActorPtr> &vehicle_
std::vector<ActorPtr> sorted_vehicle_list = vehicle_list; std::vector<ActorPtr> sorted_vehicle_list = vehicle_list;
std::sort(sorted_vehicle_list.begin(), sorted_vehicle_list.end(), [](ActorPtr &a, ActorPtr &b) {return a->GetId() > b->GetId(); }); std::sort(sorted_vehicle_list.begin(), sorted_vehicle_list.end(), [](ActorPtr &a, ActorPtr &b) {return a->GetId() > b->GetId(); });
registered_vehicles.Insert(sorted_vehicle_list); registered_vehicles.Insert(sorted_vehicle_list);
for (const ActorPtr &vehicle: sorted_vehicle_list) {
if (!is_custom_seed) {
seed = vehicle->GetId() + seed;
} else {
seed = 1 + seed;
}
random_devices.insert({vehicle->GetId(), RandomGenerator(seed)});
}
} }
void TrafficManagerLocal::UnregisterVehicles(const std::vector<ActorPtr> &actor_list) { void TrafficManagerLocal::UnregisterVehicles(const std::vector<ActorPtr> &actor_list) {
@ -490,6 +481,8 @@ std::vector<ActorId> TrafficManagerLocal::GetRegisteredVehiclesIDs() {
void TrafficManagerLocal::SetRandomDeviceSeed(const uint64_t _seed) { void TrafficManagerLocal::SetRandomDeviceSeed(const uint64_t _seed) {
seed = _seed; seed = _seed;
is_custom_seed = true; is_custom_seed = true;
random_device = RandomGenerator(seed);
std::cout << random_device.next() << std::endl;
world.ResetAllTrafficLights(); world.ResetAllTrafficLights();
} }

View File

@ -109,11 +109,11 @@ private:
std::condition_variable step_end_trigger; std::condition_variable step_end_trigger;
/// Single worker thread for sequential execution of sub-components. /// Single worker thread for sequential execution of sub-components.
std::unique_ptr<std::thread> worker_thread; std::unique_ptr<std::thread> worker_thread;
/// Structure holding random devices per vehicle.
RandomGeneratorMap random_devices;
/// Randomization seed. /// Randomization seed.
uint64_t seed {static_cast<uint64_t>(time(NULL))}; uint64_t seed {static_cast<uint64_t>(time(NULL))};
bool is_custom_seed {false}; bool is_custom_seed {false};
/// Structure holding random devices per vehicle.
RandomGenerator random_device = RandomGenerator(seed);
std::vector<ActorId> marked_for_removal; std::vector<ActorId> marked_for_removal;
/// Mutex to prevent vehicle registration during frame array re-allocation. /// Mutex to prevent vehicle registration during frame array re-allocation.
std::mutex registration_mutex; std::mutex registration_mutex;