Apollo  6.0
Open source self driving car software
grid_search.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2019 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 
17 /*
18  * @file
19  */
20 
21 #pragma once
22 
23 #include <limits>
24 #include <memory>
25 #include <queue>
26 #include <string>
27 #include <unordered_map>
28 #include <utility>
29 #include <vector>
30 
31 #include "absl/strings/str_cat.h"
32 #include "cyber/common/log.h"
34 #include "modules/planning/proto/planner_open_space_config.pb.h"
35 
36 namespace apollo {
37 namespace planning {
38 
39 class Node2d {
40  public:
41  Node2d(const double x, const double y, const double xy_resolution,
42  const std::vector<double>& XYbounds) {
43  // XYbounds with xmin, xmax, ymin, ymax
44  grid_x_ = static_cast<int>((x - XYbounds[0]) / xy_resolution);
45  grid_y_ = static_cast<int>((y - XYbounds[2]) / xy_resolution);
46  index_ = ComputeStringIndex(grid_x_, grid_y_);
47  }
48  Node2d(const int grid_x, const int grid_y,
49  const std::vector<double>& XYbounds) {
50  grid_x_ = grid_x;
51  grid_y_ = grid_y;
52  index_ = ComputeStringIndex(grid_x_, grid_y_);
53  }
54  void SetPathCost(const double path_cost) {
55  path_cost_ = path_cost;
56  cost_ = path_cost_ + heuristic_;
57  }
58  void SetHeuristic(const double heuristic) {
59  heuristic_ = heuristic;
60  cost_ = path_cost_ + heuristic_;
61  }
62  void SetCost(const double cost) { cost_ = cost; }
63  void SetPreNode(std::shared_ptr<Node2d> pre_node) { pre_node_ = pre_node; }
64  double GetGridX() const { return grid_x_; }
65  double GetGridY() const { return grid_y_; }
66  double GetPathCost() const { return path_cost_; }
67  double GetHeuCost() const { return heuristic_; }
68  double GetCost() const { return cost_; }
69  const std::string& GetIndex() const { return index_; }
70  std::shared_ptr<Node2d> GetPreNode() const { return pre_node_; }
71  static std::string CalcIndex(const double x, const double y,
72  const double xy_resolution,
73  const std::vector<double>& XYbounds) {
74  // XYbounds with xmin, xmax, ymin, ymax
75  int grid_x = static_cast<int>((x - XYbounds[0]) / xy_resolution);
76  int grid_y = static_cast<int>((y - XYbounds[2]) / xy_resolution);
77  return ComputeStringIndex(grid_x, grid_y);
78  }
79  bool operator==(const Node2d& right) const {
80  return right.GetIndex() == index_;
81  }
82 
83  private:
84  static std::string ComputeStringIndex(int x_grid, int y_grid) {
85  return absl::StrCat(x_grid, "_", y_grid);
86  }
87 
88  private:
89  int grid_x_ = 0;
90  int grid_y_ = 0;
91  double path_cost_ = 0.0;
92  double heuristic_ = 0.0;
93  double cost_ = 0.0;
94  std::string index_;
95  std::shared_ptr<Node2d> pre_node_ = nullptr;
96 };
97 
99  std::vector<double> x;
100  std::vector<double> y;
101  double path_cost = 0.0;
102 };
103 
104 class GridSearch {
105  public:
106  explicit GridSearch(const PlannerOpenSpaceConfig& open_space_conf);
107  virtual ~GridSearch() = default;
108  bool GenerateAStarPath(
109  const double sx, const double sy, const double ex, const double ey,
110  const std::vector<double>& XYbounds,
111  const std::vector<std::vector<common::math::LineSegment2d>>&
112  obstacles_linesegments_vec,
113  GridAStartResult* result);
114  bool GenerateDpMap(
115  const double ex, const double ey, const std::vector<double>& XYbounds,
116  const std::vector<std::vector<common::math::LineSegment2d>>&
117  obstacles_linesegments_vec);
118  double CheckDpMap(const double sx, const double sy);
119 
120  private:
121  double EuclidDistance(const double x1, const double y1, const double x2,
122  const double y2);
123  std::vector<std::shared_ptr<Node2d>> GenerateNextNodes(
124  std::shared_ptr<Node2d> node);
125  bool CheckConstraints(std::shared_ptr<Node2d> node);
126  void LoadGridAStarResult(GridAStartResult* result);
127 
128  private:
129  double xy_grid_resolution_ = 0.0;
130  double node_radius_ = 0.0;
131  std::vector<double> XYbounds_;
132  double max_grid_x_ = 0.0;
133  double max_grid_y_ = 0.0;
134  std::shared_ptr<Node2d> start_node_;
135  std::shared_ptr<Node2d> end_node_;
136  std::shared_ptr<Node2d> final_node_;
137  std::vector<std::vector<common::math::LineSegment2d>>
138  obstacles_linesegments_vec_;
139 
140  struct cmp {
141  bool operator()(const std::pair<std::string, double>& left,
142  const std::pair<std::string, double>& right) const {
143  return left.second >= right.second;
144  }
145  };
146  std::unordered_map<std::string, std::shared_ptr<Node2d>> dp_map_;
147 };
148 } // namespace planning
149 } // namespace apollo
std::vector< double > y
Definition: grid_search.h:100
std::vector< double > x
Definition: grid_search.h:99
Define the LineSegment2d class.
void SetPathCost(const double path_cost)
Definition: grid_search.h:54
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
double GetHeuCost() const
Definition: grid_search.h:67
double GetGridY() const
Definition: grid_search.h:65
bool operator==(const Node2d &right) const
Definition: grid_search.h:79
Planning module main class. It processes GPS and IMU as input, to generate planning info...
void SetCost(const double cost)
Definition: grid_search.h:62
double GetCost() const
Definition: grid_search.h:68
Definition: grid_search.h:98
void SetPreNode(std::shared_ptr< Node2d > pre_node)
Definition: grid_search.h:63
Definition: grid_search.h:104
Definition: grid_search.h:39
const std::string & GetIndex() const
Definition: grid_search.h:69
double GetPathCost() const
Definition: grid_search.h:66
Node2d(const int grid_x, const int grid_y, const std::vector< double > &XYbounds)
Definition: grid_search.h:48
void SetHeuristic(const double heuristic)
Definition: grid_search.h:58
static std::string CalcIndex(const double x, const double y, const double xy_resolution, const std::vector< double > &XYbounds)
Definition: grid_search.h:71
Node2d(const double x, const double y, const double xy_resolution, const std::vector< double > &XYbounds)
Definition: grid_search.h:41
std::shared_ptr< Node2d > GetPreNode() const
Definition: grid_search.h:70
double GetGridX() const
Definition: grid_search.h:64