libcarla/include/carla/trafficmanager/Parameters.h

300 lines
12 KiB
C
Raw Normal View History

2024-10-18 13:19:59 +08:00
// Copyright (c) 2020 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include <atomic>
#include <chrono>
#include <random>
#include <unordered_map>
#include "carla/client/Actor.h"
#include "carla/client/Vehicle.h"
#include "carla/Memory.h"
#include "carla/rpc/ActorId.h"
#include "carla/trafficmanager/AtomicActorSet.h"
#include "carla/trafficmanager/AtomicMap.h"
namespace carla {
namespace traffic_manager {
namespace cc = carla::client;
namespace cg = carla::geom;
using ActorPtr = carla::SharedPtr<cc::Actor>;
using ActorId = carla::ActorId;
using Path = std::vector<cg::Location>;
using Route = std::vector<uint8_t>;
struct ChangeLaneInfo {
bool change_lane = false;
bool direction = false;
};
class Parameters {
private:
/// Target velocity map for individual vehicles, based on a % diffrerence from speed limit.
AtomicMap<ActorId, float> percentage_difference_from_speed_limit;
/// Lane offset map for individual vehicles.
AtomicMap<ActorId, float> lane_offset;
/// Target velocity map for individual vehicles, based on a desired velocity.
AtomicMap<ActorId, float> exact_desired_speed;
/// Global target velocity limit % difference.
float global_percentage_difference_from_limit = 0;
/// Global lane offset
float global_lane_offset = 0;
/// Map containing a set of actors to be ignored during collision detection.
AtomicMap<ActorId, std::shared_ptr<AtomicActorSet>> ignore_collision;
/// Map containing distance to leading vehicle command.
AtomicMap<ActorId, float> distance_to_leading_vehicle;
/// Map containing force lane change commands.
AtomicMap<ActorId, ChangeLaneInfo> force_lane_change;
/// Map containing auto lane change commands.
AtomicMap<ActorId, bool> auto_lane_change;
/// Map containing % of running a traffic light.
AtomicMap<ActorId, float> perc_run_traffic_light;
/// Map containing % of running a traffic sign.
AtomicMap<ActorId, float> perc_run_traffic_sign;
/// Map containing % of ignoring walkers.
AtomicMap<ActorId, float> perc_ignore_walkers;
/// Map containing % of ignoring vehicles.
AtomicMap<ActorId, float> perc_ignore_vehicles;
/// Map containing % of keep right rule.
AtomicMap<ActorId, float> perc_keep_right;
/// Map containing % of random left lane change.
AtomicMap<ActorId, float> perc_random_left;
/// Map containing % of random right lane change.
AtomicMap<ActorId, float> perc_random_right;
/// Map containing the automatic vehicle lights update flag
AtomicMap<ActorId, bool> auto_update_vehicle_lights;
/// Synchronous mode switch.
std::atomic<bool> synchronous_mode{false};
/// Distance margin
std::atomic<float> distance_margin{2.0};
/// Hybrid physics mode switch.
std::atomic<bool> hybrid_physics_mode{false};
/// Automatic respawn mode switch.
std::atomic<bool> respawn_dormant_vehicles{false};
/// Minimum distance to respawn vehicles with respect to the hero vehicle.
std::atomic<float> respawn_lower_bound{100.0};
/// Maximum distance to respawn vehicles with respect to the hero vehicle.
std::atomic<float> respawn_upper_bound{1000.0};
/// Minimum possible distance to respawn vehicles with respect to the hero vehicle.
float min_lower_bound;
/// Maximum possible distance to respawn vehicles with respect to the hero vehicle.
float max_upper_bound;
/// Hybrid physics radius.
std::atomic<float> hybrid_physics_radius {70.0};
/// Parameter specifying Open Street Map mode.
std::atomic<bool> osm_mode {true};
/// Parameter specifying if importing a custom path.
AtomicMap<ActorId, bool> upload_path;
/// Structure to hold all custom paths.
AtomicMap<ActorId, Path> custom_path;
/// Parameter specifying if importing a custom route.
AtomicMap<ActorId, bool> upload_route;
/// Structure to hold all custom routes.
AtomicMap<ActorId, Route> custom_route;
public:
Parameters();
~Parameters();
////////////////////////////////// SETTERS /////////////////////////////////////
/// Set a vehicle's % decrease in velocity with respect to the speed limit.
/// If less than 0, it's a % increase.
void SetPercentageSpeedDifference(const ActorPtr &actor, const float percentage);
/// Method to set a lane offset displacement from the center line.
/// Positive values imply a right offset while negative ones mean a left one.
void SetLaneOffset(const ActorPtr &actor, const float offset);
/// Set a vehicle's exact desired velocity.
void SetDesiredSpeed(const ActorPtr &actor, const float value);
/// Set a global % decrease in velocity with respect to the speed limit.
/// If less than 0, it's a % increase.
void SetGlobalPercentageSpeedDifference(float const percentage);
/// Method to set a global lane offset displacement from the center line.
/// Positive values imply a right offset while negative ones mean a left one.
void SetGlobalLaneOffset(float const offset);
/// Method to set collision detection rules between vehicles.
void SetCollisionDetection(
const ActorPtr &reference_actor,
const ActorPtr &other_actor,
const bool detect_collision);
/// Method to force lane change on a vehicle.
/// Direction flag can be set to true for left and false for right.
void SetForceLaneChange(const ActorPtr &actor, const bool direction);
/// Enable/disable automatic lane change on a vehicle.
void SetAutoLaneChange(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);
/// Method to set % to run any traffic sign.
void SetPercentageRunningSign(const ActorPtr &actor, const float perc);
/// Method to set % to run any traffic light.
void SetPercentageRunningLight(const ActorPtr &actor, const float perc);
/// Method to set % to ignore any vehicle.
void SetPercentageIgnoreVehicles(const ActorPtr &actor, const float perc);
/// Method to set % to ignore any vehicle.
void SetPercentageIgnoreWalkers(const ActorPtr &actor, const float perc);
/// Method to set % to keep on the right lane.
void SetKeepRightPercentage(const ActorPtr &actor, const float percentage);
/// Method to set % to randomly do a left lane change.
void SetRandomLeftLaneChangePercentage(const ActorPtr &actor, const float percentage);
/// Method to set % to randomly do a right lane change.
void SetRandomRightLaneChangePercentage(const ActorPtr &actor, const float percentage);
/// Method to set the automatic vehicle light state update flag.
void SetUpdateVehicleLights(const ActorPtr &actor, const bool do_update);
/// Method to set the distance to leading vehicle for all registered vehicles.
void SetGlobalDistanceToLeadingVehicle(const float dist);
/// Set Synchronous mode time out.
void SetSynchronousModeTimeOutInMiliSecond(const double time);
/// Method to set hybrid physics mode.
void SetHybridPhysicsMode(const bool mode_switch);
/// Method to set synchronous mode.
void SetSynchronousMode(const bool mode_switch = true);
/// Method to set hybrid physics radius.
void SetHybridPhysicsRadius(const float radius);
/// Method to set Open Street Map mode.
void SetOSMMode(const bool mode_switch);
/// Method to set if we are automatically respawning vehicles.
void SetRespawnDormantVehicles(const bool mode_switch);
/// Method to set boundaries for respawning vehicles.
void SetBoundariesRespawnDormantVehicles(const float lower_bound, const float upper_bound);
/// Method to set limits for boundaries when respawning vehicles.
void SetMaxBoundaries(const float lower, const float upper);
/// Method to set our own imported path.
void SetCustomPath(const ActorPtr &actor, const Path path, const bool empty_buffer);
/// Method to remove a list of points.
void RemoveUploadPath(const ActorId &actor_id, const bool remove_path);
/// Method to update an already set list of points.
void UpdateUploadPath(const ActorId &actor_id, const Path path);
/// Method to set our own imported route.
void SetImportedRoute(const ActorPtr &actor, const Route route, const bool empty_buffer);
/// Method to remove a route.
void RemoveImportedRoute(const ActorId &actor_id, const bool remove_path);
/// Method to update an already set route.
void UpdateImportedRoute(const ActorId &actor_id, const Route route);
///////////////////////////////// GETTERS /////////////////////////////////////
/// Method to retrieve hybrid physics radius.
float GetHybridPhysicsRadius() const;
/// Method to query target velocity for a vehicle.
float GetVehicleTargetVelocity(const ActorId &actor_id, const float speed_limit) const;
/// Method to query lane offset for a vehicle.
float GetLaneOffset(const ActorId &actor_id) const;
/// Method to query collision avoidance rule between a pair of vehicles.
bool GetCollisionDetection(const ActorId &reference_actor_id, const ActorId &other_actor_id) const;
/// Method to query lane change command for a vehicle.
ChangeLaneInfo GetForceLaneChange(const ActorId &actor_id);
/// Method to query percentage probability of keep right rule for a vehicle.
float GetKeepRightPercentage(const ActorId &actor_id);
/// Method to query percentage probability of a random right lane change for a vehicle.
float GetRandomLeftLaneChangePercentage(const ActorId &actor_id);
/// Method to query percentage probability of a random left lane change for a vehicle.
float GetRandomRightLaneChangePercentage(const ActorId &actor_id);
/// Method to query auto lane change rule for a vehicle.
bool GetAutoLaneChange(const ActorId &actor_id) const;
/// Method to query distance to leading vehicle for a given vehicle.
float GetDistanceToLeadingVehicle(const ActorId &actor_id) const;
/// Method to get % to run any traffic light.
float GetPercentageRunningSign(const ActorId &actor_id) const;
/// Method to get % to run any traffic light.
float GetPercentageRunningLight(const ActorId &actor_id) const;
/// Method to get % to ignore any vehicle.
float GetPercentageIgnoreVehicles(const ActorId &actor_id) const;
/// Method to get % to ignore any walker.
float GetPercentageIgnoreWalkers(const ActorId &actor_id) const;
/// Method to get if the vehicle lights should be updates automatically
bool GetUpdateVehicleLights(const ActorId &actor_id) const;
/// Method to get synchronous mode.
bool GetSynchronousMode() const;
/// Get synchronous mode time out
double GetSynchronousModeTimeOutInMiliSecond() const;
/// Method to retrieve hybrid physics mode.
bool GetHybridPhysicsMode() const;
/// Method to retrieve if we are automatically respawning vehicles.
bool GetRespawnDormantVehicles() const;
/// Method to retrieve minimum distance from hero vehicle when respawning vehicles.
float GetLowerBoundaryRespawnDormantVehicles() const;
/// Method to retrieve maximum distance from hero vehicle when respawning vehicles.
float GetUpperBoundaryRespawnDormantVehicles() const;
/// Method to get Open Street Map mode.
bool GetOSMMode() const;
/// Method to get if we are uploading a path.
bool GetUploadPath(const ActorId &actor_id) const;
/// Method to get a custom path.
Path GetCustomPath(const ActorId &actor_id) const;
/// Method to get if we are uploading a route.
bool GetUploadRoute(const ActorId &actor_id) const;
/// Method to get a custom route.
Route GetImportedRoute(const ActorId &actor_id) const;
/// Synchronous mode time out variable.
std::chrono::duration<double, std::milli> synchronous_time_out;
};
} // namespace traffic_manager
} // namespace carla