VehicleBase.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 <box2d/b2_body.h>
13 #include <box2d/b2_fixture.h>
14 #include <box2d/b2_polygon_shape.h>
15 #include <box2d/b2_world.h>
16 #include <mrpt/img/TColor.h>
17 #include <mrpt/opengl/CSetOfLines.h>
18 #include <mrpt/opengl/CSetOfObjects.h>
19 #include <mrpt/poses/CPose2D.h>
20 #include <mvsim/ClassFactory.h>
21 #include <mvsim/ControllerBase.h>
24 #include <mvsim/Simulable.h>
25 #include <mvsim/VisualObject.h>
26 #include <mvsim/Wheel.h>
27 #include <mvsim/basic_types.h>
28 
29 #include <atomic>
30 #include <map>
31 #include <mutex>
32 #include <string>
33 
34 #include "CsvLogger.h"
35 
36 namespace mvsim
37 {
44 class VehicleBase : public VisualObject, public Simulable
45 {
46  public:
47  using Ptr = std::shared_ptr<VehicleBase>;
48 
51  static Ptr factory(World* parent, const rapidxml::xml_node<char>* xml_node);
53  static Ptr factory(World* parent, const std::string& xml_text);
54 
57  static void register_vehicle_class(
58  const World& parent, const rapidxml::xml_node<char>* xml_node);
59 
60  // ------- Interface with "World" ------
61  virtual void simul_pre_timestep(const TSimulContext& context) override;
62  virtual void simul_post_timestep(const TSimulContext& context) override;
63  virtual void apply_force(
64  const mrpt::math::TVector2D& force,
65  const mrpt::math::TPoint2D& applyPoint = mrpt::math::TPoint2D(0, 0)) override;
66 
69  virtual void create_multibody_system(b2World& world);
70 
73  virtual float getMaxVehicleRadius() const { return maxRadius_; }
75  virtual double getChassisMass() const { return chassis_mass_; }
76  b2Body* getBox2DChassisBody() { return b2dBody_; }
77  mrpt::math::TPoint2D getChassisCenterOfMass() const
78  {
79  return chassis_com_;
80  }
81 
82  size_t getNumWheels() const { return wheels_info_.size(); }
83  const Wheel& getWheelInfo(const size_t idx) const { return wheels_info_[idx]; }
84  Wheel& getWheelInfo(const size_t idx) { return wheels_info_[idx]; }
85 
88  std::vector<mrpt::math::TVector2D> getWheelsVelocityLocal(
89  const mrpt::math::TTwist2D& veh_vel_local) const;
90 
95  virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const = 0;
96 
97  const TListSensors& getSensors() const { return sensors_; }
99  std::shared_ptr<CSVLogger> getLoggerPtr(std::string logger_name)
100  {
101  return loggers_[logger_name];
102  }
103 
106  const mrpt::math::TPolygon2D& getChassisShape() const { return chassis_poly_; }
107 
109  void setVehicleIndex(size_t idx) { vehicle_index_ = idx; }
111  size_t getVehicleIndex() const { return vehicle_index_; }
112  void setRecording(bool record)
113  {
114  for (auto& logger : loggers_) logger.second->setRecording(record);
115  }
116  void clearLogs()
117  {
118  for (auto& logger : loggers_) logger.second->clear();
119  }
121  {
122  for (auto& logger : loggers_) logger.second->newSession();
123  }
124 
126 
127  void registerOnServer(mvsim::Client& c) override;
128 
130  std::vector<b2Fixture*>& get_fixture_wheels() { return fixture_wheels_; }
131  const b2Fixture* get_fixture_chassis() const { return fixture_chassis_; }
132  const std::vector<b2Fixture*>& get_fixture_wheels() const { return fixture_wheels_; }
133 
134  void freeOpenGLResources() override
135  {
136  for (auto& sensor : sensors_) sensor->freeOpenGLResources();
137  }
138  void chassisAndWheelsVisible(bool visible);
139 
140  double chassisZMin() const { return chassis_z_min_; }
141  double chassisZMax() const { return chassis_z_max_; }
142 
143  protected:
144  std::map<std::string, std::shared_ptr<CSVLogger>> loggers_;
145  std::string log_path_;
146 
147  virtual void initLoggers();
148  virtual void writeLogStrings();
149  virtual void internalGuiUpdate(
150  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
151  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical, bool childrenOnly) override;
152 
153  protected:
154  // Protected ctor for class factory
155  VehicleBase(World* parent, size_t nWheels);
156 
160  virtual void dynamics_load_params_from_xml(const rapidxml::xml_node<char>* xml_node) = 0;
161 
162  virtual std::vector<double> invoke_motor_controllers(const TSimulContext& context) = 0;
163 
164  virtual void invoke_motor_controllers_post_step([[maybe_unused]] const TSimulContext& context)
165  {
166  }
167 
168  VisualObject* meAsVisualObject() override { return this; }
169 
172  size_t vehicle_index_ = 0;
173 
176 
178 
179  // Chassis info:
180  double chassis_mass_ = 15.0;
181  mrpt::math::TPolygon2D chassis_poly_;
182 
185  double maxRadius_ = 0.1;
186 
187  double chassis_z_min_ = 0.05, chassis_z_max_ = 0.6;
188 
189  mrpt::img::TColor chassis_color_{0xff, 0x00, 0x00};
190 
193  mrpt::math::TPoint2D chassis_com_{0, 0};
194 
196 
201  std::deque<Wheel> wheels_info_;
202 
203  // Box2D elements:
205 
208  std::vector<b2Fixture*> fixture_wheels_;
209 
210  private:
211  // Called from internalGuiUpdate()
213  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
214  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical);
215  // Called from internalGuiUpdate()
216  void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene& scene);
217 
218  mrpt::opengl::CSetOfObjects::Ptr glChassisViz_, glChassisPhysical_;
219  std::vector<mrpt::opengl::CSetOfObjects::Ptr> glWheelsViz_, glWheelsPhysical_;
220  mrpt::opengl::CSetOfLines::Ptr glForces_;
221  mrpt::opengl::CSetOfLines::Ptr glMotorTorques_;
222  std::atomic_bool glInit_ = false;
223 
224  std::vector<mrpt::math::TSegment3D> forceSegmentsForRendering_;
225  std::vector<mrpt::math::TSegment3D> torqueSegmentsForRendering_;
227 
228  public: // data logger header entries
229  static constexpr char DL_TIMESTAMP[] = "Timestamp";
230  static constexpr char LOGGER_POSE[] = "logger_pose";
231  static constexpr char LOGGER_WHEEL[] = "logger_wheel";
232 
233  static constexpr char PL_Q_X[] = "q0x";
234  static constexpr char PL_Q_Y[] = "q1y";
235  static constexpr char PL_Q_Z[] = "q2z";
236  static constexpr char PL_Q_YAW[] = "q3yaw";
237  static constexpr char PL_Q_PITCH[] = "q4pitch";
238  static constexpr char PL_Q_ROLL[] = "q5roll";
239  static constexpr char PL_DQ_X[] = "dqx";
240  static constexpr char PL_DQ_Y[] = "dqy";
241  static constexpr char PL_DQ_Z[] = "dqz";
242 
243  static constexpr char WL_TORQUE[] = "torque";
244  static constexpr char WL_WEIGHT[] = "weight";
245  static constexpr char WL_VEL_X[] = "velocity_x";
246  static constexpr char WL_VEL_Y[] = "velocity_y";
247  static constexpr char WL_FRIC_X[] = "friction_x";
248  static constexpr char WL_FRIC_Y[] = "friction_y";
249 
250  bool isLogging() const;
251 }; // end VehicleBase
252 
253 // Class factory:
256 
257 #define DECLARES_REGISTER_VEHICLE_DYNAMICS(CLASS_NAME) \
258  DECLARES_REGISTER_CLASS1(CLASS_NAME, VehicleBase, World*)
259 
260 #define REGISTER_VEHICLE_DYNAMICS(TEXTUAL_NAME, CLASS_NAME) \
261  REGISTER_CLASS1( \
262  TClassFactory_vehicleDynamics, classFactory_vehicleDynamics, TEXTUAL_NAME, CLASS_NAME)
263 } // namespace mvsim
mvsim::FrictionBasePtr
std::shared_ptr< FrictionBase > FrictionBasePtr
Definition: FrictionBase.h:76
mvsim::VisualObject::parent
World * parent()
Definition: VisualObject.h:51
mvsim::VehicleBase::getLoggerPtr
std::shared_ptr< CSVLogger > getLoggerPtr(std::string logger_name)
Definition: VehicleBase.h:99
mvsim::VehicleBase::getChassisShape
const mrpt::math::TPolygon2D & getChassisShape() const
Definition: VehicleBase.h:106
mvsim
Definition: Client.h:21
mvsim::VehicleBase::glWheelsViz_
std::vector< mrpt::opengl::CSetOfObjects::Ptr > glWheelsViz_
Definition: VehicleBase.h:219
mvsim::VehicleBase::PL_Q_X
static constexpr char PL_Q_X[]
Definition: VehicleBase.h:233
mvsim::VehicleBase::PL_DQ_X
static constexpr char PL_DQ_X[]
Definition: VehicleBase.h:239
mvsim::VehicleBase::setVehicleIndex
void setVehicleIndex(size_t idx)
Definition: VehicleBase.h:109
mvsim::VehicleBase::internal_internalGuiUpdate_sensors
void internal_internalGuiUpdate_sensors(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical)
Definition: VehicleBase.cpp:541
mvsim::VehicleBase::getWheelInfo
Wheel & getWheelInfo(const size_t idx)
Definition: VehicleBase.h:84
mvsim::VehicleBase::getMaxVehicleRadius
virtual float getMaxVehicleRadius() const
Definition: VehicleBase.h:73
mvsim::VehicleBase::get_fixture_wheels
std::vector< b2Fixture * > & get_fixture_wheels()
Definition: VehicleBase.h:130
basic_types.h
mvsim::VehicleBase::clearLogs
void clearLogs()
Definition: VehicleBase.h:116
mvsim::VehicleBase::sensors_
TListSensors sensors_
Sensors aboard.
Definition: VehicleBase.h:177
mvsim::VehicleBase::chassis_z_max_
double chassis_z_max_
Definition: VehicleBase.h:187
mvsim::VehicleBase::maxRadius_
double maxRadius_
Definition: VehicleBase.h:185
mvsim::VehicleBase::fixture_wheels_
std::vector< b2Fixture * > fixture_wheels_
Definition: VehicleBase.h:208
mvsim::VehicleBase::chassis_mass_
double chassis_mass_
Definition: VehicleBase.h:180
mvsim::VehicleBase::freeOpenGLResources
void freeOpenGLResources() override
Definition: VehicleBase.h:134
mvsim::VehicleBase::glChassisPhysical_
mrpt::opengl::CSetOfObjects::Ptr glChassisPhysical_
Definition: VehicleBase.h:218
ControllerBase.h
mvsim::VehicleBase::forceSegmentsForRendering_
std::vector< mrpt::math::TSegment3D > forceSegmentsForRendering_
Definition: VehicleBase.h:224
mvsim::VehicleBase::chassis_color_
mrpt::img::TColor chassis_color_
Definition: VehicleBase.h:189
mvsim::VehicleBase::getSensors
TListSensors & getSensors()
Definition: VehicleBase.h:98
mvsim::VehicleBase::create_multibody_system
virtual void create_multibody_system(b2World &world)
Definition: VehicleBase.cpp:590
mvsim::VehicleBase::PL_Q_Y
static constexpr char PL_Q_Y[]
Definition: VehicleBase.h:234
mvsim::VehicleBase::getVelocityLocalOdoEstimate
virtual mrpt::math::TTwist2D getVelocityLocalOdoEstimate() const =0
mvsim::VehicleBase::getControllerInterface
virtual ControllerBaseInterface * getControllerInterface()=0
mvsim::Client
Definition: Client.h:48
mvsim::VehicleBase::friction_
FrictionBasePtr friction_
Definition: VehicleBase.h:175
mvsim::VehicleBase::WL_FRIC_Y
static constexpr char WL_FRIC_Y[]
Definition: VehicleBase.h:248
mvsim::VehicleBase::PL_Q_PITCH
static constexpr char PL_Q_PITCH[]
Definition: VehicleBase.h:237
mvsim::VehicleBase::internal_internalGuiUpdate_forces
void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene &scene)
Definition: VehicleBase.cpp:548
mvsim::VehicleBase::setRecording
void setRecording(bool record)
Definition: VehicleBase.h:112
b2Body
A rigid body. These are created via b2World::CreateBody.
Definition: b2_body.h:128
mvsim::VehicleBase::getWheelsVelocityLocal
std::vector< mrpt::math::TVector2D > getWheelsVelocityLocal(const mrpt::math::TTwist2D &veh_vel_local) const
Definition: VehicleBase.cpp:518
mvsim::VehicleBase::wheels_info_
std::deque< Wheel > wheels_info_
Definition: VehicleBase.h:201
mvsim::VehicleBase::initLoggers
virtual void initLoggers()
Definition: VehicleBase.cpp:780
mvsim::VehicleBase::chassisZMax
double chassisZMax() const
Definition: VehicleBase.h:141
mvsim::VehicleBase::PL_Q_Z
static constexpr char PL_Q_Z[]
Definition: VehicleBase.h:235
mvsim::VehicleBase::forceSegmentsForRenderingMtx_
std::mutex forceSegmentsForRenderingMtx_
Definition: VehicleBase.h:226
mvsim::classFactory_vehicleDynamics
TClassFactory_vehicleDynamics classFactory_vehicleDynamics
Definition: VehicleBase.cpp:37
mvsim::VehicleBase::WL_FRIC_X
static constexpr char WL_FRIC_X[]
Definition: VehicleBase.h:247
mvsim::VehicleBase::DL_TIMESTAMP
static constexpr char DL_TIMESTAMP[]
Definition: VehicleBase.h:229
mvsim::VehicleBase::glWheelsPhysical_
std::vector< mrpt::opengl::CSetOfObjects::Ptr > glWheelsPhysical_
Definition: VehicleBase.h:219
mvsim::VehicleBase::LOGGER_WHEEL
static constexpr char LOGGER_WHEEL[]
Definition: VehicleBase.h:231
mvsim::VehicleBase::getVehicleIndex
size_t getVehicleIndex() const
Definition: VehicleBase.h:111
mvsim::VehicleBase::apply_force
virtual void apply_force(const mrpt::math::TVector2D &force, const mrpt::math::TPoint2D &applyPoint=mrpt::math::TPoint2D(0, 0)) override
Definition: VehicleBase.cpp:802
mvsim::VehicleBase::get_fixture_chassis
const b2Fixture * get_fixture_chassis() const
Definition: VehicleBase.h:131
mvsim::VehicleBase::registerOnServer
void registerOnServer(mvsim::Client &c) override
Definition: VehicleBase.cpp:811
mvsim::VehicleBase::glForces_
mrpt::opengl::CSetOfLines::Ptr glForces_
Definition: VehicleBase.h:220
mvsim::VehicleBase::internalGuiUpdate
virtual void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, bool childrenOnly) override
Definition: VehicleBase.cpp:666
Simulable.h
mvsim::Wheel
Definition: Wheel.h:33
mvsim::TSimulContext
Definition: basic_types.h:58
mvsim::VehicleBase::dynamics_load_params_from_xml
virtual void dynamics_load_params_from_xml(const rapidxml::xml_node< char > *xml_node)=0
mvsim::VehicleBase::writeLogStrings
virtual void writeLogStrings()
Definition: VehicleBase.cpp:793
mvsim::VehicleBase::chassisZMin
double chassisZMin() const
Definition: VehicleBase.h:140
mvsim::VehicleBase::invoke_motor_controllers_post_step
virtual void invoke_motor_controllers_post_step([[maybe_unused]] const TSimulContext &context)
Definition: VehicleBase.h:164
mvsim::VehicleBase::getBox2DChassisBody
b2Body * getBox2DChassisBody()
Definition: VehicleBase.h:76
mvsim::VehicleBase::torqueSegmentsForRendering_
std::vector< mrpt::math::TSegment3D > torqueSegmentsForRendering_
Definition: VehicleBase.h:225
b2Fixture
Definition: b2_fixture.h:116
mvsim::VehicleBase::LOGGER_POSE
static constexpr char LOGGER_POSE[]
Definition: VehicleBase.h:230
mvsim::VehicleBase::WL_VEL_X
static constexpr char WL_VEL_X[]
Definition: VehicleBase.h:245
mvsim::VehicleBase::get_fixture_chassis
b2Fixture * get_fixture_chassis()
Definition: VehicleBase.h:129
mvsim::VehicleBase::invoke_motor_controllers
virtual std::vector< double > invoke_motor_controllers(const TSimulContext &context)=0
mvsim::VehicleBase::getSensors
const TListSensors & getSensors() const
Definition: VehicleBase.h:97
mvsim::VehicleBase::log_path_
std::string log_path_
Definition: VehicleBase.h:145
mvsim::VehicleBase::glInit_
std::atomic_bool glInit_
Definition: VehicleBase.h:222
mvsim::Simulable::Ptr
std::shared_ptr< Simulable > Ptr
Definition: Simulable.h:42
b2_world.h
mvsim::VehicleBase::meAsVisualObject
VisualObject * meAsVisualObject() override
Definition: VehicleBase.h:168
mvsim::VehicleBase::PL_Q_YAW
static constexpr char PL_Q_YAW[]
Definition: VehicleBase.h:236
mvsim::VehicleBase::PL_DQ_Y
static constexpr char PL_DQ_Y[]
Definition: VehicleBase.h:240
b2_fixture.h
mvsim::VehicleBase::simul_pre_timestep
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: VehicleBase.cpp:360
mvsim::World
Definition: World.h:82
mvsim::VehicleBase::getChassisMass
virtual double getChassisMass() const
Definition: VehicleBase.h:75
mvsim::VehicleBase::getWheelInfo
const Wheel & getWheelInfo(const size_t idx) const
Definition: VehicleBase.h:83
mvsim::VehicleBase::getNumWheels
size_t getNumWheels() const
Definition: VehicleBase.h:82
mvsim::VehicleBase
Definition: VehicleBase.h:44
rapidxml::xml_node< char >
mvsim::VehicleBase::register_vehicle_class
static void register_vehicle_class(const World &parent, const rapidxml::xml_node< char > *xml_node)
Definition: VehicleBase.cpp:96
mvsim::TClassFactory_vehicleDynamics
ClassFactory< VehicleBase, World * > TClassFactory_vehicleDynamics
Definition: VehicleBase.h:254
mvsim::ControllerBaseInterface
Definition: ControllerBase.h:22
mvsim::VehicleBase::loggers_
std::map< std::string, std::shared_ptr< CSVLogger > > loggers_
Definition: VehicleBase.h:144
mvsim::Simulable
Definition: Simulable.h:39
mvsim::VehicleBase::VehicleBase
VehicleBase(World *parent, size_t nWheels)
Definition: VehicleBase.cpp:78
mvsim::VehicleBase::chassis_poly_
mrpt::math::TPolygon2D chassis_poly_
Definition: VehicleBase.h:181
Wheel.h
mvsim::VehicleBase::glChassisViz_
mrpt::opengl::CSetOfObjects::Ptr glChassisViz_
Definition: VehicleBase.h:218
mvsim::VehicleBase::get_fixture_wheels
const std::vector< b2Fixture * > & get_fixture_wheels() const
Definition: VehicleBase.h:132
mvsim::VehicleBase::PL_Q_ROLL
static constexpr char PL_Q_ROLL[]
Definition: VehicleBase.h:238
CsvLogger.h
mvsim::VehicleBase::WL_TORQUE
static constexpr char WL_TORQUE[]
Definition: VehicleBase.h:243
mvsim::VehicleBase::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: VehicleBase.cpp:466
mvsim::VehicleBase::fixture_chassis_
b2Fixture * fixture_chassis_
Created at.
Definition: VehicleBase.h:204
mvsim::VehicleBase::isLogging
bool isLogging() const
Definition: VehicleBase.cpp:569
b2World
Definition: b2_world.h:46
mvsim::VehicleBase::newLogSession
void newLogSession()
Definition: VehicleBase.h:120
mvsim::ClassFactory
Definition: ClassFactory.h:25
mvsim::VehicleBase::PL_DQ_Z
static constexpr char PL_DQ_Z[]
Definition: VehicleBase.h:241
mvsim::VehicleBase::vehicle_index_
size_t vehicle_index_
Definition: VehicleBase.h:172
mvsim::VehicleBase::chassisAndWheelsVisible
void chassisAndWheelsVisible(bool visible)
Definition: VehicleBase.cpp:818
VisualObject.h
mvsim::VehicleBase::chassis_com_
mrpt::math::TPoint2D chassis_com_
Definition: VehicleBase.h:193
mvsim::VehicleBase::WL_VEL_Y
static constexpr char WL_VEL_Y[]
Definition: VehicleBase.h:246
mvsim::VehicleBase::chassis_z_min_
double chassis_z_min_
Definition: VehicleBase.h:187
b2_polygon_shape.h
mvsim::VehicleBase::glMotorTorques_
mrpt::opengl::CSetOfLines::Ptr glMotorTorques_
Definition: VehicleBase.h:221
mvsim::VehicleBase::factory
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node)
Definition: VehicleBase.cpp:118
mvsim::VisualObject
Definition: VisualObject.h:35
SensorBase.h
ClassFactory.h
mvsim::TListSensors
std::vector< SensorBase::Ptr > TListSensors
Definition: SensorBase.h:113
mvsim::VehicleBase::updateMaxRadiusFromPoly
void updateMaxRadiusFromPoly()
Definition: VehicleBase.cpp:577
mvsim::VehicleBase::WL_WEIGHT
static constexpr char WL_WEIGHT[]
Definition: VehicleBase.h:244
b2_body.h
FrictionBase.h


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