MVSim
Lightweight simulator for 2.5D vehicles and robots
VehicleAckermann.h
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2026 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/img/TColor.h>
13 #include <mvsim/PID_Controller.h>
14 #include <mvsim/PoseTrajectoryFollower.h>
15 #include <mvsim/VehicleBase.h>
16 
17 namespace mvsim
18 {
24 {
25  DECLARES_REGISTER_VEHICLE_DYNAMICS(DynamicsAckermann)
26  public:
27  // Wheels: [0]:rear-left, [1]:rear-right, [2]: front-left, [3]: front-right
28  enum
29  {
30  WHEEL_RL = 0,
31  WHEEL_RR = 1,
32  WHEEL_FL = 2,
33  WHEEL_FR = 3
34  };
35 
36  DynamicsAckermann(World* parent);
37 
39  double getMaxSteeringAngle() const { return max_steer_ang_; }
40  void setMaxSteeringAngle(double val) { max_steer_ang_ = val; }
45  {
46  TSimulContext context;
47  };
49  {
50  double fl_torque, fr_torque, rl_torque, rr_torque;
51  double steer_ang;
52  TControllerOutput() : fl_torque(0), fr_torque(0), rl_torque(0), rr_torque(0), steer_ang(0)
53  {
54  }
55  };
56 
59 
61  {
62  public:
64  static const char* class_name() { return "raw"; }
67  double setpoint_wheel_torque_l, setpoint_wheel_torque_r, setpoint_steer_ang;
68  virtual void control_step(
71  virtual void load_config(const rapidxml::xml_node<char>& node) override;
72  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
73  };
74 
78  {
79  public:
81  static const char* class_name() { return "twist_front_steer_pid"; }
84  double setpoint_lin_speed,
86  virtual void control_step(
89  virtual void load_config(const rapidxml::xml_node<char>& node) override;
90  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
91 
92  double KP, KI, KD;
93  double N = 0;
94  double max_torque;
96  double zero_threshold = 0.001;
98  double stop_threshold = 0.05;
99 
100  bool enable_antiwindup = false;
101  bool enable_feedforward = false;
102  double feedforward_gain = 1.0;
103  bool enable_reference_filter = false;
104  double reference_filter_tau = 0.1;
105  int reference_filter_order = 1;
106 
107  // See base docs.
108  virtual bool setTwistCommand(const mrpt::math::TTwist2D& t) override
109  {
110  setpoint_lin_speed = t.vx;
111  setpoint_ang_speed = t.omega;
112  return true;
113  }
114 
115  private:
116  double dist_fWheels_, r2f_L_;
117  PID_Controller PID_[2]; //<! [0]:fl, [1]: fr
118 
119  double joyMaxLinSpeed = 1.0;
120  double joyMaxAngSpeed = 0.7;
121  };
122 
126  {
127  public:
129  static const char* class_name() { return "front_steer_pid"; }
132  double setpoint_lin_speed, setpoint_steer_ang;
135  virtual void control_step(
138  virtual void load_config(const rapidxml::xml_node<char>& node) override;
139  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
140 
141  double KP, KI, KD;
142  double max_torque;
143  private:
144  ControllerTwistFrontSteerPID twist_control_;
145  double r2f_L_;
146 
147  double joyMaxLinSpeed = 1.0;
148  double joyMaxSteerAng = 0.7;
149  };
150 
162  {
163  public:
165  static const char* class_name() { return "twist_ideal"; }
166 
168  mrpt::math::TTwist2D setpoint() const
169  {
170  auto lck = mrpt::lockHelper(setpointMtx_);
171  return setpoint_;
172  }
173  void setSetpoint(const mrpt::math::TTwist2D& sp)
174  {
175  auto lck = mrpt::lockHelper(setpointMtx_);
176  setpoint_ = sp;
177  }
178 
179  virtual void control_step(
182 
183  virtual void on_post_step(const TSimulContext& context) override;
184 
185  virtual void load_config(const rapidxml::xml_node<char>& node) override;
186  virtual void teleop_interface(const TeleopInput& in, TeleopOutput& out) override;
187 
188  // Accept Twist commands from ROS / mvsim-server
189  virtual bool setTwistCommand(const mrpt::math::TTwist2D& t) override
190  {
191  setSetpoint(t);
192  return true;
193  }
194 
195  private:
196  mutable std::mutex setpointMtx_;
197  mrpt::math::TTwist2D setpoint_{0, 0, 0};
198 
199  double r2f_L_ = 1.0;
200 
201  double joyMaxLinSpeed = 1.0;
202  double joyMaxAngSpeed = 0.7;
203  };
204 
226  {
227  public:
229  static const char* class_name() { return "trajectory"; }
230 
231  virtual void control_step(
234 
235  virtual void on_post_step(const TSimulContext& context) override;
236 
237  virtual void load_config(const rapidxml::xml_node<char>& node) override;
238 
239  bool getTrajectoryPlotPoints(
240  std::vector<mrpt::math::TPoint2D>& pts, double& height) const override;
241 
242  private:
243  PoseTrajectoryFollower follower_;
244  mrpt::math::TTwist2D lastTwist_{0, 0, 0};
245 
246  double r2f_L_ = 1.0;
247  double vizHeight_ = 0.5;
248  };
249 
250  const ControllerBase::Ptr& getController() const { return controller_; }
251  ControllerBase::Ptr& getController() { return controller_; }
252  virtual ControllerBaseInterface* getControllerInterface() override { return controller_.get(); }
253  // end controllers
255 
256  virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const override;
257 
264  const double desired_equiv_steer_ang, double& out_fl_ang, double& out_fr_ang) const;
265 
266  protected:
267  // See base class docs
268  virtual void dynamics_load_params_from_xml(const rapidxml::xml_node<char>* xml_node) override;
269  // See base class doc
270  virtual std::vector<double> invoke_motor_controllers(const TSimulContext& context) override;
271  virtual void invoke_motor_controllers_post_step(const TSimulContext& context) override;
272 
273  private:
274  ControllerBase::Ptr controller_;
275 
277  double max_steer_ang_ = mrpt::DEG2RAD(30);
278 };
279 } // namespace mvsim
Definition: ControllerBase.h:77
Definition: VehicleAckermann.h:126
static const char * class_name()
Definition: VehicleAckermann.h:129
double KD
PID controller parameters.
Definition: VehicleAckermann.h:141
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
double setpoint_steer_ang
Definition: VehicleAckermann.h:132
double max_torque
Maximum abs. value torque (for clamp) [Nm].
Definition: VehicleAckermann.h:142
Definition: VehicleAckermann.h:61
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
static const char * class_name()
Definition: VehicleAckermann.h:64
Definition: VehicleAckermann.h:226
static const char * class_name()
Definition: VehicleAckermann.h:81
double max_torque
Definition: VehicleAckermann.h:94
double zero_threshold
setpoint magnitude below which it is treated as zero [m/s]
Definition: VehicleAckermann.h:96
double setpoint_ang_speed
desired velocities (m/s) and (rad/s)
Definition: VehicleAckermann.h:85
double stop_threshold
velocity magnitude below which vehicle is considered stopped [m/s]
Definition: VehicleAckermann.h:98
double N
Derivative filter coefficient.
Definition: VehicleAckermann.h:93
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
double KD
PID controller parameters.
Definition: VehicleAckermann.h:92
Definition: VehicleAckermann.h:162
mrpt::math::TTwist2D setpoint() const
Definition: VehicleAckermann.h:168
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
Definition: VehicleAckermann.h:24
void computeFrontWheelAngles(const double desired_equiv_steer_ang, double &out_fl_ang, double &out_fr_ang) const
virtual void dynamics_load_params_from_xml(const rapidxml::xml_node< char > *xml_node) override
virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const override
double getMaxSteeringAngle() const
Definition: VehicleAckermann.h:39
Definition: PoseTrajectoryFollower.h:38
Definition: VehicleBase.h:44
Definition: World.h:133
Definition: ControllerBase.h:26
Definition: ControllerBase.h:34
Definition: VehicleAckermann.h:45
Definition: VehicleAckermann.h:49
double steer_ang
Equivalent Ackermann steering angle.
Definition: VehicleAckermann.h:51
Definition: PID_Controller.h:21
Definition: basic_types.h:58