Apollo  6.0
Open source self driving car software
trajectory_evaluator.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2017 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 
21 #pragma once
22 
23 #include <functional>
24 #include <memory>
25 #include <queue>
26 #include <utility>
27 #include <vector>
28 
31 #include "modules/planning/proto/lattice_structure.pb.h"
32 #include "modules/planning/proto/planning_config.pb.h"
33 
34 namespace apollo {
35 namespace planning {
36 
37 class TrajectoryEvaluator {
38  // normal use
39  typedef std::pair<
40  std::pair<std::shared_ptr<Curve1d>, std::shared_ptr<Curve1d>>, double>
41  PairCost;
42 
43  // auto tuning
44  typedef std::pair<
45  std::pair<std::shared_ptr<Curve1d>, std::shared_ptr<Curve1d>>,
46  std::pair<std::vector<double>, double>>
47  PairCostWithComponents;
48 
49  public:
51  const std::array<double, 3>& init_s,
52  const PlanningTarget& planning_target,
53  const std::vector<std::shared_ptr<Curve1d>>& lon_trajectories,
54  const std::vector<std::shared_ptr<Curve1d>>& lat_trajectories,
55  std::shared_ptr<PathTimeGraph> path_time_graph,
56  std::shared_ptr<std::vector<apollo::common::PathPoint>> reference_line);
57 
58  virtual ~TrajectoryEvaluator() = default;
59 
60  bool has_more_trajectory_pairs() const;
61 
62  size_t num_of_trajectory_pairs() const;
63 
64  std::pair<std::shared_ptr<Curve1d>, std::shared_ptr<Curve1d>>
66 
67  double top_trajectory_pair_cost() const;
68 
69  std::vector<double> top_trajectory_pair_component_cost() const;
70 
71  private:
72  double Evaluate(const PlanningTarget& planning_target,
73  const std::shared_ptr<Curve1d>& lon_trajectory,
74  const std::shared_ptr<Curve1d>& lat_trajectory,
75  std::vector<double>* cost_components = nullptr) const;
76 
77  double LatOffsetCost(const std::shared_ptr<Curve1d>& lat_trajectory,
78  const std::vector<double>& s_values) const;
79 
80  double LatComfortCost(const std::shared_ptr<Curve1d>& lon_trajectory,
81  const std::shared_ptr<Curve1d>& lat_trajectory) const;
82 
83  double LonComfortCost(const std::shared_ptr<Curve1d>& lon_trajectory) const;
84 
85  double LonCollisionCost(const std::shared_ptr<Curve1d>& lon_trajectory) const;
86 
87  double LonObjectiveCost(const std::shared_ptr<Curve1d>& lon_trajectory,
88  const PlanningTarget& planning_target,
89  const std::vector<double>& ref_s_dot) const;
90 
91  double CentripetalAccelerationCost(
92  const std::shared_ptr<Curve1d>& lon_trajectory) const;
93 
94  std::vector<double> ComputeLongitudinalGuideVelocity(
95  const PlanningTarget& planning_target) const;
96 
97  bool InterpolateDenseStPoints(
98  const std::vector<apollo::common::SpeedPoint>& st_points, double t,
99  double* traj_s) const;
100 
101  struct CostComparator
102  : public std::binary_function<const PairCost&, const PairCost&, bool> {
103  bool operator()(const PairCost& left, const PairCost& right) const {
104  return left.second > right.second;
105  }
106  };
107 
108  std::priority_queue<PairCost, std::vector<PairCost>, CostComparator>
109  cost_queue_;
110 
111  std::shared_ptr<PathTimeGraph> path_time_graph_;
112 
113  std::shared_ptr<std::vector<apollo::common::PathPoint>> reference_line_;
114 
115  std::vector<std::vector<std::pair<double, double>>> path_time_intervals_;
116 
117  std::array<double, 3> init_s_;
118 
119  std::vector<double> reference_s_dot_;
120 };
121 
122 } // namespace planning
123 } // namespace apollo
std::pair< std::shared_ptr< Curve1d >, std::shared_ptr< Curve1d > > next_top_trajectory_pair()
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
TrajectoryEvaluator(const std::array< double, 3 > &init_s, const PlanningTarget &planning_target, const std::vector< std::shared_ptr< Curve1d >> &lon_trajectories, const std::vector< std::shared_ptr< Curve1d >> &lat_trajectories, std::shared_ptr< PathTimeGraph > path_time_graph, std::shared_ptr< std::vector< apollo::common::PathPoint >> reference_line)
Planning module main class. It processes GPS and IMU as input, to generate planning info...
std::vector< double > top_trajectory_pair_component_cost() const