19namespace traffic_manager {
21using namespace constants::MotionPlan;
22using namespace constants::WaypointSelection;
23using namespace constants::SpeedThreshold;
30 const std::vector<ActorId> &vehicle_id_list,
35 const std::vector<float> &urban_longitudinal_parameters,
36 const std::vector<float> &highway_longitudinal_parameters,
37 const std::vector<float> &urban_lateral_parameters,
38 const std::vector<float> &highway_lateral_parameters,
46 : vehicle_id_list(vehicle_id_list),
47 simulation_state(simulation_state),
48 parameters(parameters),
49 buffer_map(buffer_map),
50 track_traffic(track_traffic),
51 urban_longitudinal_parameters(urban_longitudinal_parameters),
52 highway_longitudinal_parameters(highway_longitudinal_parameters),
53 urban_lateral_parameters(urban_lateral_parameters),
54 highway_lateral_parameters(highway_lateral_parameters),
55 localization_frame(localization_frame),
56 collision_frame(collision_frame),
59 output_array(output_array),
60 random_device(random_device),
61 local_map(local_map) {}
71 const float vehicle_speed = vehicle_velocity.
Length();
79 const bool &tl_hazard =
tl_frame.at(index);
88 bool is_hero_alive = hero_location !=
cg::Location(0, 0, 0);
104 float dilate_factor = (upper_bound-lower_bound)/100.0f;
110 float random_sample = (
static_cast<float>(
random_device.
next())*dilate_factor) + lower_bound;
112 if (!teleport_waypoint_list.empty()) {
113 for (
auto &teleport_waypoint : teleport_waypoint_list) {
114 GeoGridId geogrid_id = teleport_waypoint->GetGeodesicGridId();
116 teleportation_transform = teleport_waypoint->GetTransform();
117 teleportation_transform.
location.
z += 0.5f;
129 vehicle_velocity, vehicle_speed_limit,
141 float max_landmark_target_velocity =
GetLandmarkTargetVelocity(*(waypoint_buffer.at(0)), vehicle_location, actor_id, max_target_velocity);
145 max_target_velocity = std::min(std::min(max_target_velocity, max_landmark_target_velocity), max_turn_target_velocity);
148 std::pair<bool, float> collision_response =
CollisionHandling(collision_hazard, tl_hazard, vehicle_velocity,
149 vehicle_heading, max_target_velocity);
150 bool collision_emergency_stop = collision_response.first;
151 float dynamic_target_velocity = collision_response.second;
154 bool safe_after_junction =
SafeAfterJunction(localization, tl_hazard, collision_emergency_stop);
157 bool emergency_stop = tl_hazard || collision_emergency_stop || !safe_after_junction;
165 cg::Location target_location = target_waypoint->GetLocation();
168 auto right_vector = target_waypoint->GetTransform().GetRightVector();
170 target_location = target_location + offset_location;
173 float dot_product =
DeviationDotProduct(vehicle_location, vehicle_heading, target_location);
175 dot_product = acos(dot_product) /
PI;
176 if (cross_product < 0.0f) {
179 dot_product *= -1.0f;
181 const float angular_deviation = dot_product;
182 const float velocity_deviation = (dynamic_target_velocity - vehicle_speed) / dynamic_target_velocity;
195 std::vector<float> longitudinal_parameters;
196 std::vector<float> lateral_parameters;
207 current_state = {
current_timestamp, angular_deviation, velocity_deviation, 0.0f};
210 actuation_signal =
PID::RunStep(current_state, previous_state,
211 longitudinal_parameters, lateral_parameters);
213 if (emergency_stop) {
214 actuation_signal.throttle = 0.0f;
215 actuation_signal.brake = 1.0f;
221 vehicle_control.
throttle = actuation_signal.throttle;
222 vehicle_control.
brake = actuation_signal.brake;
223 vehicle_control.
steer = actuation_signal.steer;
228 current_state.
steer = actuation_signal.steer;
230 state = current_state;
251 const float target_displacement = dynamic_target_velocity * HYBRID_MODE_DT_FL;
253 cg::Transform target_base_transform = teleport_target->GetTransform();
256 cg::Vector3D correct_heading = (target_base_location - vehicle_location).MakeSafeUnitVector(EPSILON);
258 if (vehicle_location.
Distance(target_base_location) < target_displacement) {
279 const bool tl_hazard,
280 const bool collision_emergency_stop) {
286 bool safe_after_junction =
true;
287 if (!tl_hazard && !collision_emergency_stop
289 && junction_end_point !=
nullptr && safe_point !=
nullptr
302 cg::Location mid_point = (junction_end_point->GetLocation() + safe_point->GetLocation())/2.0f;
306 std::set_difference(passing_safe_point.begin(), passing_safe_point.end(),
307 passing_junction_end_point.begin(), passing_junction_end_point.end(),
308 std::inserter(difference, difference.begin()));
310 if (difference.size() > 0) {
311 for (
const ActorId &blocking_id: difference) {
315 safe_after_junction =
false;
322 return safe_after_junction;
327 const bool tl_hazard,
330 const float max_target_velocity) {
331 bool collision_emergency_stop =
false;
332 float dynamic_target_velocity = max_target_velocity;
334 const float vehicle_speed = vehicle_velocity.
Length();
336 if (collision_hazard.
hazard && !tl_hazard) {
339 const float vehicle_relative_speed = (vehicle_velocity - other_velocity).Length();
344 const float other_speed_along_heading = cg::Math::Dot(other_velocity, vehicle_heading);
348 if (vehicle_relative_speed > EPSILON_RELATIVE_SPEED) {
352 if (available_distance_margin > follow_lead_distance) {
355 dynamic_target_velocity = other_speed_along_heading;
364 collision_emergency_stop =
true;
368 collision_emergency_stop =
true;
373 if (dynamic_target_velocity < vehicle_speed - max_gradual_velocity) {
375 dynamic_target_velocity = vehicle_speed - max_gradual_velocity;
377 dynamic_target_velocity = std::min(max_target_velocity, dynamic_target_velocity);
379 return {collision_emergency_stop, dynamic_target_velocity};
385 float max_target_velocity) {
390 float landmark_target_velocity = std::numeric_limits<float>::max();
393 auto all_landmarks = waypoint.
GetWaypoint()->GetAllLandmarksInDistance(max_distance,
false);
397 for (
auto &landmark: all_landmarks) {
399 auto landmark_location = landmark->GetWaypoint()->GetTransform().location;
400 auto landmark_type = landmark->GetType();
401 auto distance = landmark_location.Distance(vehicle_location);
403 if (distance > max_distance) {
408 float minimum_velocity = max_target_velocity;
409 if (landmark_type ==
"1000001") {
411 }
else if (landmark_type ==
"206") {
413 }
else if (landmark_type ==
"205") {
415 }
else if (landmark_type ==
"274") {
416 float value =
static_cast<float>(landmark->GetValue()) / 3.6f;
418 minimum_velocity = (value < max_target_velocity) ? value : max_target_velocity;
424 float v = std::max(((max_target_velocity - minimum_velocity) / max_distance) * distance + minimum_velocity, minimum_velocity);
425 landmark_target_velocity = std::min(landmark_target_velocity, v);
429 return landmark_target_velocity;
433 float max_target_velocity) {
435 if (waypoint_buffer.size() < 3) {
436 return max_target_velocity;
441 const SimpleWaypointPtr middle_waypoint = waypoint_buffer.at(
static_cast<uint16_t
>(waypoint_buffer.size() / 2));
445 middle_waypoint->GetLocation(),
446 last_waypoint->GetLocation());
457 float x1 = first_location.
x;
458 float y1 = first_location.
y;
459 float x2 = middle_location.
x;
460 float y2 = middle_location.
y;
461 float x3 = last_location.
x;
462 float y3 = last_location.
y;
473 float sx13 = x1 * x1 - x3 * x3;
474 float sy13 = y1 * y1 - y3 * y3;
475 float sx21 = x2 * x2 - x1 * x1;
476 float sy21 = y2 * y2 - y1 * y1;
478 float f_denom = 2 * (y31 * x12 - y21 * x13);
480 return std::numeric_limits<float>::max();
482 float f = (sx13 * x12 + sy13 * x12 + sx21 * x13 + sy21 * x13) / f_denom;
484 float g_denom = 2 * (x31 * y12 - x21 * y13);
486 return std::numeric_limits<float>::max();
488 float g = (sx13 * y12 + sy13 * y12 + sx21 * y13 + sy21 * y13) / g_denom;
490 float c = - (x1 * x1 + y1 * y1) - 2 * g * x1 - 2 * f * y1;
491 float c = - (x1 * x1 + y1 * y1) - 2 * g * x1 - 2 * f * y1;
495 return std::sqrt(h * h + k * k - c);
#define SQUARE(a)
This file contains various constants used in traffic manager arranged into sensible namespaces for re...
double elapsed_seconds
模拟自当前情境开始以来经过的秒数。
const Timestamp & GetTimestamp() const
WorldSnapshot GetSnapshot() const
返回当前世界的快照。 快照(Snapshot)包含了模拟世界在某一时刻的整体状态信息,例如所有参与者的位置、状态,天气情况等, 可以用于记录、对比不同时刻的世界状态或者进行一些基于特定时刻状态的分析和操...
auto Distance(const Location &loc) const
float SquaredLength() const
Vector3D MakeSafeUnitVector(const float epsilon) const
const LocalMapPtr & local_map
const std::vector< float > urban_longitudinal_parameters
cc::Timestamp current_timestamp
const LocalizationFrame & localization_frame
const BufferMap & buffer_map
const CollisionFrame & collision_frame
const std::vector< float > highway_lateral_parameters
std::unordered_map< ActorId, cc::Timestamp > teleportation_instance
TrackTraffic & track_traffic
float GetThreePointCircleRadius(cg::Location first_location, cg::Location middle_location, cg::Location last_location)
bool SafeAfterJunction(const LocalizationData &localization, const bool tl_hazard, const bool collision_emergency_stop)
ControlFrame & output_array
RandomGenerator & random_device
void Update(const unsigned long index)
更新方法。
const Parameters & parameters
MotionPlanStage(const std::vector< ActorId > &vehicle_id_list, SimulationState &simulation_state, const Parameters ¶meters, const BufferMap &buffer_map, TrackTraffic &track_traffic, const std::vector< float > &urban_longitudinal_parameters, const std::vector< float > &highway_longitudinal_parameters, const std::vector< float > &urban_lateral_parameters, const std::vector< float > &highway_lateral_parameters, const LocalizationFrame &localization_frame, const CollisionFrame &collision_frame, const TLFrame &tl_frame, const cc::World &world, ControlFrame &output_array, RandomGenerator &random_device, const LocalMapPtr &local_map)
const std::vector< float > highway_longitudinal_parameters
SimulationState & simulation_state
const std::vector< ActorId > & vehicle_id_list
float GetLandmarkTargetVelocity(const SimpleWaypoint &waypoint, const cg::Location vehicle_location, const ActorId actor_id, float max_target_velocity)
float GetTurnTargetVelocity(const Buffer &waypoint_buffer, float max_target_velocity)
void RemoveActor(const ActorId actor_id)
移除参与者方法。
const std::vector< float > urban_lateral_parameters
std::unordered_map< ActorId, StateEntry > pid_state_map
std::pair< bool, float > CollisionHandling(const CollisionHazardData &collision_hazard, const bool tl_hazard, const cg::Vector3D ego_velocity, const cg::Vector3D ego_heading, const float max_target_velocity)
float GetLaneOffset(const ActorId &actor_id) const
查询车辆车道偏移量的方法
float GetVehicleTargetVelocity(const ActorId &actor_id, const float speed_limit) const
查询车辆目标速度的方法
float GetUpperBoundaryRespawnDormantVehicles() const
获取车辆重生时与英雄车辆之间最大距离的方法
float GetLowerBoundaryRespawnDormantVehicles() const
获取车辆重生时与英雄车辆之间最小距离的方法
bool GetRespawnDormantVehicles() const
获取是否自动重生载具的方法
bool GetSynchronousMode() const
获取同步模式的方法
该类是Carla的Waypoint对象的简单封装。 该类用于表示世界地图的离散样本。
WaypointPtr GetWaypoint() const
返回指向carla::waypoint的共享指针。
cg::Location GetLocation(const ActorId actor_id) const
void UpdateKinematicHybridEndLocation(ActorId actor_id, cg::Location location)
cg::Vector3D GetHeading(const ActorId actor_id) const
void UpdateKinematicState(ActorId actor_id, KinematicState state)
float GetSpeedLimit(const ActorId actor_id) const
cg::Rotation GetRotation(const ActorId actor_id) const
cg::Vector3D GetVelocity(const ActorId actor_id) const
bool IsPhysicsEnabled(const ActorId actor_id) const
bool IsDormant(const ActorId actor_id) const
cg::Location GetHeroLocation() const
ActorIdSet GetPassingVehicles(uint64_t waypoint_id) const
bool IsGeoGridFree(const GeoGridId geogrid_id) const
void AddTakenGrid(const GeoGridId geogrid_id, const ActorId actor_id)
ActuationSignal RunStep(StateEntry present_state, StateEntry previous_state, const std::vector< float > &longitudinal_parameters, const std::vector< float > &lateral_parameters)
此函数计算基于车辆当前状态变化的执行信号,以最小化 PID 错误。
static const float EPSILON
static const double HYBRID_MODE_DT
static const float HYBRID_MODE_DT_FL
static const float PERC_MAX_SLOWDOWN
static const float LANDMARK_DETECTION_TIME
static const float FRICTION
static const float CRITICAL_BRAKING_MARGIN
static const float FOLLOW_LEAD_FACTOR
static const float MAX_JUNCTION_BLOCK_DISTANCE
static const float RELATIVE_APPROACH_SPEED
static const float TL_TARGET_VELOCITY
static const uint16_t ATTEMPTS_TO_TELEPORT
static const float GRAVITY
static const float MIN_FOLLOW_LEAD_DISTANCE
static const float STOP_TARGET_VELOCITY
static const float YIELD_TARGET_VELOCITY
static const float AFTER_JUNCTION_MIN_SPEED
static const float HIGHWAY_SPEED
static const float TARGET_WAYPOINT_TIME_HORIZON
static const float MIN_SAFE_INTERVAL_LENGTH
static const float MIN_TARGET_WAYPOINT_DISTANCE
std::vector< SimpleWaypointPtr > NodeList
std::vector< carla::rpc::Command > ControlFrame
std::vector< bool > TLFrame
std::deque< std::shared_ptr< SimpleWaypoint > > Buffer
std::vector< CollisionHazardData > CollisionFrame
float DeviationCrossProduct(const cg::Location &reference_location, const cg::Vector3D &heading_vector, const cg::Location &target_location)
返回车辆朝向向量与指向下一个目标路点方向向量之间的叉积(z分量值)
std::shared_ptr< InMemoryMap > LocalMapPtr
本地地图指针类型,使用智能指针管理InMemoryMap对象
std::shared_ptr< SimpleWaypoint > SimpleWaypointPtr
TargetWPInfo GetTargetWaypoint(const Buffer &waypoint_buffer, const float &target_point_distance)
carla::ActorId ActorId
参与者的智能指针类型
std::unordered_set< ActorId > ActorIdSet
std::vector< LocalizationData > LocalizationFrame
std::unordered_map< carla::ActorId, Buffer > BufferMap
float DeviationDotProduct(const cg::Location &reference_location, const cg::Vector3D &heading_vector, const cg::Location &target_location)
返回车辆朝向向量与指向下一个目标路点方向向量之间的点积
float available_distance_margin
SimpleWaypointPtr safe_point
bool is_at_junction_entrance
SimpleWaypointPtr junction_end_point