Apollo  6.0
Open source self driving car software
open_space_trajectory_optimizer.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 
21 #pragma once
22 
23 #include <memory>
24 #include <vector>
25 
26 #include "Eigen/Eigen"
27 
28 #ifdef ALIVE
29 #undef ALIVE
30 #endif
31 
32 #include "modules/common/configs/proto/vehicle_config.pb.h"
34 #include "modules/common/vehicle_state/proto/vehicle_state.pb.h"
40 #include "modules/planning/proto/open_space_task_config.pb.h"
41 
42 namespace apollo {
43 namespace planning {
45  public:
47  const OpenSpaceTrajectoryOptimizerConfig& config);
48 
49  virtual ~OpenSpaceTrajectoryOptimizer() = default;
50 
52  const std::vector<common::TrajectoryPoint>& stitching_trajectory,
53  const std::vector<double>& end_pose, const std::vector<double>& XYbounds,
54  double rotate_angle, const common::math::Vec2d& translate_origin,
55  const Eigen::MatrixXi& obstacles_edges_num,
56  const Eigen::MatrixXd& obstacles_A, const Eigen::MatrixXd& obstacles_b,
57  const std::vector<std::vector<common::math::Vec2d>>&
58  obstacles_vertices_vec,
59  double* time_latency);
60 
62  std::vector<common::TrajectoryPoint>* stitching_trajectory) {
63  stitching_trajectory->clear();
64  *stitching_trajectory = stitching_trajectory_;
65  }
66 
67  void GetOptimizedTrajectory(DiscretizedTrajectory* optimized_trajectory) {
68  optimized_trajectory->clear();
69  *optimized_trajectory = optimized_trajectory_;
70  }
71 
72  void RecordDebugInfo(
73  const common::TrajectoryPoint& trajectory_stitching_point,
74  const common::math::Vec2d& translate_origin, const double rotate_angle,
75  const std::vector<double>& end_pose, const Eigen::MatrixXd& xWS,
76  const Eigen::MatrixXd& uWs, const Eigen::MatrixXd& l_warm_up,
77  const Eigen::MatrixXd& n_warm_up, const Eigen::MatrixXd& dual_l_result_ds,
78  const Eigen::MatrixXd& dual_n_result_ds,
79  const Eigen::MatrixXd& state_result_ds,
80  const Eigen::MatrixXd& control_result_ds,
81  const Eigen::MatrixXd& time_result_ds,
82  const std::vector<double>& XYbounds,
83  const std::vector<std::vector<common::math::Vec2d>>&
84  obstacles_vertices_vec);
85 
86  void UpdateDebugInfo(
87  ::apollo::planning_internal::OpenSpaceDebug* open_space_debug);
88 
89  apollo::planning_internal::OpenSpaceDebug* mutable_open_space_debug() {
90  return &open_space_debug_;
91  }
92 
93  private:
94  bool IsInitPointNearDestination(
95  const common::TrajectoryPoint& planning_init_point,
96  const std::vector<double>& end_pose, double rotate_angle,
97  const common::math::Vec2d& translate_origin);
98 
99  void PathPointNormalizing(double rotate_angle,
100  const common::math::Vec2d& translate_origin,
101  double* x, double* y, double* phi);
102 
103  void PathPointDeNormalizing(double rotate_angle,
104  const common::math::Vec2d& translate_origin,
105  double* x, double* y, double* phi);
106 
107  void LoadTrajectory(const Eigen::MatrixXd& state_result_ds,
108  const Eigen::MatrixXd& control_result_ds,
109  const Eigen::MatrixXd& time_result_ds);
110 
111  void LoadHybridAstarResultInEigen(HybridAStartResult* result,
112  Eigen::MatrixXd* xWS, Eigen::MatrixXd* uWS);
113 
114  void UseWarmStartAsResult(
115  const Eigen::MatrixXd& xWS, const Eigen::MatrixXd& uWS,
116  const Eigen::MatrixXd& l_warm_up, const Eigen::MatrixXd& n_warm_up,
117  Eigen::MatrixXd* state_result_ds, Eigen::MatrixXd* control_result_ds,
118  Eigen::MatrixXd* time_result_ds, Eigen::MatrixXd* dual_l_result_ds,
119  Eigen::MatrixXd* dual_n_result_ds);
120 
121  bool GenerateDistanceApproachTraj(
122  const Eigen::MatrixXd& xWS, const Eigen::MatrixXd& uWS,
123  const std::vector<double>& XYbounds,
124  const Eigen::MatrixXi& obstacles_edges_num,
125  const Eigen::MatrixXd& obstacles_A, const Eigen::MatrixXd& obstacles_b,
126  const std::vector<std::vector<common::math::Vec2d>>&
127  obstacles_vertices_vec,
128  const Eigen::MatrixXd& last_time_u, const double init_v,
129  Eigen::MatrixXd* state_result_ds, Eigen::MatrixXd* control_result_ds,
130  Eigen::MatrixXd* time_result_ds, Eigen::MatrixXd* l_warm_up,
131  Eigen::MatrixXd* n_warm_up, Eigen::MatrixXd* dual_l_result_ds,
132  Eigen::MatrixXd* dual_n_result_ds);
133 
134  bool GenerateDecoupledTraj(
135  const Eigen::MatrixXd& xWS, const double init_a, const double init_v,
136  const std::vector<std::vector<common::math::Vec2d>>&
137  obstacles_vertices_vec,
138  Eigen::MatrixXd* state_result_dc, Eigen::MatrixXd* control_result_dc,
139  Eigen::MatrixXd* time_result_dc);
140 
141  void LoadResult(const DiscretizedTrajectory& discretized_trajectory,
142  Eigen::MatrixXd* state_result_dc,
143  Eigen::MatrixXd* control_result_dc,
144  Eigen::MatrixXd* time_result_dc);
145 
146  void CombineTrajectories(
147  const std::vector<Eigen::MatrixXd>& xWS_vec,
148  const std::vector<Eigen::MatrixXd>& uWS_vec,
149  const std::vector<Eigen::MatrixXd>& state_result_ds_vec,
150  const std::vector<Eigen::MatrixXd>& control_result_ds_vec,
151  const std::vector<Eigen::MatrixXd>& time_result_ds_vec,
152  const std::vector<Eigen::MatrixXd>& l_warm_up_vec,
153  const std::vector<Eigen::MatrixXd>& n_warm_up_vec,
154  const std::vector<Eigen::MatrixXd>& dual_l_result_ds_vec,
155  const std::vector<Eigen::MatrixXd>& dual_n_result_ds_vec,
156  Eigen::MatrixXd* xWS, Eigen::MatrixXd* uWS,
157  Eigen::MatrixXd* state_result_ds, Eigen::MatrixXd* control_result_ds,
158  Eigen::MatrixXd* time_result_ds, Eigen::MatrixXd* l_warm_up,
159  Eigen::MatrixXd* n_warm_up, Eigen::MatrixXd* dual_l_result_ds,
160  Eigen::MatrixXd* dual_n_result_ds);
161 
162  private:
163  OpenSpaceTrajectoryOptimizerConfig config_;
164 
165  std::unique_ptr<HybridAStar> warm_start_;
166  std::unique_ptr<DistanceApproachProblem> distance_approach_;
167  std::unique_ptr<DualVariableWarmStartProblem> dual_variable_warm_start_;
168  std::unique_ptr<IterativeAnchoringSmoother> iterative_anchoring_smoother_;
169 
170  std::vector<common::TrajectoryPoint> stitching_trajectory_;
171  DiscretizedTrajectory optimized_trajectory_;
172 
173  apollo::planning_internal::OpenSpaceDebug open_space_debug_;
174 };
175 } // namespace planning
176 } // namespace apollo
common::Status Plan(const std::vector< common::TrajectoryPoint > &stitching_trajectory, const std::vector< double > &end_pose, const std::vector< double > &XYbounds, double rotate_angle, const common::math::Vec2d &translate_origin, const Eigen::MatrixXi &obstacles_edges_num, const Eigen::MatrixXd &obstacles_A, const Eigen::MatrixXd &obstacles_b, const std::vector< std::vector< common::math::Vec2d >> &obstacles_vertices_vec, double *time_latency)
Defines the Vec2d class.
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
Definition: discretized_trajectory.h:32
void UpdateDebugInfo(::apollo::planning_internal::OpenSpaceDebug *open_space_debug)
Planning module main class. It processes GPS and IMU as input, to generate planning info...
apollo::planning_internal::OpenSpaceDebug * mutable_open_space_debug()
Definition: open_space_trajectory_optimizer.h:89
Implements a class of 2-dimensional vectors.
Definition: vec2d.h:42
OpenSpaceTrajectoryOptimizer(const OpenSpaceTrajectoryOptimizerConfig &config)
void GetStitchingTrajectory(std::vector< common::TrajectoryPoint > *stitching_trajectory)
Definition: open_space_trajectory_optimizer.h:61
A general class to denote the return status of an API call. It can either be an OK status for success...
Definition: status.h:43
void RecordDebugInfo(const common::TrajectoryPoint &trajectory_stitching_point, const common::math::Vec2d &translate_origin, const double rotate_angle, const std::vector< double > &end_pose, const Eigen::MatrixXd &xWS, const Eigen::MatrixXd &uWs, const Eigen::MatrixXd &l_warm_up, const Eigen::MatrixXd &n_warm_up, const Eigen::MatrixXd &dual_l_result_ds, const Eigen::MatrixXd &dual_n_result_ds, const Eigen::MatrixXd &state_result_ds, const Eigen::MatrixXd &control_result_ds, const Eigen::MatrixXd &time_result_ds, const std::vector< double > &XYbounds, const std::vector< std::vector< common::math::Vec2d >> &obstacles_vertices_vec)
Definition: hybrid_a_star.h:47
Definition: open_space_trajectory_optimizer.h:44
void GetOptimizedTrajectory(DiscretizedTrajectory *optimized_trajectory)
Definition: open_space_trajectory_optimizer.h:67