1#ifndef QUADRATIC_THRUST_MODEL_H
2#define QUADRATIC_THRUST_MODEL_H
5#include <mrs_lib/param_loader.h>
10 namespace quadratic_throttle_model
17 motor_params_t(
int n_motors,
double a,
double b) : n_motors(n_motors), a(a), b(b), c(0), type(type_t::legacy), an(0), bn(0), cn(0)
22 : n_motors(n_motors), a(a), b(b), c(c), type(type_t::full_quadratic), an(a * n_motors), bn(b * n_motors), cn(c * n_motors)
25 type = type_t::linear;
31 pl.
loadParam<
double>(
"motor_params/a", a);
32 pl.
loadParam<
double>(
"motor_params/b", b);
33 type = type_t::legacy;
34 const auto c_loaded = pl.
loadParam(
"motor_params/c", c, 0.0);
35 pl.
loadParam(
"motor_params/n_motors", n_motors);
39 type = type_t::full_quadratic;
45 type = type_t::linear;
66 double inline throttleToForce(
const motor_params_t& motor_params,
const double throttle)
68 if (motor_params.type == motor_params_t::type_t::full_quadratic || motor_params.type == motor_params_t::type_t::linear)
70 return motor_params.n_motors * (motor_params.a * throttle * throttle + motor_params.b * throttle + motor_params.c);
73 return motor_params.n_motors * pow((throttle - motor_params.b) / motor_params.a, 2);
76 double inline forceToThrottle(
const motor_params_t& motor_params,
const double force)
78 if (motor_params.type == motor_params_t::type_t::linear || motor_params.a < 1e-6)
84 if (motor_params.bn < 1e-6)
89 return (force - motor_params.cn) / motor_params.bn;
90 }
else if (motor_params.type == motor_params_t::type_t::full_quadratic)
97 const double cp = motor_params.cn - force;
98 double discriminant = motor_params.bn * motor_params.bn - 4.0 * motor_params.an * cp;
100 if (discriminant < 0.0)
106 const double root1 = (-motor_params.bn + std::sqrt(discriminant)) / (2 * motor_params.an);
108 return std::clamp(root1, 0.0, 1.0);
111 return sqrt(force / motor_params.n_motors) * motor_params.a + motor_params.b;
Convenience class for loading parameters from rosparam server.
Definition param_loader.h:46
bool loadParam(const std::string &name, T &out_value, const T &default_value)
Loads a parameter from the rosparam server with a default value.
Definition param_loader.hpp:304
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition attitude_converter.h:24
Definition quadratic_throttle_model.h:14