Implemented TrafficManager::SetDistanceToLeadingVehicle
This commit is contained in:
parent
63523a38aa
commit
901745599e
|
@ -6,10 +6,10 @@ namespace CollisionStageConstants {
|
||||||
static const float SEARCH_RADIUS = 20.0f;
|
static const float SEARCH_RADIUS = 20.0f;
|
||||||
static const float VERTICAL_OVERLAP_THRESHOLD = 2.0f;
|
static const float VERTICAL_OVERLAP_THRESHOLD = 2.0f;
|
||||||
static const float ZERO_AREA = 0.0001f;
|
static const float ZERO_AREA = 0.0001f;
|
||||||
static const float BOUNDARY_EXTENSION_MINIMUM = 1.5f;
|
static const float BOUNDARY_EXTENSION_MINIMUM = 0.5f;
|
||||||
static const float EXTENSION_SQUARE_POINT = 7.0f;
|
static const float EXTENSION_SQUARE_POINT = 7.0f;
|
||||||
static const float TIME_HORIZON = 0.5f;
|
static const float TIME_HORIZON = 0.5f;
|
||||||
static const float HIGHWAY_SPEED = 50 / 3.6f;
|
static const float HIGHWAY_SPEED = 50.0f / 3.6f;
|
||||||
static const float HIGHWAY_TIME_HORIZON = 5.0f;
|
static const float HIGHWAY_TIME_HORIZON = 5.0f;
|
||||||
}
|
}
|
||||||
using namespace CollisionStageConstants;
|
using namespace CollisionStageConstants;
|
||||||
|
@ -19,11 +19,13 @@ namespace CollisionStageConstants {
|
||||||
std::shared_ptr<CollisionToPlannerMessenger> planner_messenger,
|
std::shared_ptr<CollisionToPlannerMessenger> planner_messenger,
|
||||||
cc::World &world,
|
cc::World &world,
|
||||||
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> &selective_collision,
|
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> &selective_collision,
|
||||||
|
AtomicMap<ActorId, float> &distance_to_leading_vehicle,
|
||||||
cc::DebugHelper &debug_helper)
|
cc::DebugHelper &debug_helper)
|
||||||
: localization_messenger(localization_messenger),
|
: localization_messenger(localization_messenger),
|
||||||
planner_messenger(planner_messenger),
|
planner_messenger(planner_messenger),
|
||||||
world(world),
|
world(world),
|
||||||
selective_collision(selective_collision),
|
selective_collision(selective_collision),
|
||||||
|
distance_to_leading_vehicle(distance_to_leading_vehicle),
|
||||||
debug_helper(debug_helper) {
|
debug_helper(debug_helper) {
|
||||||
|
|
||||||
// Initializing clock for checking unregistered actors periodically.
|
// Initializing clock for checking unregistered actors periodically.
|
||||||
|
@ -248,27 +250,41 @@ namespace CollisionStageConstants {
|
||||||
if (vehicle_id_to_index.find(actor->GetId()) != vehicle_id_to_index.end()) {
|
if (vehicle_id_to_index.find(actor->GetId()) != vehicle_id_to_index.end()) {
|
||||||
|
|
||||||
float velocity = actor->GetVelocity().Length();
|
float velocity = actor->GetVelocity().Length();
|
||||||
|
cg::Location vehicle_location = actor->GetLocation();
|
||||||
|
|
||||||
float bbox_extension =
|
float bbox_extension =
|
||||||
(std::max(std::sqrt(EXTENSION_SQUARE_POINT * velocity), BOUNDARY_EXTENSION_MINIMUM) +
|
(std::max(std::sqrt(EXTENSION_SQUARE_POINT * velocity), BOUNDARY_EXTENSION_MINIMUM) +
|
||||||
std::max(velocity * TIME_HORIZON, BOUNDARY_EXTENSION_MINIMUM) +
|
std::max(velocity * TIME_HORIZON, BOUNDARY_EXTENSION_MINIMUM) +
|
||||||
BOUNDARY_EXTENSION_MINIMUM);
|
BOUNDARY_EXTENSION_MINIMUM);
|
||||||
|
|
||||||
bbox_extension = (velocity > HIGHWAY_SPEED) ? (HIGHWAY_TIME_HORIZON * velocity) : bbox_extension;
|
bbox_extension = (velocity > HIGHWAY_SPEED) ? (HIGHWAY_TIME_HORIZON * velocity) : bbox_extension;
|
||||||
|
|
||||||
|
if (distance_to_leading_vehicle.Contains(actor->GetId())) {
|
||||||
|
bbox_extension = std::max(distance_to_leading_vehicle.GetValue(actor->GetId()), bbox_extension);
|
||||||
|
}
|
||||||
|
|
||||||
auto &waypoint_buffer = localization_frame->at(vehicle_id_to_index.at(actor->GetId())).buffer;
|
auto &waypoint_buffer = localization_frame->at(vehicle_id_to_index.at(actor->GetId())).buffer;
|
||||||
|
|
||||||
LocationList left_boundary;
|
LocationList left_boundary;
|
||||||
LocationList right_boundary;
|
LocationList right_boundary;
|
||||||
auto vehicle = boost::static_pointer_cast<cc::Vehicle>(actor);
|
auto vehicle = boost::static_pointer_cast<cc::Vehicle>(actor);
|
||||||
float width = vehicle->GetBoundingBox().extent.y;
|
float width = vehicle->GetBoundingBox().extent.y;
|
||||||
|
float length = vehicle->GetBoundingBox().extent.x;
|
||||||
|
|
||||||
SimpleWaypointPtr boundary_start = waypoint_buffer->front();
|
SimpleWaypointPtr boundary_start = waypoint_buffer->front();
|
||||||
SimpleWaypointPtr boundary_end = waypoint_buffer->front();
|
uint boundary_start_index = 0u;
|
||||||
|
while (boundary_start->DistanceSquared(vehicle_location) < std::pow(length, 2) &&
|
||||||
|
boundary_start_index < waypoint_buffer->size() -1) {
|
||||||
|
boundary_start = waypoint_buffer->at(boundary_start_index);
|
||||||
|
++boundary_start_index;
|
||||||
|
}
|
||||||
|
SimpleWaypointPtr boundary_end = waypoint_buffer->at(boundary_start_index);
|
||||||
|
|
||||||
auto vehicle_reference = boost::static_pointer_cast<cc::Vehicle>(actor);
|
auto vehicle_reference = boost::static_pointer_cast<cc::Vehicle>(actor);
|
||||||
// At non-signalized junctions, we extend the boundary across the junction
|
// At non-signalized junctions, we extend the boundary across the junction
|
||||||
// and
|
// and
|
||||||
// in all other situations, boundary length is velocity-dependent.
|
// in all other situations, boundary length is velocity-dependent.
|
||||||
for (uint j = 0u;
|
for (uint j = boundary_start_index;
|
||||||
(boundary_start->DistanceSquared(boundary_end) < std::pow(bbox_extension, 2)) &&
|
(boundary_start->DistanceSquared(boundary_end) < std::pow(bbox_extension, 2)) &&
|
||||||
(j < waypoint_buffer->size());
|
(j < waypoint_buffer->size());
|
||||||
++j) {
|
++j) {
|
||||||
|
|
|
@ -64,6 +64,8 @@ namespace bg = boost::geometry;
|
||||||
cc::World &world;
|
cc::World &world;
|
||||||
/// Map specifying selective collision avoidance rules between vehicles.
|
/// Map specifying selective collision avoidance rules between vehicles.
|
||||||
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> &selective_collision;
|
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> &selective_collision;
|
||||||
|
/// Map specifying distance to leading vehicle.
|
||||||
|
AtomicMap<ActorId, float> &distance_to_leading_vehicle;
|
||||||
/// Reference to Carla's debug helper object.
|
/// Reference to Carla's debug helper object.
|
||||||
cc::DebugHelper &debug_helper;
|
cc::DebugHelper &debug_helper;
|
||||||
/// An object used for grid binning vehicles for faster proximity detection.
|
/// An object used for grid binning vehicles for faster proximity detection.
|
||||||
|
@ -110,7 +112,9 @@ namespace bg = boost::geometry;
|
||||||
std::shared_ptr<CollisionToPlannerMessenger> planner_messenger,
|
std::shared_ptr<CollisionToPlannerMessenger> planner_messenger,
|
||||||
cc::World &world,
|
cc::World &world,
|
||||||
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> &selective_collision,
|
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> &selective_collision,
|
||||||
|
AtomicMap<ActorId, float> &distance_to_leading_vehicle,
|
||||||
cc::DebugHelper &debug_helper);
|
cc::DebugHelper &debug_helper);
|
||||||
|
|
||||||
~CollisionStage();
|
~CollisionStage();
|
||||||
|
|
||||||
void DataReceiver() override;
|
void DataReceiver() override;
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace traffic_manager {
|
||||||
|
|
||||||
collision_stage = std::make_unique<CollisionStage>(
|
collision_stage = std::make_unique<CollisionStage>(
|
||||||
localization_collision_messenger, collision_planner_messenger,
|
localization_collision_messenger, collision_planner_messenger,
|
||||||
world, ignore_collision, debug_helper);
|
world, ignore_collision, distance_to_leading_vehicle, debug_helper);
|
||||||
|
|
||||||
traffic_light_stage = std::make_unique<TrafficLightStage>(
|
traffic_light_stage = std::make_unique<TrafficLightStage>(
|
||||||
localization_traffic_light_messenger, traffic_light_planner_messenger);
|
localization_traffic_light_messenger, traffic_light_planner_messenger);
|
||||||
|
@ -88,11 +88,11 @@ namespace traffic_manager {
|
||||||
return *singleton_pointer.get();
|
return *singleton_pointer.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficManager::RegisterVehicles(std::vector<ActorPtr> actor_list) {
|
void TrafficManager::RegisterVehicles(const std::vector<ActorPtr> &actor_list) {
|
||||||
registered_actors.Insert(actor_list);
|
registered_actors.Insert(actor_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficManager::UnregisterVehicles(std::vector<ActorPtr> actor_list) {
|
void TrafficManager::UnregisterVehicles(const std::vector<ActorPtr> &actor_list) {
|
||||||
registered_actors.Remove(actor_list);
|
registered_actors.Remove(actor_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,15 +128,15 @@ namespace traffic_manager {
|
||||||
control_stage->Stop();
|
control_stage->Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficManager::SetVehicleTargetVelocity(ActorId actor_id, float velocity) {
|
void TrafficManager::SetVehicleTargetVelocity(const ActorPtr &actor, const float velocity) {
|
||||||
|
|
||||||
vehicle_target_velocity.AddEntry({actor_id, velocity});
|
vehicle_target_velocity.AddEntry({actor->GetId(), velocity});
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficManager::SetCollisionDetection(
|
void TrafficManager::SetCollisionDetection(
|
||||||
ActorPtr reference_actor,
|
const ActorPtr &reference_actor,
|
||||||
ActorPtr other_actor,
|
const ActorPtr &other_actor,
|
||||||
bool detect_collision) {
|
const bool detect_collision) {
|
||||||
|
|
||||||
ActorId reference_id = reference_actor->GetId();
|
ActorId reference_id = reference_actor->GetId();
|
||||||
ActorId other_id = other_actor->GetId();
|
ActorId other_id = other_actor->GetId();
|
||||||
|
@ -165,15 +165,21 @@ namespace traffic_manager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficManager::ForceLaneChange(ActorPtr actor, bool direction) {
|
void TrafficManager::ForceLaneChange(const ActorPtr &actor, const bool direction) {
|
||||||
|
|
||||||
auto entry = std::make_pair(actor->GetId(), direction);
|
auto entry = std::make_pair(actor->GetId(), direction);
|
||||||
force_lane_change.AddEntry(entry);
|
force_lane_change.AddEntry(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficManager::AutoLaneChange(ActorPtr actor, bool enable) {
|
void TrafficManager::AutoLaneChange(const ActorPtr &actor, const bool enable) {
|
||||||
|
|
||||||
auto entry = std::make_pair(actor->GetId(), enable);
|
auto entry = std::make_pair(actor->GetId(), enable);
|
||||||
auto_lane_change.AddEntry(entry);
|
auto_lane_change.AddEntry(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TrafficManager::SetDistanceToLeadingVehicle(const ActorPtr &actor, const float distance) {
|
||||||
|
|
||||||
|
auto entry = std::make_pair(actor->GetId(), distance);
|
||||||
|
distance_to_leading_vehicle.AddEntry(entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,8 @@ namespace cc = carla::client;
|
||||||
static std::unique_ptr<TrafficManager> singleton_pointer;
|
static std::unique_ptr<TrafficManager> singleton_pointer;
|
||||||
/// Singleton lifecycle management mutex.
|
/// Singleton lifecycle management mutex.
|
||||||
// static std::mutex singleton_mutex;
|
// static std::mutex singleton_mutex;
|
||||||
|
/// Map containing distance to leading vehicle command.
|
||||||
|
AtomicMap<ActorId, float> distance_to_leading_vehicle;
|
||||||
|
|
||||||
/// Private constructor for singleton lifecycle management.
|
/// Private constructor for singleton lifecycle management.
|
||||||
TrafficManager(
|
TrafficManager(
|
||||||
|
@ -97,23 +99,29 @@ namespace cc = carla::client;
|
||||||
static TrafficManager& GetInstance(cc::Client &client_connection);
|
static TrafficManager& GetInstance(cc::Client &client_connection);
|
||||||
|
|
||||||
/// This method registers a vehicle with the traffic manager.
|
/// This method registers a vehicle with the traffic manager.
|
||||||
void RegisterVehicles(std::vector<ActorPtr> actor_list);
|
void RegisterVehicles(const std::vector<ActorPtr> &actor_list);
|
||||||
|
|
||||||
/// This method unregisters a vehicle from traffic manager.
|
/// This method unregisters a vehicle from traffic manager.
|
||||||
void UnregisterVehicles(std::vector<ActorPtr> actor_list);
|
void UnregisterVehicles(const std::vector<ActorPtr> &actor_list);
|
||||||
|
|
||||||
/// Set target velocity specific to a vehicle.
|
/// Set target velocity specific to a vehicle.
|
||||||
void SetVehicleTargetVelocity(ActorId actor_id, float velocity);
|
void SetVehicleTargetVelocity(const ActorPtr &actor, const float velocity);
|
||||||
|
|
||||||
/// Set collision detection rules between vehicles.
|
/// Set collision detection rules between vehicles.
|
||||||
void SetCollisionDetection(ActorPtr reference_actor, ActorPtr other_actor, bool detect_collision);
|
void SetCollisionDetection(const ActorPtr &reference_actor,
|
||||||
|
const ActorPtr &other_actor,
|
||||||
|
const bool detect_collision);
|
||||||
|
|
||||||
/// Method to force lane change on a vehicle.
|
/// Method to force lane change on a vehicle.
|
||||||
/// Direction flag can be set to true for left and false for right.
|
/// Direction flag can be set to true for left and false for right.
|
||||||
void ForceLaneChange(ActorPtr actor, bool direction);
|
void ForceLaneChange(const ActorPtr &actor, const bool direction);
|
||||||
|
|
||||||
/// Enable / disable automatic lane change on a vehicle.
|
/// Enable / disable automatic lane change on a vehicle.
|
||||||
void AutoLaneChange(ActorPtr actor, bool enable);
|
void AutoLaneChange(const ActorPtr &actor, const bool enable);
|
||||||
|
|
||||||
|
/// Method to specify how much distance a vehicle should maintain to
|
||||||
|
/// the leading vehicle.
|
||||||
|
void SetDistanceToLeadingVehicle(const ActorPtr &actor, const float distance);
|
||||||
|
|
||||||
/// Destructor.
|
/// Destructor.
|
||||||
~TrafficManager();
|
~TrafficManager();
|
||||||
|
|
|
@ -22,7 +22,8 @@ void export_trafficmanager() {
|
||||||
.def("set_vehicle_target_velocity", &traffic_manager::TrafficManager::SetVehicleTargetVelocity)
|
.def("set_vehicle_target_velocity", &traffic_manager::TrafficManager::SetVehicleTargetVelocity)
|
||||||
.def("set_collision_detection", &traffic_manager::TrafficManager::SetCollisionDetection)
|
.def("set_collision_detection", &traffic_manager::TrafficManager::SetCollisionDetection)
|
||||||
.def("force_lane_change", &traffic_manager::TrafficManager::ForceLaneChange)
|
.def("force_lane_change", &traffic_manager::TrafficManager::ForceLaneChange)
|
||||||
.def("set_auto_lane_change", &traffic_manager::TrafficManager::AutoLaneChange);
|
.def("set_auto_lane_change", &traffic_manager::TrafficManager::AutoLaneChange)
|
||||||
|
.def("set_distance_to_leading_vehicle", &traffic_manager::TrafficManager::SetDistanceToLeadingVehicle);
|
||||||
|
|
||||||
def("GetTrafficManager", &traffic_manager::TrafficManager::GetInstance, return_value_policy<reference_existing_object>());
|
def("GetTrafficManager", &traffic_manager::TrafficManager::GetInstance, return_value_policy<reference_existing_object>());
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,10 @@ def main():
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
for v in vehicle_list:
|
for v in vehicle_list:
|
||||||
if (v.id % 2 == 0):
|
if (v.id % 2 == 0):
|
||||||
traffic_manager.set_vehicle_target_velocity(v.id, 15.0/3.6)
|
traffic_manager.set_vehicle_target_velocity(v, 15.0/3.6)
|
||||||
|
traffic_manager.set_distance_to_leading_vehicle(v, 5)
|
||||||
|
else:
|
||||||
|
traffic_manager.set_distance_to_leading_vehicle(v, 10)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
Loading…
Reference in New Issue