162 {
163 std::priority_queue<std::pair<std::string, double>, std::vector<std::pair<std::string, double>>, cmp> open_pq;
164 std::unordered_map<std::string, std::shared_ptr<Node2d>> open_set;
165 std::unordered_map<std::string, std::shared_ptr<Node2d>> close_set;
166 XYbounds_ = XYbounds;
167 std::shared_ptr<Node2d> start_node = std::make_shared<Node2d>(sx, sy, xy_grid_resolution_, XYbounds_);
168 std::shared_ptr<Node2d> end_node = std::make_shared<Node2d>(ex, ey, xy_grid_resolution_, XYbounds_);
169 std::shared_ptr<Node2d> final_node_ = nullptr;
170 obstacles_linesegments_vec_ = obstacles_linesegments_vec;
171 open_set.emplace(start_node->GetIndex(), start_node);
172 open_pq.emplace(start_node->GetIndex(), start_node->GetCost());
173
174
175 size_t explored_node_num = 0;
176 while (!open_pq.empty()) {
177 std::string current_id = open_pq.top().first;
178 open_pq.pop();
179 std::shared_ptr<Node2d> current_node = open_set[current_id];
180
181 if (*(current_node) == *(end_node)) {
182 final_node_ = current_node;
183 break;
184 }
185 close_set.emplace(current_node->GetIndex(), current_node);
186 std::vector<std::shared_ptr<Node2d>> next_nodes = std::move(GenerateNextNodes(current_node));
187 for (auto& next_node : next_nodes) {
188 if (!CheckConstraints(next_node)) {
189 continue;
190 }
191 if (close_set.find(next_node->GetIndex()) != close_set.end()) {
192 continue;
193 }
194 if (open_set.find(next_node->GetIndex()) == open_set.end()) {
195 ++explored_node_num;
196 next_node->SetHeuristic(EuclidDistance(
197 next_node->GetGridX(), next_node->GetGridY(), end_node->GetGridX(), end_node->GetGridY()));
198 next_node->SetPreNode(current_node);
199 open_set.emplace(next_node->GetIndex(), next_node);
200 open_pq.emplace(next_node->GetIndex(), next_node->GetCost());
201 }
202 }
203 }
204
205 if (final_node_ == nullptr) {
206 AERROR <<
"Grid A searching return null ptr(open_set ran out)";
207 return false;
208 }
209 LoadGridAStarResult(result);
210 ADEBUG <<
"explored node num is " << explored_node_num;
211 return true;
212}