Apollo 10.0
自动驾驶开放平台
mrac_controller.h
浏览该文件的文档.
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_msgs/config_msgs/vehicle_config.pb.h"
29#include "modules/control/control_component/proto/mrac_conf.pb.h"
30
32
37namespace apollo {
38namespace control {
39
45 public:
52 void Init(const MracConf &mrac_conf,
53 const common::LatencyParam &latency_param, const double dt);
54
61
69
76
83
91 bool CheckLyapunovPD(const Eigen::MatrixXd matrix_a,
92 const Eigen::MatrixXd matrix_p) const;
93
99 void EstimateInitialGains(const common::LatencyParam &latency_param);
100
106 void UpdateReference();
107
116 void UpdateAdaption(Eigen::MatrixXd *law_adp, const Eigen::MatrixXd state_adp,
117 const Eigen::MatrixXd gain_adp);
118
126 void AntiWindupCompensation(const double control_command,
127 const double previous_command);
128
133 void Reset();
134
138 void ResetStates();
139
143 void ResetGains();
144
155 virtual double Control(const double command, const Eigen::MatrixXd state,
156 const double input_limit,
157 const double input_rate_limit);
158
167 int BoundOutput(const double output_unbounded, const double previous_output,
168 double *output_bounded);
169
174 void SetInitialReferenceState(const Eigen::MatrixXd &state_reference_init);
175
180 void SetInitialActionState(const Eigen::MatrixXd &state_action_init);
181
186 void SetInitialCommand(const double command_init);
187
193 const Eigen::MatrixXd &gain_state_adaption_init);
194
199 void SetInitialInputAdaptionGain(const double gain_input_adaption_init);
200
206 const double gain_nonlinear_adaption_init);
207
212 void SetStateAdaptionRate(const double ratio_state);
213
218 void SetInputAdaptionRate(const double ratio_input);
219
224 void SetNonlinearAdaptionRate(const double ratio_nonlinear);
225
230 double StateAdaptionRate() const;
231
236 double InputAdaptionRate() const;
237
242 double NonlinearAdaptionRate() const;
243
248 int ReferenceSaturationStatus() const;
249
254 int ControlSaturationStatus() const;
255
260 Eigen::MatrixXd CurrentReferenceState() const;
261
266 Eigen::MatrixXd CurrentStateAdaptionGain() const;
267
272 Eigen::MatrixXd CurrentInputAdaptionGain() const;
273
278 Eigen::MatrixXd CurrentNonlinearAdaptionGain() const;
279
280 protected:
281 // indicator if the reference/adaption model is valid
284
285 // indicator if clamp the adaption laws
287
288 // The order of the reference/adaption model
290
291 // 1st-order Reference system coefficients in continuous-time domain
292 double tau_reference_ = 0.0;
293 double tau_clamping_ = 0.0;
294 // 2nd-order Reference system coefficients in continuous-time domain
295 double wn_reference_ = 0.0;
296 double zeta_reference_ = 0.0;
297
298 double ts_ = 0.01; // By default, control sampling time is 0.01 sec
299
300 // Adaption system coefficients
301 // State adaption gain
302 Eigen::MatrixXd gamma_state_adaption_;
303 // Desired command adaption gain
304 Eigen::MatrixXd gamma_input_adaption_;
305 // Nonlinear dynamics adaption gain
307 // Adjustable ratio of the state adaption gain
308 double gamma_ratio_state_ = 1.0;
309 // Adjustable ratio of the desired command adaption gain
310 double gamma_ratio_input_ = 1.0;
311 // Adjustable ratio of the nonlinear dynamics adaption gain
313
314 // Reference system matrix in continuous-time domain
315 Eigen::MatrixXd matrix_a_reference_; // Matrix A in reference models
316 Eigen::MatrixXd matrix_b_reference_; // Matrix B in reference models
317
318 // Adaption system matrix in discrete-time domain
319 Eigen::MatrixXd matrix_p_adaption_; // Matrix P in adaption models
320 Eigen::MatrixXd matrix_b_adaption_; // Matrix B in adaption models
321
322 // Adaption system input variables in discrete-time domain
323 Eigen::MatrixXd input_desired_; // Updated desired command vector
324 Eigen::MatrixXd state_action_; // Updated actuation states vector
325 Eigen::MatrixXd state_reference_; // Reference states vector
326 Eigen::MatrixXd gain_state_adaption_; // State adaption vector
327 Eigen::MatrixXd gain_input_adaption_; // Desired command adaption vector
328 Eigen::MatrixXd gain_nonlinear_adaption_; // Nonlinear adaption vector
329
330 Eigen::MatrixXd gain_state_clamping_; // To clamp the state adaption
331 Eigen::MatrixXd gain_input_clamping_; // To clamp the command adaption
332 Eigen::MatrixXd gain_nonlinear_clamping_; // To clamp the nonlinear adaption
333
334 Eigen::MatrixXd gain_state_adaption_init_; // Initial state adaption
335 Eigen::MatrixXd gain_input_adaption_init_; // Initial input adaption
336 Eigen::MatrixXd gain_nonlinear_adaption_init_; // Initial nonlinear adaption
337
338 // Mrac control output in the last step
339 double control_previous_ = 0.0;
340
341 // State saturation limits in discrete-time domain
342 double bound_ratio_ = 0.0;
343 double bound_command_ = 0.0;
347
348 // Anti-Windup compensation
349 Eigen::MatrixXd gain_anti_windup_;
351};
352
353} // namespace control
354} // namespace apollo
control module main class, it processes localization, chassis, and pad data to compute throttle,...
A general class to denote the return status of an API call.
Definition status.h:43
A mrac controller for actuation system (throttle/brake and steering)
void SetInitialNonlinearAdaptionGain(const double gain_nonlinear_adaption_init)
set initial value of nonlinear adaption gain for mrac control
void ResetStates()
reset internal states for mrac controller
void SetInitialCommand(const double command_init)
set initial command (desired input)
common::Status BuildReferenceModel()
build mrac (1st or 2nd) order reference model in the discrete-time form, with the bilinear transform ...
common::Status BuildAdaptionModel()
build mrac (1st or 2nd) order adaptive dynamic model in the discrete-time form
void SetInitialActionState(const Eigen::MatrixXd &state_action_init)
set initial values for state components in actual actuator dynamics
common::Status SetAdaptionModel(const MracConf &mrac_conf)
state adaptive gain, desired adaptive gain and nonlinear-component adaptive gain
void SetInputAdaptionRate(const double ratio_input)
set convergence ratio for input components in adaptive dynamics
void EstimateInitialGains(const common::LatencyParam &latency_param)
estimate the initial states of the adaptive gains via known actuation dynamics approximation
double InputAdaptionRate() const
get convergence ratio for input components in adaptive dynamics
double NonlinearAdaptionRate() const
get convergence ratio for nonlinear components in adaptive dynamics
void SetNonlinearAdaptionRate(const double ratio_nonlinear)
set convergence ratio for nonlinear components in adaptive dynamics
Eigen::MatrixXd CurrentInputAdaptionGain() const
get current input adaptive gain for mrac control
void SetInitialInputAdaptionGain(const double gain_input_adaption_init)
set initial value of input adaption gain for mrac control
void Init(const MracConf &mrac_conf, const common::LatencyParam &latency_param, const double dt)
initialize mrac controller
int ReferenceSaturationStatus() const
get saturation status for reference system
void ResetGains()
reset adaptive gains for mrac controller
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,...
void Reset()
reset all the variables (including all the states, gains and externally-setting control parameters) f...
Eigen::MatrixXd CurrentNonlinearAdaptionGain() const
get current nonlinear adaptive gain for mrac control
common::Status SetReferenceModel(const MracConf &mrac_conf)
time constant, natural frequency and damping ratio
void AntiWindupCompensation(const double control_command, const double previous_command)
calculate the anti-windup compensation with respect to the integral windup issue
Eigen::MatrixXd gain_nonlinear_adaption_init_
int ControlSaturationStatus() const
get saturation status for control system
void SetInitialReferenceState(const Eigen::MatrixXd &state_reference_init)
set initial values for state components in reference model dynamics
double StateAdaptionRate() const
get convergence ratio for state components in adaptive dynamics
void SetStateAdaptionRate(const double ratio_state)
set convergence ratio for state components in adaptive dynamics
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
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
void SetInitialStateAdaptionGain(const Eigen::MatrixXd &gain_state_adaption_init)
set initial values of state adaption gains for mrac control
Eigen::MatrixXd CurrentReferenceState() const
get current state for reference system
Eigen::MatrixXd CurrentStateAdaptionGain() const
get current state adaptive gain for mrac control
void UpdateReference()
execute the reference state interation with respect to the designed inputs in discrete-time form,...
class register implement
Definition arena_queue.h:37