From 6f892cff576acc7dd3fa48cf2c001963859fb723 Mon Sep 17 00:00:00 2001 From: Sekhar Barua Date: Wed, 4 Mar 2020 19:02:29 +0530 Subject: [PATCH] Changes to add Global distance to Leading Vehicle --- .../source/carla/trafficmanager/Parameters.cpp | 14 ++++++++++---- LibCarla/source/carla/trafficmanager/Parameters.h | 5 +++++ .../source/carla/trafficmanager/TrafficManager.h | 8 ++++++++ .../carla/trafficmanager/TrafficManagerBase.h | 3 +++ .../carla/trafficmanager/TrafficManagerClient.h | 8 ++++++++ .../carla/trafficmanager/TrafficManagerLocal.cpp | 4 ++++ .../carla/trafficmanager/TrafficManagerLocal.h | 4 ++++ .../carla/trafficmanager/TrafficManagerRemote.cpp | 5 +++++ .../carla/trafficmanager/TrafficManagerRemote.h | 3 +++ .../carla/trafficmanager/TrafficManagerServer.h | 6 ++++++ PythonAPI/carla/source/libcarla/TrafficManager.cpp | 3 ++- PythonAPI/examples/spawn_npc.py | 1 + 12 files changed, 59 insertions(+), 5 deletions(-) diff --git a/LibCarla/source/carla/trafficmanager/Parameters.cpp b/LibCarla/source/carla/trafficmanager/Parameters.cpp index 87290ef36..48306fef7 100644 --- a/LibCarla/source/carla/trafficmanager/Parameters.cpp +++ b/LibCarla/source/carla/trafficmanager/Parameters.cpp @@ -152,13 +152,19 @@ bool Parameters::GetAutoLaneChange(const ActorPtr &actor) { float Parameters::GetDistanceToLeadingVehicle(const ActorPtr &actor) { const ActorId actor_id = actor->GetId(); - float distance_margin = -1.0f; - + float specific_distance_margin = 0.0f; if (distance_to_leading_vehicle.Contains(actor_id)) { - distance_margin = distance_to_leading_vehicle.GetValue(actor_id); + specific_distance_margin = distance_to_leading_vehicle.GetValue(actor_id); + } else { + specific_distance_margin = distance_margin; } + //std::cout <<"distance_margin :- "<< distance_margin <<" " <<"Value of Specific Distance Margin - " << specific_distance_margin << std::endl; + return specific_distance_margin; +} - return distance_margin; +void Parameters::SetGlobalDistanceToLeadingVehicle(const float dist) { + + distance_margin.store(dist); } void Parameters::SetPercentageRunningLight(const ActorPtr &actor, const float perc) { diff --git a/LibCarla/source/carla/trafficmanager/Parameters.h b/LibCarla/source/carla/trafficmanager/Parameters.h index 70c5cc6e2..6fd37b691 100644 --- a/LibCarla/source/carla/trafficmanager/Parameters.h +++ b/LibCarla/source/carla/trafficmanager/Parameters.h @@ -56,6 +56,8 @@ namespace traffic_manager { AtomicMap perc_ignore_vehicles; /// Synchronous mode switch. std::atomic synchronous_mode; + /// Distance Margin + std::atomic distance_margin {2.0}; public: Parameters(); @@ -113,6 +115,9 @@ namespace traffic_manager { /// Method to get % to ignore any walker. float GetPercentageIgnoreWalkers(const ActorPtr &actor); + /// Method to set distance to leading vehicle for a given vehicle. + void SetGlobalDistanceToLeadingVehicle(const float dist); + /// Method to set % to run any traffic sign. void SetPercentageRunningSign(const ActorPtr &actor, const float perc); diff --git a/LibCarla/source/carla/trafficmanager/TrafficManager.h b/LibCarla/source/carla/trafficmanager/TrafficManager.h index dc3e7dea0..77ed89dd6 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManager.h +++ b/LibCarla/source/carla/trafficmanager/TrafficManager.h @@ -204,6 +204,14 @@ public: return false; } + /// Method to Set Global distance to Leading vehicle + void SetGlobalDistanceToLeadingVehicle(const float distance) { + TrafficManagerBase* tm_ptr = GetTM(_port); + if(tm_ptr != nullptr){ + tm_ptr->SetGlobalDistanceToLeadingVehicle(distance); + } + } + private: void CreateTrafficManagerServer( diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerBase.h b/LibCarla/source/carla/trafficmanager/TrafficManagerBase.h index 85b34f9fe..4d9e85fdd 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerBase.h +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerBase.h @@ -97,6 +97,9 @@ public: /// Get carla episode information virtual carla::client::detail::EpisodeProxy& GetEpisodeProxy() = 0; + /// Method to set Global Distance to Leading Vehicle. + virtual void SetGlobalDistanceToLeadingVehicle(const float dist) = 0; + protected: }; diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerClient.h b/LibCarla/source/carla/trafficmanager/TrafficManagerClient.h index 6bd8d7764..7c2f43730 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerClient.h +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerClient.h @@ -166,6 +166,14 @@ public: _client->call("health_check_remote_TM"); } + /// Method to specify how much distance a vehicle should maintain to + /// the Global leading vehicle. + void SetGlobalDistanceToLeadingVehicle(const float distance) { + DEBUG_ASSERT(_client != nullptr); + _client->call("set_global_distance_to_leading_vehicle",distance); + } + + private: /// RPC client. diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.cpp b/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.cpp index 4138f9b42..21cc1ff04 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.cpp +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.cpp @@ -177,6 +177,10 @@ void TrafficManagerLocal::SetDistanceToLeadingVehicle(const ActorPtr &actor, con parameters.SetDistanceToLeadingVehicle(actor, distance); } +void TrafficManagerLocal::SetGlobalDistanceToLeadingVehicle(const float distance) { + parameters.SetGlobalDistanceToLeadingVehicle(distance); +} + void TrafficManagerLocal::SetPercentageIgnoreWalkers(const ActorPtr &actor, const float perc) { parameters.SetPercentageIgnoreWalkers(actor, perc); } diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.h b/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.h index e1afbbf05..cfa34cf31 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.h +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerLocal.h @@ -177,6 +177,10 @@ namespace traffic_manager { /// Get list of all registered vehicles. std::vector GetRegisteredVehiclesIDs(); + + /// Method to specify how much distance a vehicle should maintain to + /// the Global leading vehicle. + void SetGlobalDistanceToLeadingVehicle(const float distance); }; } // namespace traffic_manager diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.cpp b/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.cpp index 18e08bc94..44606182a 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.cpp +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.cpp @@ -141,6 +141,11 @@ void TrafficManagerRemote::SetDistanceToLeadingVehicle(const ActorPtr &_actor, c client.SetDistanceToLeadingVehicle(actor, distance); } +void TrafficManagerRemote::SetGlobalDistanceToLeadingVehicle(const float distance) { + client.SetGlobalDistanceToLeadingVehicle(distance); +} + + void TrafficManagerRemote::SetPercentageIgnoreWalkers(const ActorPtr &_actor, const float percentage) { carla::rpc::Actor actor(_actor->Serialize()); diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.h b/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.h index 5046c4f59..3fe71b3b6 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.h +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerRemote.h @@ -76,6 +76,9 @@ public: /// the leading vehicle. void SetDistanceToLeadingVehicle(const ActorPtr &actor, const float distance); + /// Method to specify Global Distance + void SetGlobalDistanceToLeadingVehicle(const float distance); + /// Method to specify the % chance of ignoring collisions with any walker. void SetPercentageIgnoreWalkers(const ActorPtr &actor, const float perc); diff --git a/LibCarla/source/carla/trafficmanager/TrafficManagerServer.h b/LibCarla/source/carla/trafficmanager/TrafficManagerServer.h index af113e311..c5e55c9c2 100644 --- a/LibCarla/source/carla/trafficmanager/TrafficManagerServer.h +++ b/LibCarla/source/carla/trafficmanager/TrafficManagerServer.h @@ -119,6 +119,12 @@ public: tm->SetDistanceToLeadingVehicle(carla::client::detail::ActorVariant(actor).Get(tm->GetEpisodeProxy()), distance); }); + /// Method to the Global Distance to Leading vehicle + + server->bind("set_global_distance_to_leading_vehicle", [=]( const float distance) { + tm->SetGlobalDistanceToLeadingVehicle(distance); + }); + /// Method to specify the % chance of running any traffic light. server->bind("set_percentage_running_light", [=](carla::rpc::Actor actor, const float percentage) { tm->SetPercentageRunningLight(carla::client::detail::ActorVariant(actor).Get(tm->GetEpisodeProxy()), percentage); diff --git a/PythonAPI/carla/source/libcarla/TrafficManager.cpp b/PythonAPI/carla/source/libcarla/TrafficManager.cpp index 343190420..9fcb686dd 100644 --- a/PythonAPI/carla/source/libcarla/TrafficManager.cpp +++ b/PythonAPI/carla/source/libcarla/TrafficManager.cpp @@ -27,5 +27,6 @@ void export_trafficmanager() { .def("ignore_walkers_percentage", &carla::traffic_manager::TrafficManager::SetPercentageIgnoreWalkers) .def("ignore_vehicles_percentage", &carla::traffic_manager::TrafficManager::SetPercentageIgnoreVehicles) .def("ignore_lights_percentage", &carla::traffic_manager::TrafficManager::SetPercentageRunningLight) - .def("ignore_signs_percentage", &carla::traffic_manager::TrafficManager::SetPercentageRunningSign); + .def("ignore_signs_percentage", &carla::traffic_manager::TrafficManager::SetPercentageRunningSign) + .def("set_global_distance_to_leading_vehicle", &carla::traffic_manager::TrafficManager::SetGlobalDistanceToLeadingVehicle); } diff --git a/PythonAPI/examples/spawn_npc.py b/PythonAPI/examples/spawn_npc.py index 0c6f517e5..817212322 100755 --- a/PythonAPI/examples/spawn_npc.py +++ b/PythonAPI/examples/spawn_npc.py @@ -91,6 +91,7 @@ def main(): try: traffic_manager = client.get_trafficmanager(args.tm_port) + traffic_manager.set_global_distance_to_leading_vehicle(2.0) world = client.get_world() synchronous_master = False