Apollo  6.0
Open source self driving car software
mrac_controller.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 
22 #pragma once
23 
24 #include <vector>
25 
26 #include "Eigen/Core"
27 
28 #include "modules/common/configs/proto/vehicle_config.pb.h"
30 #include "modules/control/proto/mrac_conf.pb.h"
31 
36 namespace apollo {
37 namespace control {
38 
44  public:
51  void Init(const MracConf &mrac_conf,
52  const common::LatencyParam &latency_param, const double dt);
53 
59  common::Status SetReferenceModel(const MracConf &mrac_conf);
60 
67  common::Status SetAdaptionModel(const MracConf &mrac_conf);
68 
75 
82 
90  bool CheckLyapunovPD(const Eigen::MatrixXd matrix_a,
91  const Eigen::MatrixXd matrix_p) const;
92 
98  void EstimateInitialGains(const common::LatencyParam &latency_param);
99 
105  void UpdateReference();
106 
115  void UpdateAdaption(Eigen::MatrixXd *law_adp, const Eigen::MatrixXd state_adp,
116  const Eigen::MatrixXd gain_adp);
117 
125  void AntiWindupCompensation(const double control_command,
126  const double previous_command);
127 
132  void Reset();
133 
137  void ResetStates();
138 
142  void ResetGains();
143 
154  virtual double Control(const double command, const Eigen::MatrixXd state,
155  const double input_limit,
156  const double input_rate_limit);
157 
166  int BoundOutput(const double output_unbounded, const double previous_output,
167  double *output_bounded);
168 
173  void SetInitialReferenceState(const Eigen::MatrixXd &state_reference_init);
174 
179  void SetInitialActionState(const Eigen::MatrixXd &state_action_init);
180 
185  void SetInitialCommand(const double command_init);
186 
192  const Eigen::MatrixXd &gain_state_adaption_init);
193 
198  void SetInitialInputAdaptionGain(const double gain_input_adaption_init);
199 
205  const double gain_nonlinear_adaption_init);
206 
211  void SetStateAdaptionRate(const double ratio_state);
212 
217  void SetInputAdaptionRate(const double ratio_input);
218 
223  void SetNonlinearAdaptionRate(const double ratio_nonlinear);
224 
229  double StateAdaptionRate() const;
230 
235  double InputAdaptionRate() const;
236 
241  double NonlinearAdaptionRate() const;
242 
247  int ReferenceSaturationStatus() const;
248 
253  int ControlSaturationStatus() const;
254 
259  Eigen::MatrixXd CurrentReferenceState() const;
260 
265  Eigen::MatrixXd CurrentStateAdaptionGain() const;
266 
271  Eigen::MatrixXd CurrentInputAdaptionGain() const;
272 
277  Eigen::MatrixXd CurrentNonlinearAdaptionGain() const;
278 
279  protected:
280  // indicator if the reference/adaption model is valid
283 
284  // indicator if clamp the adaption laws
286 
287  // The order of the reference/adaption model
288  int model_order_ = 1;
289 
290  // 1st-order Reference system coefficients in continuous-time domain
291  double tau_reference_ = 0.0;
292  double tau_clamping_ = 0.0;
293  // 2nd-order Reference system coefficients in continuous-time domain
294  double wn_reference_ = 0.0;
295  double zeta_reference_ = 0.0;
296 
297  double ts_ = 0.01; // By default, control sampling time is 0.01 sec
298 
299  // Adaption system coefficients
300  // State adaption gain
301  Eigen::MatrixXd gamma_state_adaption_;
302  // Desired command adaption gain
303  Eigen::MatrixXd gamma_input_adaption_;
304  // Nonlinear dynamics adaption gain
305  Eigen::MatrixXd gamma_nonlinear_adaption_;
306  // Adjustable ratio of the state adaption gain
307  double gamma_ratio_state_ = 1.0;
308  // Adjustable ratio of the desired command adaption gain
309  double gamma_ratio_input_ = 1.0;
310  // Adjustable ratio of the nonlinear dynamics adaption gain
312 
313  // Reference system matrix in continuous-time domain
314  Eigen::MatrixXd matrix_a_reference_; // Matrix A in reference models
315  Eigen::MatrixXd matrix_b_reference_; // Matrix B in reference models
316 
317  // Adaption system matrix in discrete-time domain
318  Eigen::MatrixXd matrix_p_adaption_; // Matrix P in adaption models
319  Eigen::MatrixXd matrix_b_adaption_; // Matrix B in adaption models
320 
321  // Adaption system input variables in discrete-time domain
322  Eigen::MatrixXd input_desired_; // Updated desired command vector
323  Eigen::MatrixXd state_action_; // Updated actuation states vector
324  Eigen::MatrixXd state_reference_; // Reference states vector
325  Eigen::MatrixXd gain_state_adaption_; // State adaption vector
326  Eigen::MatrixXd gain_input_adaption_; // Desired command adaption vector
327  Eigen::MatrixXd gain_nonlinear_adaption_; // Nonlinear adaption vector
328 
329  Eigen::MatrixXd gain_state_clamping_; // To clamp the state adaption
330  Eigen::MatrixXd gain_input_clamping_; // To clamp the command adaption
331  Eigen::MatrixXd gain_nonlinear_clamping_; // To clamp the nonlinear adaption
332 
333  Eigen::MatrixXd gain_state_adaption_init_; // Initial state adaption
334  Eigen::MatrixXd gain_input_adaption_init_; // Initial input adaption
335  Eigen::MatrixXd gain_nonlinear_adaption_init_; // Initial nonlinear adaption
336 
337  // Mrac control output in the last step
338  double control_previous_ = 0.0;
339 
340  // State saturation limits in discrete-time domain
341  double bound_ratio_ = 0.0;
342  double bound_command_ = 0.0;
343  double bound_command_rate_ = 0.0;
346 
347  // Anti-Windup compensation
348  Eigen::MatrixXd gain_anti_windup_;
349  Eigen::MatrixXd compensation_anti_windup_;
350 };
351 
352 } // namespace control
353 } // namespace apollo
double StateAdaptionRate() const
get convergence ratio for state components in adaptive dynamics
common::Status SetReferenceModel(const MracConf &mrac_conf)
int saturation_status_control_
Definition: mrac_controller.h:345
void SetInitialActionState(const Eigen::MatrixXd &state_action_init)
set initial values for state components in actual actuator dynamics
double tau_clamping_
Definition: mrac_controller.h:292
void Reset()
reset all the variables (including all the states, gains and externally-setting control parameters) f...
double bound_command_rate_
Definition: mrac_controller.h:343
Eigen::MatrixXd gain_nonlinear_adaption_
Definition: mrac_controller.h:327
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void UpdateAdaption(Eigen::MatrixXd *law_adp, const Eigen::MatrixXd state_adp, const Eigen::MatrixXd gain_adp)
execute the adaption interation with respect to the designed law in discrete-time form...
Eigen::MatrixXd gain_state_adaption_
Definition: mrac_controller.h:325
Eigen::MatrixXd state_action_
Definition: mrac_controller.h:323
void SetInitialStateAdaptionGain(const Eigen::MatrixXd &gain_state_adaption_init)
set initial values of state adaption gains for mrac control
void ResetStates()
reset internal states for mrac controller
Eigen::MatrixXd input_desired_
Definition: mrac_controller.h:322
double ts_
Definition: mrac_controller.h:297
double bound_command_
Definition: mrac_controller.h:342
double gamma_ratio_nonlinear_
Definition: mrac_controller.h:311
Eigen::MatrixXd gain_state_adaption_init_
Definition: mrac_controller.h:333
Eigen::MatrixXd gain_input_adaption_init_
Definition: mrac_controller.h:334
void SetInputAdaptionRate(const double ratio_input)
set convergence ratio for input components in adaptive dynamics
Eigen::MatrixXd state_reference_
Definition: mrac_controller.h:324
Eigen::MatrixXd gain_input_clamping_
Definition: mrac_controller.h:330
double bound_ratio_
Definition: mrac_controller.h:341
Eigen::MatrixXd gain_nonlinear_adaption_init_
Definition: mrac_controller.h:335
Eigen::MatrixXd gamma_nonlinear_adaption_
Definition: mrac_controller.h:305
double zeta_reference_
Definition: mrac_controller.h:295
void EstimateInitialGains(const common::LatencyParam &latency_param)
estimate the initial states of the adaptive gains via known actuation dynamics approximation ...
virtual double Control(const double command, const Eigen::MatrixXd state, const double input_limit, const double input_rate_limit)
compute control value based on the original command
void SetNonlinearAdaptionRate(const double ratio_nonlinear)
set convergence ratio for nonlinear components in adaptive dynamics
bool adaption_model_enabled_
Definition: mrac_controller.h:282
Eigen::MatrixXd gain_nonlinear_clamping_
Definition: mrac_controller.h:331
void UpdateReference()
execute the reference state interation with respect to the designed inputs in discrete-time form...
double gamma_ratio_state_
Definition: mrac_controller.h:307
Eigen::MatrixXd matrix_b_adaption_
Definition: mrac_controller.h:319
double tau_reference_
Definition: mrac_controller.h:291
Eigen::MatrixXd matrix_p_adaption_
Definition: mrac_controller.h:318
Eigen::MatrixXd CurrentStateAdaptionGain() const
get current state adaptive gain for mrac control
Eigen::MatrixXd compensation_anti_windup_
Definition: mrac_controller.h:349
int ControlSaturationStatus() const
get saturation status for control system
A mrac controller for actuation system (throttle/brake and steering)
Definition: mrac_controller.h:43
int BoundOutput(const double output_unbounded, const double previous_output, double *output_bounded)
bound the system output with the given bound and change-rate bound
int model_order_
Definition: mrac_controller.h:288
Eigen::MatrixXd CurrentInputAdaptionGain() const
get current input adaptive gain for mrac control
common::Status BuildReferenceModel()
build mrac (1st or 2nd) order reference model in the discrete-time form, with the bilinear transform ...
Eigen::MatrixXd CurrentNonlinearAdaptionGain() const
get current nonlinear adaptive gain for mrac control
Eigen::MatrixXd gamma_state_adaption_
Definition: mrac_controller.h:301
Eigen::MatrixXd gamma_input_adaption_
Definition: mrac_controller.h:303
Eigen::MatrixXd gain_anti_windup_
Definition: mrac_controller.h:348
void Init(const MracConf &mrac_conf, const common::LatencyParam &latency_param, const double dt)
initialize mrac controller
void SetInitialReferenceState(const Eigen::MatrixXd &state_reference_init)
set initial values for state components in reference model dynamics
void AntiWindupCompensation(const double control_command, const double previous_command)
calculate the anti-windup compensation with respect to the integral windup issue
double InputAdaptionRate() const
get convergence ratio for input components in adaptive dynamics
void ResetGains()
reset adaptive gains for mrac controller
Eigen::MatrixXd CurrentReferenceState() const
get current state for reference system
double gamma_ratio_input_
Definition: mrac_controller.h:309
int saturation_status_reference_
Definition: mrac_controller.h:344
bool CheckLyapunovPD(const Eigen::MatrixXd matrix_a, const Eigen::MatrixXd matrix_p) const
check if the solution of the algebraic Lyapunov Equation is symmetric positive definite ...
bool reference_model_enabled_
Definition: mrac_controller.h:281
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
Eigen::MatrixXd gain_input_adaption_
Definition: mrac_controller.h:326
void SetStateAdaptionRate(const double ratio_state)
set convergence ratio for state components in adaptive dynamics
Eigen::MatrixXd matrix_b_reference_
Definition: mrac_controller.h:315
void SetInitialCommand(const double command_init)
set initial command (desired input)
void SetInitialNonlinearAdaptionGain(const double gain_nonlinear_adaption_init)
set initial value of nonlinear adaption gain for mrac control
common::Status SetAdaptionModel(const MracConf &mrac_conf)
Eigen::MatrixXd gain_state_clamping_
Definition: mrac_controller.h:329
double NonlinearAdaptionRate() const
get convergence ratio for nonlinear components in adaptive dynamics
Eigen::MatrixXd matrix_a_reference_
Definition: mrac_controller.h:314
bool adaption_clamping_enabled
Definition: mrac_controller.h:285
double control_previous_
Definition: mrac_controller.h:338
void SetInitialInputAdaptionGain(const double gain_input_adaption_init)
set initial value of input adaption gain for mrac control
common::Status BuildAdaptionModel()
build mrac (1st or 2nd) order adaptive dynamic model in the discrete-time form
double wn_reference_
Definition: mrac_controller.h:294
int ReferenceSaturationStatus() const
get saturation status for reference system