10 #include <mrpt/opengl/COpenGLScene.h> 19 using namespace mvsim;
63 const std::map<std::string, std::string> varValues = {{
"NAME",
name_}};
78 *xml_chassis, attribs, {},
79 "[DynamicsAckermann::dynamics_load_params_from_xml]");
87 "[DynamicsAckermann::dynamics_load_params_from_xml]");
94 const char* w_names[4] = {
101 for (
size_t i = 0; i < 4; i++)
103 if (
auto xml_wheel = xml_node->
first_node(w_names[i]); xml_wheel)
110 mrpt::system::LVL_WARN,
111 "No XML entry '%s' found: using defaults for wheel #%u",
112 w_names[i], static_cast<unsigned int>(i));
120 double front_x = 1.3;
121 double front_d = 2.0;
124 ack_ps[
"f_wheels_x"] =
TParamEntry(
"%lf", &front_x);
125 ack_ps[
"f_wheels_d"] =
TParamEntry(
"%lf", &front_d);
130 *xml_node, ack_ps, varValues,
131 "[DynamicsAckermann::dynamics_load_params_from_xml]");
150 if (!control_class || !control_class->
value())
152 "[DynamicsAckermann] Missing 'class' attribute in " 153 "<controller> XML node");
155 const std::string sCtrlClass = std::string(control_class->
value());
157 controller_ = std::make_shared<ControllerRawForces>(*
this);
160 std::make_shared<ControllerTwistFrontSteerPID>(*
this);
162 controller_ = std::make_shared<ControllerFrontSteerPID>(*
this);
165 "[DynamicsAckermann] Unknown 'class'='%s' in " 166 "<controller> XML node",
174 controller_ = std::make_shared<ControllerRawForces>(*this);
182 std::vector<double> out_torque_per_wheel;
183 out_torque_per_wheel.assign(4, 0.0);
205 return out_torque_per_wheel;
209 const double desired_equiv_steer_ang,
double& out_fl_ang,
210 double& out_fr_ang)
const 217 const double w_l = w / l;
221 const bool delta_neg = (desired_equiv_steer_ang < 0);
222 ASSERT_LT_(delta, 0.5 *
M_PI - 0.01);
223 const double cot_do = 1.0 /
tan(delta) + 0.5 * w_l;
224 const double cot_di = cot_do - w_l;
227 (delta_neg ? out_fr_ang : out_fl_ang) =
228 atan(1.0 / cot_di) * (delta_neg ? -1.0 : 1.0);
229 (delta_neg ? out_fl_ang : out_fr_ang) =
230 atan(1.0 / cot_do) * (delta_neg ? -1.0 : 1.0);
236 mrpt::math::TTwist2D odo_vel;
250 "The two wheels of a differential vehicle cannot be at the same Y " 253 const double w_veh = (w1 * R1 - w0 * R0) / Ay;
258 odo_vel.omega = w_veh;
263 printf(
"\n gt: vx=%7.03f, vy=%7.03f, w= %7.03fdeg\n", gt_vel.vx, gt_vel.vy, mrpt::RAD2DEG(gt_vel.omega));
264 printf(
"odo: vx=%7.03f, vy=%7.03f, w= %7.03fdeg\n", odo_vel.vx, odo_vel.vy, mrpt::RAD2DEG(odo_vel.omega));
This file contains rapidxml parser and DOM implementation.
void updateMaxRadiusFromPoly()
std::map< std::string, TParamEntry > TParameterDefinitions
virtual std::vector< double > invoke_motor_controllers(const TSimulContext &context) override
void parse_xmlnode_children_as_param(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions ¶ms, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="", mrpt::system::COutputLogger *logger=nullptr)
DynamicsAckermann(World *parent)
virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const override
ControllerBase::Ptr controller_
The installed controller.
void computeFrontWheelAngles(const double desired_equiv_steer_ang, double &out_fl_ang, double &out_fr_ang) const
void parse_xmlnode_attribs(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions ¶ms, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="")
virtual void dynamics_load_params_from_xml(const rapidxml::xml_node< char > *xml_node) override
std::deque< Wheel > wheels_info_
xml_node< Ch > * first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
INLINE Rall1d< T, V, S > atan(const Rall1d< T, V, S > &x)
mrpt::math::TPolygon2D chassis_poly_
b2Fixture * fixture_chassis_
Created at.
T b2Clamp(T a, T low, T high)
mrpt::math::TTwist2D getVelocityLocal() const
double steer_ang
Equivalent Ackermann steering angle.
mrpt::img::TColor chassis_color_
void parse_xmlnode_shape(const rapidxml::xml_node< char > &xml_node, mrpt::math::TPolygon2D &out_poly, const char *functionNameContext="")
static const char * class_name()
INLINE Rall1d< T, V, S > tan(const Rall1d< T, V, S > &arg)
static const char * class_name()
xml_attribute< Ch > * first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
std::vector< b2Fixture * > fixture_wheels_
static const char * class_name()