16 #ifndef NAV2_MPPI_CONTROLLER__MOTION_MODELS_HPP_
17 #define NAV2_MPPI_CONTROLLER__MOTION_MODELS_HPP_
19 #include <Eigen/Dense>
25 #include "nav2_mppi_controller/models/control_sequence.hpp"
26 #include "nav2_mppi_controller/models/state.hpp"
27 #include "nav2_mppi_controller/models/constraints.hpp"
29 #include "nav2_mppi_controller/tools/parameters_handler.hpp"
38 float clamp(
const float lower_bound,
const float upper_bound,
const float input);
65 control_constraints_ = control_constraints;
76 float max_delta_vx = model_dt_ * control_constraints_.ax_max;
77 float min_delta_vx = model_dt_ * control_constraints_.ax_min;
78 float max_delta_vy = model_dt_ * control_constraints_.ay_max;
79 float min_delta_vy = model_dt_ * control_constraints_.ay_min;
80 float max_delta_wz = model_dt_ * control_constraints_.az_max;
82 unsigned int n_cols = state.vx.cols();
84 for (
unsigned int i = 1; i < n_cols; i++) {
85 auto lower_bound_vx = (state.vx.col(i - 1) >
86 0).select(state.vx.col(i - 1) + min_delta_vx,
87 state.vx.col(i - 1) - max_delta_vx);
88 auto upper_bound_vx = (state.vx.col(i - 1) >
89 0).select(state.vx.col(i - 1) + max_delta_vx,
90 state.vx.col(i - 1) - min_delta_vx);
92 state.cvx.col(i - 1) = state.cvx.col(i - 1)
93 .cwiseMax(lower_bound_vx)
94 .cwiseMin(upper_bound_vx);
95 state.vx.col(i) = state.cvx.col(i - 1);
97 state.cwz.col(i - 1) = state.cwz.col(i - 1)
98 .cwiseMax(state.wz.col(i - 1) - max_delta_wz)
99 .cwiseMin(state.wz.col(i - 1) + max_delta_wz);
100 state.wz.col(i) = state.cwz.col(i - 1);
103 auto lower_bound_vy = (state.vy.col(i - 1) >
104 0).select(state.vy.col(i - 1) + min_delta_vy,
105 state.vy.col(i - 1) - max_delta_vy);
106 auto upper_bound_vy = (state.vy.col(i - 1) >
107 0).select(state.vy.col(i - 1) + max_delta_vy,
108 state.vy.col(i - 1) - min_delta_vy);
109 state.cvy.col(i - 1) = state.cvy.col(i - 1)
110 .cwiseMax(lower_bound_vy)
111 .cwiseMin(upper_bound_vy);
112 state.vy.col(i) = state.cvy.col(i - 1);
130 float model_dt_{0.0};
131 models::ControlConstraints control_constraints_{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
147 auto getParam = param_handler->
getParamGetter(name +
".AckermannConstraints");
148 getParam(min_turning_r_,
"min_turning_r", 0.2);
166 const auto vx_ptr = control_sequence.vx.data();
167 auto wz_ptr = control_sequence.wz.data();
168 int steps = control_sequence.vx.size();
169 for(
int i = 0; i < steps; i++) {
170 float wz_constrained = fabs(*(vx_ptr + i) / min_turning_r_);
171 float & wz_curr = *(wz_ptr + i);
172 wz_curr = utils::clamp(-1 * wz_constrained, wz_constrained, wz_curr);
183 float min_turning_r_{0};
float getMinTurningRadius()
Get minimum turning radius of ackermann drive.
void applyConstraints(models::ControlSequence &control_sequence) override
Apply hard vehicle constraints to a control sequence.
bool isHolonomic() override
Whether the motion model is holonomic, using Y axis.
AckermannMotionModel(ParametersHandler *param_handler, const std::string &name)
Constructor for mppi::AckermannMotionModel.
Differential drive motion model.
DiffDriveMotionModel()=default
Constructor for mppi::DiffDriveMotionModel.
bool isHolonomic() override
Whether the motion model is holonomic, using Y axis.
Abstract motion model for modeling a vehicle.
void initialize(const models::ControlConstraints &control_constraints, float model_dt)
Initialize motion model on bringup and set required variables.
virtual void predict(models::State &state)
With input velocities, find the vehicle's output velocities.
virtual void applyConstraints(models::ControlSequence &)
Apply hard vehicle constraints to a control sequence.
MotionModel()=default
Constructor for mppi::MotionModel.
virtual bool isHolonomic()=0
Whether the motion model is holonomic, using Y axis.
virtual ~MotionModel()=default
Destructor for mppi::MotionModel.
Omnidirectional motion model.
OmniMotionModel()=default
Constructor for mppi::OmniMotionModel.
bool isHolonomic() override
Whether the motion model is holonomic, using Y axis.
Handles getting parameters and dynamic parameter changes.
auto getParamGetter(const std::string &ns)
Get an object to retrieve parameters.
A control sequence over time (e.g. trajectory)
State information: velocities, controls, poses, speed.