VehicleDifferential_ControllerTwistIdeal.cpp
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 
11 
12 using namespace mvsim;
13 
15  : ControllerBase(veh)
16 {
17  // Get distance between wheels:
18  // Warning: the controller *assumes* that both wheels are parallel (as it's
19  // a rule in differential robots!!)
20  distWheels_ = veh_.wheels_info_[0].y - veh_.wheels_info_[1].y;
21  ASSERT_(distWheels_ > 0);
22 }
23 
25  [[maybe_unused]] const DynamicsDifferential::TControllerInput& ci,
27 {
28  co.wheel_torque_l = 0;
29  co.wheel_torque_r = 0;
30 }
31 
33  [[maybe_unused]] const TSimulContext& context)
34 {
35  // Fake controller: just set the setpoint as state and we are done.
36  const auto sp = setpoint();
37  this->veh_.setTwist(sp);
38 }
39 
41  const TeleopInput& in, TeleopOutput& out)
42 {
44 
45  auto lck = mrpt::lockHelper(setpointMtx_);
46 
47  switch (in.keycode)
48  {
49  case 'W':
50  case 'w':
51  setpoint_.vx += 0.1;
52  break;
53 
54  case 'S':
55  case 's':
56  setpoint_.vx -= 0.1;
57  break;
58 
59  case 'A':
60  case 'a':
61  setpoint_.omega += 2.0 * M_PI / 180;
62  break;
63 
64  case 'D':
65  case 'd':
66  setpoint_.omega -= 2.0 * M_PI / 180;
67  break;
68 
69  case ' ':
70  {
71  setpoint_ = {0, 0, 0};
72  }
73  break;
74  };
75 
76  out.append_gui_lines += "[Controller=" + std::string(class_name()) + "]";
77 
78  if (in.js && in.js->axes.size() >= 2)
79  {
80  const auto& js = in.js.value();
81  const float js_x = js.axes[0];
82  const float js_y = js.axes[1];
83 
84  setpoint_.vx = -js_y * joyMaxLinSpeed;
85  setpoint_.omega = -js_x * joyMaxAngSpeed;
86 
87  if (js.buttons.size() >= 7)
88  {
89  if (js.buttons[5]) joyMaxLinSpeed *= 1.01;
90  if (js.buttons[7]) joyMaxLinSpeed /= 1.01;
91 
92  if (js.buttons[4]) joyMaxAngSpeed *= 1.01;
93  if (js.buttons[6]) joyMaxAngSpeed /= 1.01;
94 
95  // brake
96  if (js.buttons[3]) setpoint_ = {0, 0, 0};
97  }
98 
99  out.append_gui_lines += mrpt::format(
100  "Teleop joystick:\n"
101  "maxLinSpeed=%.03f m/s\n"
102  "maxAngSpeed=%.03f deg/s\n",
103  joyMaxLinSpeed, mrpt::RAD2DEG(joyMaxAngSpeed));
104  }
105  else
106  {
107  out.append_gui_lines +=
108  "Teleop keys:\n"
109  "w/s=forward/backward.\n"
110  "a/d=left/right.\n"
111  "spacebar=stop.\n";
112  }
113 
114  out.append_gui_lines += mrpt::format(
115  "setpoint: lin=%.03f ang=%.03f deg/s\n", setpoint_.vx, 180.0 / M_PI * setpoint_.omega);
116 }
mvsim
Definition: Client.h:21
mvsim::ControllerBaseTempl::teleop_interface
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
Definition: ControllerBase.h:67
mvsim::ControllerBaseInterface::TeleopOutput::append_gui_lines
std::string append_gui_lines
Definition: ControllerBase.h:35
mvsim::DynamicsDifferential::TControllerOutput::wheel_torque_r
double wheel_torque_r
Definition: VehicleDifferential.h:84
mvsim::DynamicsDifferential::TControllerOutput
Definition: VehicleDifferential.h:79
VehicleDifferential.h
mvsim::DynamicsDifferential::ControllerTwistIdeal::distWheels_
double distWheels_
Definition: VehicleDifferential.h:193
mvsim::DynamicsDifferential::TControllerOutput::wheel_torque_l
double wheel_torque_l
Definition: VehicleDifferential.h:83
mvsim::ControllerBaseTempl
Definition: ControllerBase.h:59
mvsim::TSimulContext
Definition: basic_types.h:58
mvsim::ControllerBaseInterface::TeleopOutput
Definition: ControllerBase.h:33
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::ControllerTwistIdeal::teleop_interface
virtual void teleop_interface(const TeleopInput &in, TeleopOutput &out) override
Definition: VehicleDifferential_ControllerTwistIdeal.cpp:40
mvsim::ControllerBaseInterface::TeleopInput
Definition: ControllerBase.h:25
mvsim::DynamicsDifferential::TControllerInput
Definition: VehicleDifferential.h:74
mvsim::ControllerBaseTempl::veh_
VEH_DYNAMICS & veh_
Definition: ControllerBase.h:124
mvsim::ControllerBaseInterface::TeleopInput::js
std::optional< TJoyStickEvent > js
Definition: ControllerBase.h:28
mvsim::ControllerBaseInterface::TeleopInput::keycode
int keycode
Definition: ControllerBase.h:27
mvsim::DynamicsDifferential::ControllerTwistIdeal::ControllerTwistIdeal
ControllerTwistIdeal(DynamicsDifferential &veh)
Definition: VehicleDifferential_ControllerTwistIdeal.cpp:14
mvsim::DynamicsDifferential
Definition: VehicleDifferential.h:30


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