15 #ifndef NAV2_MPPI_CONTROLLER__MOTION_MODELS_HPP_
16 #define NAV2_MPPI_CONTROLLER__MOTION_MODELS_HPP_
21 #include "nav2_mppi_controller/models/control_sequence.hpp"
22 #include "nav2_mppi_controller/models/state.hpp"
23 #include "nav2_mppi_controller/models/constraints.hpp"
26 #pragma GCC diagnostic push
27 #pragma GCC diagnostic ignored "-Warray-bounds"
28 #pragma GCC diagnostic ignored "-Wstringop-overflow"
29 #include <xtensor/xmath.hpp>
30 #include <xtensor/xmasked_view.hpp>
31 #include <xtensor/xview.hpp>
32 #include <xtensor/xnoalias.hpp>
33 #pragma GCC diagnostic pop
35 #include "nav2_mppi_controller/tools/parameters_handler.hpp"
64 control_constraints_ = control_constraints;
86 float max_delta_vx = model_dt_ * control_constraints_.ax_max;
87 float min_delta_vx = model_dt_ * control_constraints_.ax_min;
88 float max_delta_vy = model_dt_ * control_constraints_.ay_max;
89 float min_delta_vy = model_dt_ * control_constraints_.ay_min;
90 float max_delta_wz = model_dt_ * control_constraints_.az_max;
91 for (
unsigned int i = 0; i != state.vx.shape(0); i++) {
92 float vx_last = state.vx(i, 0);
93 float vy_last = state.vy(i, 0);
94 float wz_last = state.wz(i, 0);
95 for (
unsigned int j = 1; j != state.vx.shape(1); j++) {
96 float & cvx_curr = state.cvx(i, j - 1);
98 cvx_curr = std::clamp(cvx_curr, vx_last + min_delta_vx, vx_last + max_delta_vx);
100 cvx_curr = std::clamp(cvx_curr, vx_last - max_delta_vx, vx_last - min_delta_vx);
102 state.vx(i, j) = cvx_curr;
105 float & cwz_curr = state.cwz(i, j - 1);
106 cwz_curr = std::clamp(cwz_curr, wz_last - max_delta_wz, wz_last + max_delta_wz);
107 state.wz(i, j) = cwz_curr;
111 float & cvy_curr = state.cvy(i, j - 1);
113 cvy_curr = std::clamp(cvy_curr, vy_last + min_delta_vy, vy_last + max_delta_vy);
115 cvy_curr = std::clamp(cvy_curr, vy_last - max_delta_vy, vy_last - min_delta_vy);
117 state.vy(i, j) = cvy_curr;
137 float model_dt_{0.0};
138 models::ControlConstraints control_constraints_{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
154 auto getParam = param_handler->
getParamGetter(name +
".AckermannConstraints");
155 getParam(min_turning_r_,
"min_turning_r", 0.2);
173 auto & vx = control_sequence.vx;
174 auto & wz = control_sequence.wz;
176 auto view = xt::masked_view(wz, (xt::fabs(vx) / xt::fabs(wz)) < min_turning_r_);
177 view = xt::sign(wz) * xt::fabs(vx) / min_turning_r_;
187 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 parmaeter changes.
auto getParamGetter(const std::string &ns)
Get an object to retreive parameters.
A control sequence over time (e.g. trajectory)
State information: velocities, controls, poses, speed.