112 {
113 std::priority_queue<std::pair<std::string, double>,
114 std::vector<std::pair<std::string, double>>, cmp>
115 open_pq;
116 std::unordered_map<std::string, std::shared_ptr<Node2d>> open_set;
117 std::unordered_map<std::string, std::shared_ptr<Node2d>> close_set;
118 XYbounds_ = XYbounds;
119 std::shared_ptr<Node2d> start_node =
120 std::make_shared<Node2d>(sx, sy, xy_grid_resolution_, XYbounds_);
121 std::shared_ptr<Node2d> end_node =
122 std::make_shared<Node2d>(ex, ey, xy_grid_resolution_, XYbounds_);
123 std::shared_ptr<Node2d> final_node_ = nullptr;
124 obstacles_linesegments_vec_ = obstacles_linesegments_vec;
125 open_set.emplace(start_node->GetIndex(), start_node);
126 open_pq.emplace(start_node->GetIndex(), start_node->GetCost());
127
128
129 size_t explored_node_num = 0;
130 while (!open_pq.empty()) {
131 std::string current_id = open_pq.top().first;
132 open_pq.pop();
133 std::shared_ptr<Node2d> current_node = open_set[current_id];
134
135 if (*(current_node) == *(end_node)) {
136 final_node_ = current_node;
137 break;
138 }
139 close_set.emplace(current_node->GetIndex(), current_node);
140 std::vector<std::shared_ptr<Node2d>> next_nodes =
141 std::move(GenerateNextNodes(current_node));
142 for (auto& next_node : next_nodes) {
143 if (!CheckConstraints(next_node)) {
144 continue;
145 }
146 if (close_set.find(next_node->GetIndex()) != close_set.end()) {
147 continue;
148 }
149 if (open_set.find(next_node->GetIndex()) == open_set.end()) {
150 ++explored_node_num;
151 next_node->SetHeuristic(
152 EuclidDistance(next_node->GetGridX(), next_node->GetGridY(),
153 end_node->GetGridX(), end_node->GetGridY()));
154 next_node->SetPreNode(current_node);
155 open_set.emplace(next_node->GetIndex(), next_node);
156 open_pq.emplace(next_node->GetIndex(), next_node->GetCost());
157 }
158 }
159 }
160
161 if (final_node_ == nullptr) {
162 AERROR <<
"Grid A searching return null ptr(open_set ran out)";
163 return false;
164 }
165 LoadGridAStarResult(result);
166 ADEBUG <<
"explored node num is " << explored_node_num;
167 return true;
168}