27using ::apollo::hdmap::LaneInfo;
30 const double start_s,
const double length,
const bool consider_lane_split,
31 std::shared_ptr<const LaneInfo> lane_info_ptr) {
32 std::string lane_id = lane_info_ptr->id().id();
33 RoadGraph road_graph(start_s, length, consider_lane_split, lane_info_ptr);
40 const double start_s,
const double length,
bool is_on_lane,
41 std::shared_ptr<const LaneInfo> lane_info_ptr) {
42 RoadGraph road_graph(start_s, length,
true, lane_info_ptr);
49 const std::string& lane_id,
50 const double lane_s,
const double lane_l) {
52 lane_obstacle.set_obstacle_id(obstacle_id);
53 lane_obstacle.set_lane_id(lane_id);
54 lane_obstacle.set_lane_s(lane_s);
55 lane_obstacle.set_lane_l(lane_l);
56 lane_obstacles_[lane_id].push_back(std::move(lane_obstacle));
60 lane_obstacles_.clear();
64 for (
auto iter = lane_obstacles_.begin(); iter != lane_obstacles_.end();
66 std::sort(iter->second.begin(), iter->second.end(),
68 return obs0.lane_s() < obs1.lane_s();
74 const LaneSequence& lane_sequence,
const int obstacle_id,
75 const double obstacle_s,
const double obstacle_l,
77 double accumulated_s = 0.0;
79 std::string lane_id = lane_segment.lane_id();
80 double lane_length = lane_segment.total_length();
81 if (lane_obstacles_.find(lane_id) == lane_obstacles_.end() ||
82 lane_obstacles_[lane_id].empty()) {
83 accumulated_s += lane_length;
86 for (
const LaneObstacle& lane_obstacle : lane_obstacles_[lane_id]) {
87 if (lane_obstacle.obstacle_id() == obstacle_id) {
90 double relative_s = accumulated_s + lane_obstacle.lane_s() - obstacle_s;
91 double relative_l = lane_obstacle.lane_l() - obstacle_l;
92 if (relative_s > 0.0) {
93 nearby_obstacle_ptr->set_id(lane_obstacle.obstacle_id());
94 nearby_obstacle_ptr->set_s(relative_s);
95 nearby_obstacle_ptr->set_l(relative_l);
104 const LaneSequence& lane_sequence,
const int obstacle_id,
105 const double obstacle_s,
const double obstacle_l,
108 AERROR <<
"Empty lane sequence found.";
112 std::string lane_id = lane_segment.
lane_id();
115 if (lane_obstacles_.find(lane_id) != lane_obstacles_.end() &&
116 !lane_obstacles_[lane_id].empty()) {
117 for (
int i =
static_cast<int>(lane_obstacles_[lane_id].size()) - 1; i >= 0;
119 const LaneObstacle& lane_obstacle = lane_obstacles_[lane_id][i];
123 double relative_s = lane_obstacle.
lane_s() - obstacle_s;
124 double relative_l = lane_obstacle.
lane_l() - obstacle_l;
125 if (relative_s < 0.0) {
126 nearby_obstacle_ptr->set_id(lane_obstacle.
obstacle_id());
127 nearby_obstacle_ptr->set_s(relative_s);
128 nearby_obstacle_ptr->set_l(relative_l);
135 std::shared_ptr<const LaneInfo> lane_info_ptr =
137 bool found_one_behind =
false;
138 double relative_s = -std::numeric_limits<double>::infinity();
139 double relative_l = 0.0;
140 for (
const auto& predecessor_lane_id :
141 lane_info_ptr->lane().predecessor_id()) {
142 std::string lane_id = predecessor_lane_id.id();
143 if (lane_obstacles_.find(lane_id) == lane_obstacles_.end() ||
144 lane_obstacles_[lane_id].empty()) {
147 std::shared_ptr<const LaneInfo> pred_lane_info_ptr =
149 const LaneObstacle& backward_obs = lane_obstacles_[lane_id].back();
150 double delta_s = backward_obs.
lane_s() -
151 (obstacle_s + pred_lane_info_ptr->total_length());
152 found_one_behind =
true;
153 if (delta_s > relative_s) {
154 relative_s = delta_s;
155 relative_l = backward_obs.
lane_l() - obstacle_l;
156 nearby_obstacle_ptr->set_id(backward_obs.
obstacle_id());
157 nearby_obstacle_ptr->set_s(relative_s);
158 nearby_obstacle_ptr->set_l(relative_l);
162 return found_one_behind;
168 if (lane_id_stop_sign_map_.find(lane_id) != lane_id_stop_sign_map_.end()) {
169 return lane_id_stop_sign_map_[lane_id];
171 std::shared_ptr<const LaneInfo> lane_info_ptr =
173 CHECK_NOTNULL(lane_info_ptr);
174 for (
const auto& overlap_id : lane_info_ptr->lane().overlap_id()) {
176 if (overlap_info_ptr ==
nullptr) {
179 for (
const auto&
object : overlap_info_ptr->overlap().object()) {
181 if (
object.has_stop_sign_overlap_info()) {
182 for (
const auto& obj : overlap_info_ptr->overlap().object()) {
184 if (obj.has_lane_overlap_info()) {
185 if (!stop_sign.has_lane_s() ||
186 stop_sign.
lane_s() > obj.lane_overlap_info().start_s()) {
187 stop_sign.set_stop_sign_id(
object.
id().id());
188 stop_sign.set_lane_id(lane_id);
189 stop_sign.set_lane_s(obj.lane_overlap_info().start_s());
190 lane_id_stop_sign_map_[lane_id] = stop_sign;
197 return lane_id_stop_sign_map_[lane_id];
LaneGraph GetLaneGraph(const double start_s, const double length, const bool consider_lane_split, std::shared_ptr< const apollo::hdmap::LaneInfo > lane_info_ptr)
Obtain a lane graph given a lane info and s
bool ForwardNearbyObstacle(const LaneSequence &lane_sequence, const double s, LaneObstacle *const lane_obstacle)
Get the nearest obstacle on lane sequence at s
void AddObstacle(const int obstacle_id, const std::string &lane_id, const double lane_s, const double lane_l)
Add an obstacle into clusters
StopSign QueryStopSignByLaneId(const std::string &lane_id)
Query stop sign by lane ID
LaneGraph GetLaneGraphWithoutMemorizing(const double start_s, const double length, const bool is_on_lane, std::shared_ptr< const apollo::hdmap::LaneInfo > lane_info_ptr)
Obtain a lane graph given a lane info and s, but don't memorize it.
bool BackwardNearbyObstacle(const LaneSequence &lane_sequence, const int obstacle_id, const double obstacle_s, const double obstacle_l, NearbyObstacle *const nearby_obstacle_ptr)
Get the backward nearest obstacle on lane sequence at s
void SortObstacles()
Sort lane obstacles by lane s
static std::shared_ptr< const hdmap::LaneInfo > LaneById(const std::string &id)
Get a shared pointer to a lane by lane ID.
static std::shared_ptr< const hdmap::OverlapInfo > OverlapById(const std::string &id)
Get a shared pointer to an overlap by overlap ID.
common::Status BuildLaneGraph(LaneGraph *const lane_graph)
Build the lane graph.
common::Status BuildLaneGraphBidirection(LaneGraph *const lane_graph_ptr)
optional int32 obstacle_id
repeated LaneSegment lane_segment