VehicleDifferential.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #pragma once
11 
12 #include <mrpt/math/TPoint2D.h>
13 #include <mvsim/PID_Controller.h>
14 #include <mvsim/VehicleBase.h>
15 
16 namespace mvsim
17 {
31 {
33  public:
34  enum
35  {
36  // common to all:
37  WHEEL_L = 0,
38  WHEEL_R = 1,
39  // 3 wheels:
41  // 4 wheels:
42  WHEEL_LR = 0,
43  WHEEL_RR = 1,
44  WHEEL_LF = 2,
46  };
47 
49  {
50  ConfigPerWheel() = default;
51  ConfigPerWheel(const std::string& _name, const mrpt::math::TPoint2D& _pos)
52  : name(_name), pos(_pos)
53  {
54  }
55 
56  std::string name;
57  mrpt::math::TPoint2D pos;
58  };
59 
62  parent, {
63  {"l_wheel", {0.0, 0.5}},
64  {"r_wheel", {0.0, -0.5}},
65  })
66  {
67  }
68 
69  DynamicsDifferential(World* parent, const std::vector<ConfigPerWheel>& cfgPerWheel);
70 
75  {
77  };
78 
80  {
81  TControllerOutput() = default;
82 
83  double wheel_torque_l = 0;
84  double wheel_torque_r = 0;
85  };
86 
89 
91  {
92  public:
94 
95  static const char* class_name() { return "raw"; }
96 
100 
101  double setpoint_teleop_steps = 5e-2;
102 
103  virtual void control_step(
106  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
107  };
108 
112  {
113  public:
115  static const char* class_name() { return "twist_pid"; }
116 
117  virtual void control_step(
120 
121  virtual void load_config(const rapidxml::xml_node<char>& node) override;
122  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
123 
125  double KP = 10, KI = 0, KD = 0;
126 
128  double max_torque = 100;
129 
130  // See base docs.
131  bool setTwistCommand(const mrpt::math::TTwist2D& t) override
132  {
133  setpointMtx_.lock();
134  setpoint_ = t;
135  setpointMtx_.unlock();
136  return true;
137  }
138 
140  mrpt::math::TTwist2D setpoint() const
141  {
142  setpointMtx_.lock();
143  auto t = setpoint_;
144  setpointMtx_.unlock();
145  return t;
146  }
147 
148  private:
149  double distWheels_ = 0;
150  std::array<PID_Controller, 2> PIDs_;
151  mrpt::math::TTwist2D setpoint_{0, 0, 0};
152  mutable std::mutex setpointMtx_;
153 
154  double joyMaxLinSpeed = 1.0;
155  double joyMaxAngSpeed = 0.5;
156  };
157 
162  {
163  public:
165  static const char* class_name() { return "twist_ideal"; }
166 
167  void control_step(
170  void on_post_step(const TSimulContext& context) override;
171 
172  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
173 
174  // See base docs.
175  bool setTwistCommand(const mrpt::math::TTwist2D& t) override
176  {
177  setpointMtx_.lock();
178  setpoint_ = t;
179  setpointMtx_.unlock();
180  return true;
181  }
182 
184  mrpt::math::TTwist2D setpoint() const
185  {
186  setpointMtx_.lock();
187  auto t = setpoint_;
188  setpointMtx_.unlock();
189  return t;
190  }
191 
192  private:
193  double distWheels_ = 0;
194  mrpt::math::TTwist2D setpoint_{0, 0, 0};
195  mutable std::mutex setpointMtx_;
196 
197  double joyMaxLinSpeed = 1.0;
198  double joyMaxAngSpeed = 0.5;
199  };
200 
201  const ControllerBase::Ptr& getController() const { return controller_; }
203  virtual ControllerBaseInterface* getControllerInterface() override { return controller_.get(); }
204  // end controllers
206 
207  virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const override;
208 
209  protected:
210  // See base class docs
211  virtual void dynamics_load_params_from_xml(const rapidxml::xml_node<char>* xml_node) override;
212  // See base class docs
213  virtual std::vector<double> invoke_motor_controllers(const TSimulContext& context) override;
214  virtual void invoke_motor_controllers_post_step(const TSimulContext& context) override;
215 
217  const std::vector<ConfigPerWheel> configPerWheel_;
218 
219  private:
221 };
222 
227 {
229 
230  public:
233  parent, {
234  {"l_wheel", {0.0, 0.5}},
235  {"r_wheel", {0.0, -0.5}},
236  {"caster_wheel", {0.5, 0.0}},
237  })
238  {
239  }
240 };
241 
246 {
248 
249  public:
252  parent, {
253  {"lr_wheel", {0.0, 0.5}},
254  {"rr_wheel", {0.0, -0.5}},
255  {"lf_wheel", {0.5, 0.5}},
256  {"rf_wheel", {0.5, -0.5}},
257  })
258  {
259  }
260 };
261 
262 } // namespace mvsim
mvsim::DynamicsDifferential::ConfigPerWheel::name
std::string name
Definition: VehicleDifferential.h:56
mvsim::VisualObject::parent
World * parent()
Definition: VisualObject.h:51
mvsim
Definition: Client.h:21
mvsim::DynamicsDifferential::ConfigPerWheel
Definition: VehicleDifferential.h:48
mvsim::DynamicsDifferential::ControllerTwistIdeal::setTwistCommand
bool setTwistCommand(const mrpt::math::TTwist2D &t) override
Definition: VehicleDifferential.h:175
mvsim::DynamicsDifferential::ControllerTwistPID::setpoint_
mrpt::math::TTwist2D setpoint_
"vx" and "omega" only
Definition: VehicleDifferential.h:151
mvsim::DynamicsDifferential::ControllerTwistIdeal::setpoint
mrpt::math::TTwist2D setpoint() const
Definition: VehicleDifferential.h:184
DECLARES_REGISTER_VEHICLE_DYNAMICS
#define DECLARES_REGISTER_VEHICLE_DYNAMICS(CLASS_NAME)
Definition: VehicleBase.h:257
mvsim::DynamicsDifferential::ControllerTwistPID::KI
double KI
Definition: VehicleDifferential.h:125
mvsim::DynamicsDifferential::ControllerTwistPID::max_torque
double max_torque
Maximum abs. value torque (for clamp) [Nm].
Definition: VehicleDifferential.h:128
mvsim::DynamicsDifferential::ConfigPerWheel::pos
mrpt::math::TPoint2D pos
Definition: VehicleDifferential.h:57
mvsim::DynamicsDifferential::ControllerTwistPID::KP
double KP
PID controller parameters.
Definition: VehicleDifferential.h:125
mvsim::DynamicsDifferential::ControllerTwistPID::joyMaxLinSpeed
double joyMaxLinSpeed
Definition: VehicleDifferential.h:154
mvsim::DynamicsDifferential::WHEEL_L
@ WHEEL_L
Definition: VehicleDifferential.h:37
mvsim::DynamicsDifferential::ControllerTwistIdeal::class_name
static const char * class_name()
Definition: VehicleDifferential.h:165
mvsim::DynamicsDifferential::ControllerRawForces::teleop_interface
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
Definition: VehicleDifferential_ControllerRaw.cpp:26
mvsim::DynamicsDifferential::ConfigPerWheel::ConfigPerWheel
ConfigPerWheel()=default
mvsim::DynamicsDifferential_4_wheels::DynamicsDifferential_4_wheels
DynamicsDifferential_4_wheels(World *parent)
Definition: VehicleDifferential.h:250
mvsim::DynamicsDifferential::TControllerOutput::wheel_torque_r
double wheel_torque_r
Definition: VehicleDifferential.h:84
mvsim::DynamicsDifferential::WHEEL_RR
@ WHEEL_RR
Definition: VehicleDifferential.h:43
mvsim::DynamicsDifferential::ControllerRawForces::ControllerRawForces
ControllerRawForces(DynamicsDifferential &veh)
Definition: VehicleDifferential.h:93
mvsim::DynamicsDifferential::ControllerTwistPID::control_step
virtual void control_step(const DynamicsDifferential::TControllerInput &ci, DynamicsDifferential::TControllerOutput &co) override
Definition: VehicleDifferential_ControllerTwistPID.cpp:28
mvsim::DynamicsDifferential::ControllerTwistPID::KD
double KD
Definition: VehicleDifferential.h:125
mvsim::ControllerBaseTempl::Ptr
std::shared_ptr< ControllerBaseTempl< VEH_DYNAMICS > > Ptr
Definition: ControllerBase.h:62
mvsim::DynamicsDifferential::ControllerTwistPID::load_config
virtual void load_config(const rapidxml::xml_node< char > &node) override
Definition: VehicleDifferential_ControllerTwistPID.cpp:76
mvsim::DynamicsDifferential::TControllerOutput
Definition: VehicleDifferential.h:79
mvsim::DynamicsDifferential::ControllerRawForces::setpoint_wheel_torque_r
double setpoint_wheel_torque_r
Definition: VehicleDifferential.h:99
mvsim::DynamicsDifferential::ControllerTwistPID::setTwistCommand
bool setTwistCommand(const mrpt::math::TTwist2D &t) override
Definition: VehicleDifferential.h:131
mvsim::DynamicsDifferential::ControllerRawForces::setpoint_wheel_torque_l
double setpoint_wheel_torque_l
Definition: VehicleDifferential.h:99
mvsim::DynamicsDifferential::invoke_motor_controllers
virtual std::vector< double > invoke_motor_controllers(const TSimulContext &context) override
Definition: VehicleDifferential.cpp:128
mvsim::DynamicsDifferential::ControllerTwistPID::setpoint
mrpt::math::TTwist2D setpoint() const
Definition: VehicleDifferential.h:140
mvsim::DynamicsDifferential::controller_
ControllerBase::Ptr controller_
The installed controller.
Definition: VehicleDifferential.h:220
mvsim::DynamicsDifferential::ControllerTwistIdeal::distWheels_
double distWheels_
Definition: VehicleDifferential.h:193
mvsim::DynamicsDifferential::ControllerRawForces
Definition: VehicleDifferential.h:90
mvsim::DynamicsDifferential::TControllerOutput::wheel_torque_l
double wheel_torque_l
Definition: VehicleDifferential.h:83
VehicleBase.h
mvsim::DynamicsDifferential::getController
const ControllerBase::Ptr & getController() const
Definition: VehicleDifferential.h:201
mvsim::DynamicsDifferential::configPerWheel_
const std::vector< ConfigPerWheel > configPerWheel_
Defined at ctor time:
Definition: VehicleDifferential.h:217
mvsim::DynamicsDifferential::WHEEL_LR
@ WHEEL_LR
Definition: VehicleDifferential.h:42
mvsim::DynamicsDifferential::ControllerTwistIdeal::joyMaxLinSpeed
double joyMaxLinSpeed
Definition: VehicleDifferential.h:197
mvsim::DynamicsDifferential::DynamicsDifferential
DynamicsDifferential(World *parent)
Definition: VehicleDifferential.h:60
mvsim::DynamicsDifferential::ControllerTwistPID::PIDs_
std::array< PID_Controller, 2 > PIDs_
Definition: VehicleDifferential.h:150
mvsim::ControllerBaseTempl
Definition: ControllerBase.h:59
mvsim::DynamicsDifferential::WHEEL_RF
@ WHEEL_RF
Definition: VehicleDifferential.h:45
mvsim::DynamicsDifferential::ControllerTwistIdeal::joyMaxAngSpeed
double joyMaxAngSpeed
Definition: VehicleDifferential.h:198
mvsim::TSimulContext
Definition: basic_types.h:58
mvsim::DynamicsDifferential::ControllerRawForces::setpoint_teleop_steps
double setpoint_teleop_steps
Definition: VehicleDifferential.h:101
mvsim::DynamicsDifferential::WHEEL_LF
@ WHEEL_LF
Definition: VehicleDifferential.h:44
mvsim::DynamicsDifferential::ControllerTwistIdeal::setpoint_
mrpt::math::TTwist2D setpoint_
"vx" and "omega" only
Definition: VehicleDifferential.h:194
mvsim::DynamicsDifferential::ControllerTwistPID::setpointMtx_
std::mutex setpointMtx_
Definition: VehicleDifferential.h:152
mvsim::ControllerBaseInterface::TeleopOutput
Definition: ControllerBase.h:33
mvsim::DynamicsDifferential::ControllerTwistIdeal
Definition: VehicleDifferential.h:161
mvsim::DynamicsDifferential::ConfigPerWheel::ConfigPerWheel
ConfigPerWheel(const std::string &_name, const mrpt::math::TPoint2D &_pos)
Definition: VehicleDifferential.h:51
mvsim::DynamicsDifferential::ControllerTwistPID::ControllerTwistPID
ControllerTwistPID(DynamicsDifferential &veh)
Definition: VehicleDifferential_ControllerTwistPID.cpp:17
mvsim::DynamicsDifferential::ControllerTwistPID::distWheels_
double distWheels_
Definition: VehicleDifferential.h:149
mvsim::DynamicsDifferential::ControllerRawForces::control_step
virtual void control_step(const DynamicsDifferential::TControllerInput &ci, DynamicsDifferential::TControllerOutput &co) override
Definition: VehicleDifferential_ControllerRaw.cpp:18
mvsim::DynamicsDifferential::dynamics_load_params_from_xml
virtual void dynamics_load_params_from_xml(const rapidxml::xml_node< char > *xml_node) override
Definition: VehicleDifferential.cpp:48
mvsim::DynamicsDifferential::ControllerTwistIdeal::control_step
void control_step(const DynamicsDifferential::TControllerInput &ci, DynamicsDifferential::TControllerOutput &co) override
Definition: VehicleDifferential_ControllerTwistIdeal.cpp:24
mvsim::DynamicsDifferential::ControllerTwistIdeal::on_post_step
void on_post_step(const TSimulContext &context) override
Definition: VehicleDifferential_ControllerTwistIdeal.cpp:32
mvsim::DynamicsDifferential::getVelocityLocalOdoEstimate
virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const override
Definition: VehicleDifferential.cpp:173
mvsim::DynamicsDifferential::ControllerTwistIdeal::setpointMtx_
std::mutex setpointMtx_
Definition: VehicleDifferential.h:195
mvsim::DynamicsDifferential::getControllerInterface
virtual ControllerBaseInterface * getControllerInterface() override
Definition: VehicleDifferential.h:203
mvsim::World
Definition: World.h:82
mvsim::DynamicsDifferential::TControllerInput::context
TSimulContext context
Definition: VehicleDifferential.h:76
mvsim::VehicleBase
Definition: VehicleBase.h:44
rapidxml::xml_node< char >
mvsim::DynamicsDifferential::WHEEL_R
@ WHEEL_R
Definition: VehicleDifferential.h:38
mvsim::DynamicsDifferential::ControllerTwistPID::joyMaxAngSpeed
double joyMaxAngSpeed
Definition: VehicleDifferential.h:155
mvsim::ControllerBaseInterface
Definition: ControllerBase.h:22
mvsim::DynamicsDifferential::ControllerTwistIdeal::teleop_interface
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
Definition: VehicleDifferential_ControllerTwistIdeal.cpp:40
mvsim::DynamicsDifferential::WHEEL_CASTER_FRONT
@ WHEEL_CASTER_FRONT
Definition: VehicleDifferential.h:40
mvsim::DynamicsDifferential::TControllerOutput::TControllerOutput
TControllerOutput()=default
mvsim::ControllerBaseInterface::TeleopInput
Definition: ControllerBase.h:25
mvsim::DynamicsDifferential::getController
ControllerBase::Ptr & getController()
Definition: VehicleDifferential.h:202
mvsim::DynamicsDifferential::TControllerInput
Definition: VehicleDifferential.h:74
mvsim::DynamicsDifferential::ControllerTwistPID::class_name
static const char * class_name()
Definition: VehicleDifferential.h:115
mvsim::DynamicsDifferential::ControllerTwistPID::teleop_interface
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
Definition: VehicleDifferential_ControllerTwistPID.cpp:91
PID_Controller.h
mvsim::DynamicsDifferential_3_wheels::DynamicsDifferential_3_wheels
DynamicsDifferential_3_wheels(World *parent)
Definition: VehicleDifferential.h:231
mvsim::DynamicsDifferential::ControllerTwistIdeal::ControllerTwistIdeal
ControllerTwistIdeal(DynamicsDifferential &veh)
Definition: VehicleDifferential_ControllerTwistIdeal.cpp:14
mvsim::DynamicsDifferential_3_wheels
Definition: VehicleDifferential.h:226
mvsim::DynamicsDifferential_4_wheels
Definition: VehicleDifferential.h:245
t
geometry_msgs::TransformStamped t
mvsim::DynamicsDifferential::ControllerTwistPID
Definition: VehicleDifferential.h:111
mvsim::DynamicsDifferential
Definition: VehicleDifferential.h:30
mvsim::DynamicsDifferential::invoke_motor_controllers_post_step
virtual void invoke_motor_controllers_post_step(const TSimulContext &context) override
Definition: VehicleDifferential.cpp:167


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08