14 using namespace mvsim;
31 const auto sp = setpoint();
36 const double spVelL = sp.vx - 0.5 * sp.omega * distWheels_;
37 const double spVelR = sp.vx + 0.5 * sp.omega * distWheels_;
41 const mrpt::math::TTwist2D vehVelOdo = veh_.getVelocityLocalOdoEstimate();
42 const double actVelL = vehVelOdo.vx - 0.5 * vehVelOdo.omega * distWheels_;
43 const double actVelR = vehVelOdo.vx + 0.5 * vehVelOdo.omega * distWheels_;
46 for (
auto& pid : PIDs_)
51 pid.max_out = max_torque;
55 const double followErrorL = spVelL - actVelL;
56 const double followErrorR = spVelR - actVelR;
58 const double zeroThres = 0.001;
60 if (std::abs(spVelL) < zeroThres &&
61 std::abs(spVelR) < zeroThres &&
62 std::abs(spVelR) < zeroThres &&
63 std::abs(spVelR) < zeroThres)
67 for (
auto& pid : PIDs_) pid.reset();
82 params[
"max_torque"] =
TParamEntry(
"%lf", &max_torque);
86 params[
"W"] =
TParamEntry(
"%lf_deg", &setpoint_.omega);
96 auto lck = mrpt::lockHelper(setpointMtx_);
112 setpoint_.omega += 2.0 * M_PI / 180;
117 setpoint_.omega -= 2.0 * M_PI / 180;
122 setpoint_ = {0, 0, 0};
123 for (
auto& pid : PIDs_) pid.reset();
130 if (in.
js && in.
js->axes.size() >= 2)
132 const auto& js = in.
js.value();
133 const float js_x = js.axes[0];
134 const float js_y = js.axes[1];
136 setpoint_.vx = -js_y * joyMaxLinSpeed;
137 setpoint_.omega = -js_x * joyMaxAngSpeed;
139 if (js.buttons.size() >= 7)
141 if (js.buttons[5]) joyMaxLinSpeed *= 1.01;
142 if (js.buttons[7]) joyMaxLinSpeed /= 1.01;
144 if (js.buttons[4]) joyMaxAngSpeed *= 1.01;
145 if (js.buttons[6]) joyMaxAngSpeed /= 1.01;
149 setpoint_ = {0, 0, 0};
150 for (
auto& pid : PIDs_) pid.reset();
156 "maxLinSpeed=%.03f m/s\n"
157 "maxAngSpeed=%.03f deg/s\n",
158 joyMaxLinSpeed, mrpt::RAD2DEG(joyMaxAngSpeed));
164 "w/s=forward/backward.\n"
170 "setpoint: lin=%.03f ang=%.03f deg/s\n", setpoint_.vx, 180.0 / M_PI * setpoint_.omega);