27#include "modules/common_msgs/planning_msgs/planning_internal.pb.h"
43 const std::shared_ptr<DependencyInjector>& injector) {
44 if (!TrafficRule::Init(name, injector)) {
48 return TrafficRule::LoadConfig<TrafficLightConfig>(&config_);
53 MakeDecisions(frame, reference_line_info);
58void TrafficLight::MakeDecisions(
Frame*
const frame,
61 CHECK_NOTNULL(reference_line_info);
63 if (!config_.enabled()) {
67 const auto& traffic_light_status =
68 injector_->planning_context()->planning_status().traffic_light();
76 ->mutable_planning_data()
77 ->mutable_signal_light();
78 signal_light_debug->set_adc_front_s(adc_front_edge_s);
79 signal_light_debug->set_adc_speed(
80 injector_->vehicle_state()->linear_velocity());
82 const std::vector<PathOverlap>& traffic_light_overlaps =
84 for (
const auto& traffic_light_overlap : traffic_light_overlaps) {
85 if (traffic_light_overlap.end_s <= adc_back_edge_s) {
90 bool traffic_light_done =
false;
91 for (
const auto& done_traffic_light_overlap_id :
92 traffic_light_status.done_traffic_light_overlap_id()) {
93 if (traffic_light_overlap.object_id == done_traffic_light_overlap_id) {
94 traffic_light_done =
true;
98 if (traffic_light_done) {
103 static constexpr double kSDiscrepanceTolerance = 10.0;
104 const auto& reference_line = reference_line_info->
reference_line();
105 common::SLPoint traffic_light_sl;
106 traffic_light_sl.set_s(traffic_light_overlap.start_s);
107 traffic_light_sl.set_l(0);
108 common::math::Vec2d traffic_light_point;
109 reference_line.
SLToXY(traffic_light_sl, &traffic_light_point);
110 common::math::Vec2d adc_position = {injector_->vehicle_state()->x(),
111 injector_->vehicle_state()->y()};
112 const double distance =
114 const double s_distance = traffic_light_overlap.start_s - adc_front_edge_s;
115 ADEBUG <<
"traffic_light[" << traffic_light_overlap.object_id
116 <<
"] start_s[" << traffic_light_overlap.start_s <<
"] s_distance["
117 << s_distance <<
"] actual_distance[" << distance <<
"]";
118 if (s_distance >= 0 &&
119 fabs(s_distance - distance) > kSDiscrepanceTolerance) {
120 ADEBUG <<
"SKIP traffic_light[" << traffic_light_overlap.object_id
121 <<
"] close in position, but far away along reference line";
127 const double stop_deceleration = util::GetADCStopDeceleration(
128 injector_->vehicle_state(), adc_front_edge_s,
129 traffic_light_overlap.start_s);
130 ADEBUG <<
"traffic_light_id[" << traffic_light_overlap.object_id
131 <<
"] start_s[" << traffic_light_overlap.start_s <<
"] color["
132 << signal_color <<
"] stop_deceleration[" << stop_deceleration
136 planning_internal::SignalLightDebug::SignalDebug* signal_debug =
137 signal_light_debug->add_signal();
138 signal_debug->set_adc_stop_deceleration(stop_deceleration);
139 signal_debug->set_color(signal_color);
140 signal_debug->set_light_id(traffic_light_overlap.object_id);
141 signal_debug->set_light_stop_s(traffic_light_overlap.start_s);
150 if (stop_deceleration > config_.max_stop_deceleration()) {
151 AWARN <<
"stop_deceleration too big to achieve. SKIP red light";
156 ADEBUG <<
"BuildStopDecision: traffic_light["
157 << traffic_light_overlap.object_id <<
"] start_s["
158 << traffic_light_overlap.start_s <<
"]"
159 <<
"stop_distance: " << config_.stop_distance();
160 std::string virtual_obstacle_id =
161 TRAFFIC_LIGHT_VO_ID_PREFIX + traffic_light_overlap.object_id;
162 const std::vector<std::string> wait_for_obstacles;
163 util::BuildStopDecision(
164 virtual_obstacle_id, traffic_light_overlap.start_s,
165 config_.stop_distance(), StopReasonCode::STOP_REASON_SIGNAL,
166 wait_for_obstacles, Getname(), frame, reference_line_info);
A general class to denote the return status of an API call.
const std::vector< PathOverlap > & signal_overlaps() const
Frame holds all data for one planning cycle.
perception::TrafficLight GetSignal(const std::string &traffic_light_id) const
ReferenceLineInfo holds all data for one reference line.
const ReferenceLine & reference_line() const
planning_internal::Debug * mutable_debug()
const SLBoundary & AdcSlBoundary() const
const hdmap::Path & map_path() const
bool SLToXY(const common::SLPoint &sl_point, common::math::Vec2d *const xy_point) const
bool Init(const std::string &name, const std::shared_ptr< DependencyInjector > &injector) override
Planning module main class.
double DistanceXY(const U &u, const V &v)
calculate the distance beteween Point u and Point v, which are all have member function x() and y() i...